diff --git a/build.gradle b/build.gradle index 4a6f9a15..76c24419 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.5-SNAPSHOT' + id 'fabric-loom' version '0.7-SNAPSHOT' id 'maven-publish' } @@ -15,21 +15,24 @@ repositories { maven { url "http://server.bbkr.space:8081/artifactory/libs-release/" } maven { url "https://maven.fabricmc.net/" } maven { url 'https://maven.blamejared.com' } + maven { url "https://maven.shedaniel.me/" } maven { url 'https://jitpack.io' } jcenter() } +apply plugin: 'maven' + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.minecraft_version}+build.${project.yarn_mappings}:v2" + mappings minecraft.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useApi "vazkii.patchouli:Patchouli:${project.minecraft_version}-${project.patchouli_version}" + useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" - useOptional "grondag:canvas-mc116:${project.canvas_version}" + //useOptional "grondag:canvas-mc116:${project.canvas_version}" } def useOptional(String dep) { diff --git a/gradle.properties b/gradle.properties index 040e416b..9abb7905 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,18 +3,18 @@ # Fabric Properties # check these on https://fabricmc.net/use - minecraft_version=1.16.4 - yarn_mappings=7 - loader_version=0.10.8 + minecraft_version=1.16.5 + yarn_mappings=6 + loader_version=0.11.3 # Mod Properties - mod_version = 0.8.3-beta + mod_version = 0.9.4-pre maven_group = ru.betterend archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api - patchouli_version = 48-FABRIC - fabric_version = 0.27.1+1.16 + patchouli_version = 50-FABRIC + fabric_version = 0.32.9+1.16 canvas_version = 1.0.+ - rei_version = 5.8.7 \ No newline at end of file + rei_version = 5.8.10 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 99c200fc..a760d0e7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/psd/aeternium.psd b/psd/aeternium.psd deleted file mode 100644 index 155c2ccd..00000000 Binary files a/psd/aeternium.psd and /dev/null differ diff --git a/psd/armor_items.psd b/psd/armor_items.psd deleted file mode 100644 index 1e780511..00000000 Binary files a/psd/armor_items.psd and /dev/null differ diff --git a/psd/armor_models.psd b/psd/armor_models.psd deleted file mode 100644 index 9261dca5..00000000 Binary files a/psd/armor_models.psd and /dev/null differ diff --git a/psd/end_portal.psd b/psd/end_portal.psd deleted file mode 100644 index 5b167003..00000000 Binary files a/psd/end_portal.psd and /dev/null differ diff --git a/psd/end_stone_smelter.psd b/psd/end_stone_smelter.psd deleted file mode 100644 index 884266ae..00000000 Binary files a/psd/end_stone_smelter.psd and /dev/null differ diff --git a/psd/end_stone_smelter_on.psd b/psd/end_stone_smelter_on.psd deleted file mode 100644 index 8bec3355..00000000 Binary files a/psd/end_stone_smelter_on.psd and /dev/null differ diff --git a/psd/ender_block.psd b/psd/ender_block.psd deleted file mode 100644 index 060545f3..00000000 Binary files a/psd/ender_block.psd and /dev/null differ diff --git a/psd/ender_dust.psd b/psd/ender_dust.psd deleted file mode 100644 index 10854f8b..00000000 Binary files a/psd/ender_dust.psd and /dev/null differ diff --git a/psd/ender_ore.psd b/psd/ender_ore.psd deleted file mode 100644 index 49e8c9d1..00000000 Binary files a/psd/ender_ore.psd and /dev/null differ diff --git a/psd/ender_vision.psd b/psd/ender_vision.psd deleted file mode 100644 index df47502a..00000000 Binary files a/psd/ender_vision.psd and /dev/null differ diff --git a/psd/flavolite_runed.psd b/psd/flavolite_runed.psd deleted file mode 100644 index fca3f7d4..00000000 Binary files a/psd/flavolite_runed.psd and /dev/null differ diff --git a/psd/infusion_pedestal.psd b/psd/infusion_pedestal.psd deleted file mode 100644 index c42ca618..00000000 Binary files a/psd/infusion_pedestal.psd and /dev/null differ diff --git a/psd/smelter_gui.psd b/psd/smelter_gui.psd deleted file mode 100644 index 005f83bc..00000000 Binary files a/psd/smelter_gui.psd and /dev/null differ diff --git a/psd/stones_pillar.psd b/psd/stones_pillar.psd deleted file mode 100644 index e8576740..00000000 Binary files a/psd/stones_pillar.psd and /dev/null differ diff --git a/psd/terminite_block.psd b/psd/terminite_block.psd deleted file mode 100644 index ff3ce1f3..00000000 Binary files a/psd/terminite_block.psd and /dev/null differ diff --git a/psd/terminite_ingot.psd b/psd/terminite_ingot.psd deleted file mode 100644 index 94e24815..00000000 Binary files a/psd/terminite_ingot.psd and /dev/null differ diff --git a/psd/tool_items.psd b/psd/tool_items.psd deleted file mode 100644 index 036b30d2..00000000 Binary files a/psd/tool_items.psd and /dev/null differ diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index fa86270b..5ee920a1 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,14 +3,17 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndPotions; +import ru.betterend.events.PlayerAdvancementsEvents; import ru.betterend.integration.Integrations; -import ru.betterend.item.GuideBook; +import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.AlloyingRecipes; +import ru.betterend.recipe.AnvilRecipes; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.FurnaceRecipes; import ru.betterend.recipe.InfusionRecipes; @@ -21,11 +24,16 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BonemealUtil; +import ru.betterend.util.DataFixerUtil; import ru.betterend.util.Logger; +import ru.betterend.util.LootTableUtil; import ru.betterend.world.generator.BetterEndBiomeSource; +import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { @@ -33,6 +41,7 @@ public class BetterEnd implements ModInitializer { public static final Logger LOGGER = Logger.get(); @Override public void onInitialize() { + EndPortals.loadPortals(); EndSounds.register(); EndItems.register(); EndBlocks.register(); @@ -48,25 +57,39 @@ public class BetterEnd implements ModInitializer { CraftingRecipes.register(); FurnaceRecipes.register(); AlloyingRecipes.register(); + AnvilRecipes.register(); SmithingRecipes.register(); InfusionRecipes.register(); EndStructures.register(); Integrations.register(); + BonemealUtil.init(); + GeneratorOptions.init(); + DataFixerUtil.init(); + LootTableUtil.init(); if (hasGuideBook()) { - GuideBook.register(); + GuideBookItem.register(); } FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Configs.saveConfigs(); + + if (hasGuideBook()) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.register((player, advancement, criterionName) -> { + ResourceLocation advId = new ResourceLocation("minecraft:end/enter_end_gateway"); + if (advId.equals(advancement.getId())) { + player.addItem(new ItemStack(GuideBookItem.GUIDE_BOOK)); + } + }); + } } public static boolean hasGuideBook() { return FabricLoader.getInstance().isModLoaded("patchouli"); } - public static Identifier makeID(String path) { - return new Identifier(MOD_ID, path); + public static ResourceLocation makeID(String path) { + return new ResourceLocation(MOD_ID, path); } public static String getStringId(String id) { diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java new file mode 100644 index 00000000..5ce6eb48 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -0,0 +1,35 @@ +package ru.betterend.blocks; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.item.material.EndToolMaterial; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlocks; + +public class AeterniumAnvil extends EndAnvilBlock { + private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; + + public AeterniumAnvil() { + super(EndBlocks.AETERNIUM_BLOCK.defaultMaterialColor(), EndToolMaterial.AETERNIUM.getLevel()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(DESTRUCTION); + builder.add(FACING); + } + + @Override + public IntegerProperty getDestructionProperty() { + return DESTRUCTION; + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_ANVIL_LONG; + } +} diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index e5e11578..a8d98b32 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -3,26 +3,26 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; public class AeterniumBlock extends BlockBase { public AeterniumBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.GRAY) + super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY) .hardness(65F) .resistance(1200F) - .requiresTool() - .sounds(BlockSoundGroup.NETHERITE)); + .requiresCorrectToolForDrops() + .sound(SoundType.NETHERITE_BLOCK)); } @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { + public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF657A7A; } } diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java similarity index 51% rename from src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java rename to src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java index 16a209df..173134db 100644 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; -public class BlockMossyGlowshroomHymenophore extends BlockBase { - public BlockMossyGlowshroomHymenophore() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); +public class AmaranitaCapBlock extends BlockBase { + public AmaranitaCapBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); } } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java new file mode 100644 index 00000000..9aa743c7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java @@ -0,0 +1,20 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class AmaranitaHymenophoreBlock extends BlockBase implements IRenderTypeable { + public AmaranitaHymenophoreBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java new file mode 100644 index 00000000..2aa563ae --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -0,0 +1,12 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.EndPillarBlock; + +public class AmaranitaStemBlock extends EndPillarBlock { + public AmaranitaStemBlock() { + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockAmber.java b/src/main/java/ru/betterend/blocks/AmberBlock.java similarity index 50% rename from src/main/java/ru/betterend/blocks/BlockAmber.java rename to src/main/java/ru/betterend/blocks/AmberBlock.java index a55fadb3..6dbef462 100644 --- a/src/main/java/ru/betterend/blocks/BlockAmber.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; -public class BlockAmber extends BlockBase { - public BlockAmber() { - super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.YELLOW)); +public class AmberBlock extends BlockBase { + public AmberBlock() { + super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java new file mode 100644 index 00000000..7097ee98 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndParticles; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class AncientEmeraldIceBlock extends BlockBase { + public AncientEmeraldIceBlock() { + super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + Direction dir = BlocksHelper.randomDirection(random); + + if (random.nextBoolean()) { + int x = MHelper.randRange(-2, 2, random); + int y = MHelper.randRange(-2, 2, random); + int z = MHelper.randRange(-2, 2, random); + BlockPos p = pos.offset(x, y, z); + if (world.getBlockState(p).is(Blocks.WATER)) { + world.setBlockAndUpdate(p, EndBlocks.EMERALD_ICE.defaultBlockState()); + makeParticles(world, p, random); + } + } + + pos = pos.relative(dir); + state = world.getBlockState(pos); + if (state.is(Blocks.WATER)) { + world.setBlockAndUpdate(pos, EndBlocks.EMERALD_ICE.defaultBlockState()); + makeParticles(world, pos, random); + } + else if (state.is(EndBlocks.EMERALD_ICE)) { + world.setBlockAndUpdate(pos, EndBlocks.DENSE_EMERALD_ICE.defaultBlockState()); + makeParticles(world, pos, random); + } + } + + private void makeParticles(ServerLevel world, BlockPos pos, Random random) { + world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index ba5edf0c..99c12928 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -6,23 +6,24 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractGlassBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.AbstractGlassBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTypeable, IColorProvider { @@ -33,16 +34,17 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp public AuroraCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) .breakByTool(FabricToolTags.PICKAXES) - .suffocates((state, world, pos) -> { return false; }) + .breakByTool(EndTags.HAMMERS) .hardness(1F) .resistance(1F) - .sounds(BlockSoundGroup.GLASS) .luminance(15) - .nonOpaque()); + .noOcclusion() + .isSuffocating((state, world, pos) -> false) + .sound(SoundType.GLASS)); } @Override - public BlockColorProvider getProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -54,16 +56,16 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); return MHelper.color(r, g, b); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); }; @@ -75,18 +77,18 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { int count = 0; - int enchant = EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool); + int enchant = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool); if (enchant > 0) { return Lists.newArrayList(new ItemStack(this)); } - enchant = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + enchant = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (enchant > 0) { - int min = MathHelper.clamp(MIN_DROP + enchant, MIN_DROP, MAX_DROP); - int max = MAX_DROP + (enchant / Enchantments.FORTUNE.getMaxLevel()); + int min = Mth.clamp(MIN_DROP + enchant, MIN_DROP, MAX_DROP); + int max = MAX_DROP + (enchant / Enchantments.BLOCK_FORTUNE.getMaxLevel()); if (min == max) { return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, max)); } diff --git a/src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java b/src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java deleted file mode 100644 index 4cf5d63b..00000000 --- a/src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndParticles; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockAncientEmeraldIce extends BlockBase { - public BlockAncientEmeraldIce() { - super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).ticksRandomly()); - } - - @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - Direction dir = BlocksHelper.randomDirection(random); - - if (random.nextBoolean()) { - int x = MHelper.randRange(-2, 2, random); - int y = MHelper.randRange(-2, 2, random); - int z = MHelper.randRange(-2, 2, random); - BlockPos p = pos.add(x, y, z); - if (world.getBlockState(p).isOf(Blocks.WATER)) { - world.setBlockState(p, EndBlocks.EMERALD_ICE.getDefaultState()); - makeParticles(world, p, random); - } - } - - pos = pos.offset(dir); - state = world.getBlockState(pos); - if (state.isOf(Blocks.WATER)) { - world.setBlockState(pos, EndBlocks.EMERALD_ICE.getDefaultState()); - makeParticles(world, pos, random); - } - else if (state.isOf(EndBlocks.EMERALD_ICE)) { - world.setBlockState(pos, EndBlocks.DENSE_EMERALD_ICE.getDefaultState()); - makeParticles(world, pos, random); - } - } - - private void makeParticles(ServerWorld world, BlockPos pos, Random random) { - world.spawnParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVine.java b/src/main/java/ru/betterend/blocks/BlockBlueVine.java deleted file mode 100644 index 18512735..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBlueVine.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUpDownPlant; -import ru.betterend.registry.EndBlocks; - -public class BlockBlueVine extends BlockUpDownPlant { - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java b/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java deleted file mode 100644 index fc183bf0..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java +++ /dev/null @@ -1,46 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.registry.EndBlocks; - -public class BlockBlueVineLantern extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); - - public BlockBlueVineLantern() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); - this.setDefaultState(this.stateManager.getDefaultState().with(NATURAL, false)); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.get(NATURAL) ? world.getBlockState(pos.down()).getBlock() == EndBlocks.BLUE_VINE : true; - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(NATURAL); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java b/src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java deleted file mode 100644 index 6b99ee18..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockBlueVineSeed extends BlockPlantWithAge { - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { - int height = MHelper.randRange(2, 5, random); - int h = BlocksHelper.upRay(world, pos, height + 2); - if (h < height + 1) { - return; - } - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); - for (int i = 1; i < height; i++) { - BlocksHelper.setWithoutUpdate(world, pos.up(i), EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - } - BlocksHelper.setWithoutUpdate(world, pos.up(height), EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - placeLantern(world, pos.up(height + 1)); - } - - private void placeLantern(StructureWorldAccess world, BlockPos pos) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.getDefaultState().with(BlockBlueVineLantern.NATURAL, true)); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlockPos p = pos.offset(dir); - if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.getDefaultState().with(BlockFur.FACING, dir)); - } - } - if (world.isAir(pos.up())) { - BlocksHelper.setWithoutUpdate(world, pos.up(), EndBlocks.BLUE_VINE_FUR.getDefaultState().with(BlockFur.FACING, Direction.UP)); - } - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBrimstone.java b/src/main/java/ru/betterend/blocks/BlockBrimstone.java deleted file mode 100644 index 7cbc9008..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBrimstone.java +++ /dev/null @@ -1,69 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.fluid.Fluids; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockBrimstone extends BlockBase { - public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - - public BlockBrimstone() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.BROWN).ticksRandomly()); - setDefaultState(stateManager.getDefaultState().with(ACTIVATED, false)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(ACTIVATED); - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - boolean deactivate = true; - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getFluidState(pos.offset(dir)).getFluid().equals(Fluids.WATER)) { - deactivate = false; - break; - } - } - if (state.get(ACTIVATED)) { - if (deactivate) { - world.setBlockState(pos, getDefaultState().with(ACTIVATED, false)); - } - else if (state.get(ACTIVATED) && random.nextInt(16) == 0) { - Direction dir = BlocksHelper.randomDirection(random); - BlockPos side = pos.offset(dir); - BlockState sideState = world.getBlockState(side); - if (sideState.getBlock() instanceof BlockSulphurCrystal) { - if (sideState.get(BlockSulphurCrystal.AGE) < 2 && sideState.get(BlockSulphurCrystal.WATERLOGGED)) { - int age = sideState.get(BlockSulphurCrystal.AGE) + 1; - world.setBlockState(side, sideState.with(BlockSulphurCrystal.AGE, age)); - } - } - else if (sideState.getFluidState().getFluid() == Fluids.WATER) { - BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.AGE, 0); - world.setBlockState(side, crystal); - } - } - } - else if (!deactivate && !state.get(ACTIVATED)) { - world.setBlockState(pos, getDefaultState().with(ACTIVATED, true)); - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBubbleCoral.java b/src/main/java/ru/betterend/blocks/BlockBubbleCoral.java deleted file mode 100644 index f2bff154..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBubbleCoral.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; - -public class BlockBubbleCoral extends BlockUnderwaterPlant { - private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 14, 16); - - public BlockBubbleCoral() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.CORAL) - .breakByHand(true) - .noCollision()); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; - } - - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - double x = pos.getX() + random.nextDouble(); - double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; - double z = pos.getZ() + random.nextDouble(); - world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return false; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return false; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBulbVine.java b/src/main/java/ru/betterend/blocks/BlockBulbVine.java deleted file mode 100644 index 5f17366f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBulbVine.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.betterend.blocks; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockVine; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; - -public class BlockBulbVine extends BlockVine { - public BlockBulbVine() { - super(15, true); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.BOTTOM) { - return Lists.newArrayList(new ItemStack(EndItems.GLOWING_BULB)); - } - else if (MHelper.RANDOM.nextInt(8) == 0) { - return Lists.newArrayList(new ItemStack(EndBlocks.BULB_VINE_SEED)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return false; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - boolean canPlace = super.canPlaceAt(state, world, pos); - return (state.isOf(this) && state.get(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState(pos.down()).isOf(this); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java b/src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java deleted file mode 100644 index c1b265e5..00000000 --- a/src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; - -public class BlockBulbVineSeed extends BlockPlantWithAge { - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState up = world.getBlockState(pos.up()); - return up.isIn(EndTags.GEN_TERRAIN) || up.isIn(BlockTags.LOGS) || up.isIn(BlockTags.LEAVES); - } - - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { - int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; - if (h > 2) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, pos.down(i), EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - } - BlocksHelper.setWithoutUpdate(world, pos.down(h), EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockCharnia.java b/src/main/java/ru/betterend/blocks/BlockCharnia.java deleted file mode 100644 index 044a506e..00000000 --- a/src/main/java/ru/betterend/blocks/BlockCharnia.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; - -public class BlockCharnia extends BlockUnderwaterPlant { - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return sideCoversSmallSquare(world, pos.down(), Direction.UP) && world.getFluidState(pos).getFluid() == Fluids.WATER; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java b/src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java deleted file mode 100644 index f2232a99..00000000 --- a/src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; - -public class BlockDenseEmeraldIce extends BlockBase implements IRenderTypeable { - public BlockDenseEmeraldIce() { - super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.TRANSLUCENT; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockDenseSnow.java b/src/main/java/ru/betterend/blocks/BlockDenseSnow.java deleted file mode 100644 index 5ea8e7a0..00000000 --- a/src/main/java/ru/betterend/blocks/BlockDenseSnow.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; - -public class BlockDenseSnow extends BlockBase { - public BlockDenseSnow() { - super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(BlockSoundGroup.SNOW)); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java b/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java deleted file mode 100644 index fe2d405c..00000000 --- a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BlockDragonTreeSapling extends BlockFeatureSapling { - public BlockDragonTreeSapling() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.DRAGON_TREE.getFeature(); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.SHADOW_GRASS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEmeraldIce.java b/src/main/java/ru/betterend/blocks/BlockEmeraldIce.java deleted file mode 100644 index 3e67efbd..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEmeraldIce.java +++ /dev/null @@ -1,98 +0,0 @@ -package ru.betterend.blocks; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.TransparentBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.LightType; -import net.minecraft.world.World; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockEmeraldIce extends TransparentBlock implements IRenderTypeable, BlockPatterned { - public BlockEmeraldIce() { - super(FabricBlockSettings.copyOf(Blocks.ICE)); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.TRANSLUCENT; - } - - @Override - public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { - super.afterBreak(world, player, pos, state, blockEntity, stack); - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, stack) == 0) { - if (world.getDimension().isUltrawarm()) { - world.removeBlock(pos, false); - return; - } - - Material material = world.getBlockState(pos.down()).getMaterial(); - if (material.blocksMovement() || material.isLiquid()) { - world.setBlockState(pos, Blocks.WATER.getDefaultState()); - } - } - - } - - @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (world.getLightLevel(LightType.BLOCK, pos) > 11 - state.getOpacity(world, pos)) { - this.melt(state, world, pos); - } - - } - - protected void melt(BlockState state, World world, BlockPos pos) { - if (world.getDimension().isUltrawarm()) { - world.removeBlock(pos, false); - } - else { - world.setBlockState(pos, Blocks.WATER.getDefaultState()); - world.updateNeighbor(pos, Blocks.WATER, pos); - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLily.java b/src/main/java/ru/betterend/blocks/BlockEndLily.java deleted file mode 100644 index 5b78d7ef..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLily.java +++ /dev/null @@ -1,118 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; - -public class BlockEndLily extends BlockUnderwaterPlant { - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(2, 0, 2, 14, 6, 14); - - public BlockEndLily() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .luminance((state) -> { return state.get(SHAPE) == TripleShape.TOP ? 13 : 0; }) - .noCollision()); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return state.get(SHAPE) == TripleShape.TOP ? Blocks.AIR.getDefaultState() : Blocks.WATER.getDefaultState(); - } - else { - return state; - } - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - VoxelShape shape = state.get(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; - return shape.offset(vec3d.x, vec3d.y, vec3d.z); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - public FluidState getFluidState(BlockState state) { - return state.get(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.getDefaultState() : Fluids.WATER.getStill(false); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - if (state.get(SHAPE) == TripleShape.TOP) { - return world.getBlockState(pos.down()).getBlock() == this; - } - else if (state.get(SHAPE) == TripleShape.BOTTOM) { - return isTerrain(world.getBlockState(pos.down())); - } - else { - BlockState up = world.getBlockState(pos.up()); - BlockState down = world.getBlockState(pos.down()); - return up.getBlock() == this && down.getBlock() == this; - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.TOP) { - return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); - } - return Collections.emptyList(); - } - - @Override - @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { - return new ItemStack(EndBlocks.END_LILY_SEED); - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return false; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return false; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLilySeed.java b/src/main/java/ru/betterend/blocks/BlockEndLilySeed.java deleted file mode 100644 index 6eb44873..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLilySeed.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockEndLilySeed extends BlockUnderwaterPlantWithAge { - @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { - if (canGrow(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.BOTTOM)); - BlockPos up = pos.up(); - while (world.getFluidState(up).isStill()) { - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.MIDDLE)); - up = up.up(); - } - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.TOP)); - } - } - - private boolean canGrow(StructureWorldAccess world, BlockPos pos) { - BlockPos up = pos.up(); - while (world.getBlockState(up).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { - up = up.up(); - } - return world.isAir(up); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java b/src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java deleted file mode 100644 index b2680baf..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.betterend.blocks; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.MHelper; - -public class BlockEndLotusFlower extends BlockPlant { - private static final VoxelShape SHAPE_OUTLINE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - private static final VoxelShape SHAPE_COLLISION = Block.createCuboidShape(0, 0, 0, 16, 2, 16); - - public BlockEndLotusFlower() { - super(FabricBlockSettings.of(Material.PLANT).nonOpaque().luminance(15)); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_LOTUS_STEM); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE_OUTLINE; - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE_COLLISION; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - int count = MHelper.randRange(1, 2, MHelper.RANDOM); - return Lists.newArrayList(new ItemStack(EndBlocks.END_LOTUS_SEED, count)); - } - - @Override - @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { - return new ItemStack(EndBlocks.END_LOTUS_SEED); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java b/src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java deleted file mode 100644 index 3ec3bcef..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java +++ /dev/null @@ -1,75 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.fluid.WaterFluid; -import net.minecraft.item.ItemStack; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockEndLotusLeaf extends BlockBaseNotFull implements IRenderTypeable { - public static final EnumProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING; - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape VSHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - - public BlockEndLotusLeaf() { - super(FabricBlockSettings.of(Material.PLANT).nonOpaque().sounds(BlockSoundGroup.WET_GRASS)); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - return !down.getFluidState().isEmpty() && down.getFluidState().getFluid() instanceof WaterFluid; - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(SHAPE, HORIZONTAL_FACING); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return VSHAPE; - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { - return new ItemStack(EndBlocks.END_LOTUS_SEED); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java b/src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java deleted file mode 100644 index 31fe5b20..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java +++ /dev/null @@ -1,118 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { - @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { - if (canGrow(world, pos)) { - BlockState startLeaf = EndBlocks.END_LOTUS_STEM.getDefaultState().with(BlockEndLotusStem.LEAF, true); - BlockState roots = EndBlocks.END_LOTUS_STEM.getDefaultState().with(BlockEndLotusStem.SHAPE, TripleShape.BOTTOM).with(BlockEndLotusStem.WATERLOGGED, true); - BlockState stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); - BlockState flower = EndBlocks.END_LOTUS_FLOWER.getDefaultState(); - - BlocksHelper.setWithoutUpdate(world, pos, roots); - Mutable bpos = new Mutable().set(pos); - bpos.setY(bpos.getY() + 1); - while (world.getFluidState(bpos).isStill()) { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.WATERLOGGED, true)); - bpos.setY(bpos.getY() + 1); - } - - int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; - TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; - Direction dir = BlocksHelper.randomHorizontal(random); - BlockPos leafCenter = bpos.toImmutable().offset(dir); - if (hasLeaf(world, leafCenter)) { - generateLeaf(world, leafCenter); - BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.with(BlockEndLotusStem.SHAPE, shape).with(BlockEndLotusStem.FACING, dir)); - } - else { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, shape)); - } - - bpos.setY(bpos.getY() + 1); - for (int i = 1; i <= height; i++) { - if (!world.isAir(bpos)) { - bpos.setY(bpos.getY() - 1); - BlocksHelper.setWithoutUpdate(world, bpos, flower); - bpos.setY(bpos.getY() - 1); - stem = world.getBlockState(bpos); - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, TripleShape.TOP)); - return; - } - BlocksHelper.setWithoutUpdate(world, bpos, stem); - bpos.setY(bpos.getY() + 1); - } - - if (!world.isAir(bpos) || height < 0) { - bpos.setY(bpos.getY() - 1); - } - - BlocksHelper.setWithoutUpdate(world, bpos, flower); - bpos.setY(bpos.getY() - 1); - stem = world.getBlockState(bpos); - if (!stem.isOf(EndBlocks.END_LOTUS_STEM)) { - stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); - if (!world.getBlockState(bpos.north()).getFluidState().isEmpty()) { - stem = stem.with(BlockEndLotusStem.WATERLOGGED, true); - } - } - - if (world.getBlockState(bpos.offset(dir)).isOf(EndBlocks.END_LOTUS_LEAF)) { - stem = stem.with(BlockEndLotusStem.LEAF, true).with(BlockEndLotusStem.FACING, dir); - } - - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, TripleShape.TOP)); - } - } - - private boolean canGrow(StructureWorldAccess world, BlockPos pos) { - Mutable bpos = new Mutable(); - bpos.set(pos); - while (world.getBlockState(bpos).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { - bpos.setY(bpos.getY() + 1); - } - return world.isAir(bpos) && world.isAir(bpos.up()); - } - - private void generateLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); - BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(BlockEndLotusLeaf.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, move).with(BlockEndLotusLeaf.SHAPE, TripleShape.MIDDLE)); - } - for (int i = 0; i < 4; i ++) { - Direction d1 = BlocksHelper.HORIZONTAL[i]; - Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, d1).with(BlockEndLotusLeaf.SHAPE, TripleShape.TOP)); - } - } - - private boolean hasLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); - p.setY(pos.getY()); - int count = 0; - for (int x = -1; x < 2; x ++) { - p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { - p.setZ(pos.getZ() + z); - if (world.isAir(p) && !world.getFluidState(p.down()).isEmpty()) - count ++; - } - } - return count == 9; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusStem.java b/src/main/java/ru/betterend/blocks/BlockEndLotusStem.java deleted file mode 100644 index ec17e2f0..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusStem.java +++ /dev/null @@ -1,96 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Map; - -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Direction.Axis; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.util.BlocksHelper; - -public class BlockEndLotusStem extends BlockBase implements Waterloggable, IRenderTypeable { - public static final EnumProperty FACING = Properties.FACING; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final BooleanProperty LEAF = BooleanProperty.of("leaf"); - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final Map SHAPES = Maps.newEnumMap(Axis.class); - - public BlockEndLotusStem() { - super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); - this.setDefaultState(getDefaultState().with(WATERLOGGED, false).with(SHAPE, TripleShape.MIDDLE).with(LEAF, false).with(FACING, Direction.UP)); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.get(FACING).getAxis()); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(FACING, WATERLOGGED, SHAPE, LEAF); - } - - @Override - public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess worldAccess = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER).with(FACING, ctx.getSide()); - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if ((Boolean) state.get(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - return state; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - static { - SHAPES.put(Axis.X, Block.createCuboidShape(0, 6, 6, 16, 10, 10)); - SHAPES.put(Axis.Y, Block.createCuboidShape(6, 0, 6, 10, 16, 10)); - SHAPES.put(Axis.Z, Block.createCuboidShape(6, 6, 0, 10, 10, 16)); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java b/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java deleted file mode 100644 index 77843c7f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FallingBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import ru.betterend.util.MHelper; - -public class BlockEndstoneDust extends FallingBlock { - @Environment(EnvType.CLIENT) - private static final int COLOR = MHelper.color(226, 239, 168); - - public BlockEndstoneDust() { - super(FabricBlockSettings.copyOf(Blocks.SAND).materialColor(Blocks.END_STONE.getDefaultMaterialColor())); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { - return COLOR; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingMoss.java b/src/main/java/ru/betterend/blocks/BlockGlowingMoss.java deleted file mode 100644 index f87780be..00000000 --- a/src/main/java/ru/betterend/blocks/BlockGlowingMoss.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; - -public class BlockGlowingMoss extends BlockPlant { - public BlockGlowingMoss(int light) { - super(light); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; - } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } - - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java b/src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java deleted file mode 100644 index 1ad2970f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.registry.EndBlocks; - -public class BlockGlowingPillarLuminophor extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); - - public BlockGlowingPillarLuminophor() { - super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .strength(0.2F) - .luminance(15)); - this.setDefaultState(this.stateManager.getDefaultState().with(NATURAL, false)); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.get(NATURAL) ? world.getBlockState(pos.down()).isOf(EndBlocks.GLOWING_PILLAR_ROOTS) : true; - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(NATURAL); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java b/src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java deleted file mode 100644 index e393ee96..00000000 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUpDownPlant; -import ru.betterend.registry.EndBlocks; - -public class BlockGlowingPillarRoots extends BlockUpDownPlant { - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java b/src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java deleted file mode 100644 index 7bb20c66..00000000 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java +++ /dev/null @@ -1,69 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockGlowingPillarSeed extends BlockPlantWithAge { - public BlockGlowingPillarSeed() { - super(FabricBlockSettings.of(Material.PLANT) - .luminance((state) -> { return state.get(AGE) * 3 + 3; }) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); - } - - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { - int height = MHelper.randRange(1, 2, random); - int h = BlocksHelper.upRay(world, pos, height + 2); - if (h < height) { - return; - } - - Mutable mut = new Mutable().set(pos); - BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.getDefaultState(); - if (height < 2) { - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - mut.move(Direction.UP); - } - else { - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); - mut.move(Direction.UP); - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - mut.move(Direction.UP); - } - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState().with(BlockBlueVineLantern.NATURAL, true)); - for (Direction dir: BlocksHelper.DIRECTIONS) { - pos = mut.offset(dir); - if (world.isAir(pos)) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.getDefaultState().with(Properties.FACING, dir)); - } - } - mut.move(Direction.UP); - if (world.isAir(mut)) { - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.getDefaultState().with(Properties.FACING, Direction.UP)); - } - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java deleted file mode 100644 index eca5f605..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java +++ /dev/null @@ -1,87 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.MathHelper; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.interfaces.IColorProvider; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.MHelper; - -public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); - - public BlockHelixTreeLeaves() { - super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WART_BLOCK) - .sounds(BlockSoundGroup.GRASS) - .strength(0.2F)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(COLOR); - } - - @Override - public BlockColorProvider getProvider() { - return (state, world, pos, tintIndex) -> { - return MHelper.color(237, getGreen(state.get(COLOR)), 20); - }; - } - - @Override - public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return MHelper.color(237, getGreen(4), 20); - }; - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(COLOR, MHelper.randRange(3, 5, ctx.getWorld().getRandom())); - } - - private int getGreen(int color) { - float delta = color / 7F; - return (int) MathHelper.lerp(delta, 80, 158); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isEffectiveOn(state) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); - if (MHelper.RANDOM.nextInt(16) <= fortune) { - return Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)); - } - return Lists.newArrayList(); - } - return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists.newArrayList(); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java b/src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java deleted file mode 100644 index 754e7316..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndFeatures; - -public class BlockHelixTreeSapling extends BlockFeatureSapling { - @Override - protected Feature getFeature() { - return EndFeatures.HELIX_TREE.getFeature(); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockHydralux.java b/src/main/java/ru/betterend/blocks/BlockHydralux.java deleted file mode 100644 index cbba5ddb..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHydralux.java +++ /dev/null @@ -1,90 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.HydraluxShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; - -public class BlockHydralux extends BlockUnderwaterPlant { - public static final EnumProperty SHAPE = BlockProperties.HYDRALUX_SHAPE; - - public BlockHydralux() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .luminance((state) -> { return state.get(SHAPE).hasGlow() ? 15 : 0; }) - .noCollision()); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - HydraluxShape shape = state.get(SHAPE); - if (shape == HydraluxShape.FLOWER_BIG_TOP || shape == HydraluxShape.FLOWER_SMALL_TOP) { - return down.isOf(this); - } - else if (shape == HydraluxShape.ROOTS) { - return down.isOf(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.up()).isOf(this); - } - else { - return down.isOf(this) && world.getBlockState(pos.up()).isOf(this); - } - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return false; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return false; - } - - @Override - @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { - return new ItemStack(EndBlocks.HYDRALUX_SAPLING); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - HydraluxShape shape = state.get(SHAPE); - if (shape == HydraluxShape.FLOWER_BIG_BOTTOM || shape == HydraluxShape.FLOWER_SMALL_BOTTOM) { - return Lists.newArrayList(new ItemStack(EndItems.HYDRALUX_PETAL, MHelper.randRange(1, 4, MHelper.RANDOM))); - } - else if (shape == HydraluxShape.ROOTS) { - return Lists.newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); - } - return Collections.emptyList(); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java b/src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java deleted file mode 100644 index 9fa569a2..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.entity.Entity; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockBase; - -public class BlockHydraluxPetal extends BlockBase { - public BlockHydraluxPetal() { - this(FabricBlockSettings.of(Material.PLANT) - .materialColor(MaterialColor.SPRUCE) - .sounds(BlockSoundGroup.WART_BLOCK) - .breakByTool(FabricToolTags.AXES) - .hardness(1) - .resistance(1) - .breakByHand(true)); - } - - public BlockHydraluxPetal(FabricBlockSettings settings) { - super(settings); - } - - @Override - public void onLandedUpon(World world, BlockPos pos, Entity entity, float distance) {} -} diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java b/src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java deleted file mode 100644 index b3615fe3..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.HydraluxShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockHydraluxSapling extends BlockUnderwaterPlantWithAge { - @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { - int h = MHelper.randRange(4, 8, random); - Mutable mut = new Mutable().set(pos); - - for (int i = 1; i < h; i++) { - mut.setY(pos.getY() + i); - if (!world.getBlockState(mut).isOf(Blocks.WATER)) { - return; - } - } - - mut.setY(pos.getY()); - BlockState state = EndBlocks.HYDRALUX.getDefaultState(); - BlocksHelper.setWithoutUpdate(world, pos, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); - for (int i = 1; i < h - 2; i++) { - mut.setY(pos.getY() + i); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); - } - - mut.setY(mut.getY() + 1); - boolean big = random.nextBoolean(); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); - - mut.setY(mut.getY() + 1); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SULPHURIC_ROCK.stone); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java b/src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java deleted file mode 100644 index b433ebcd..00000000 --- a/src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java +++ /dev/null @@ -1,144 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndParticles; -import ru.betterend.util.BlocksHelper; - -public class BlockHydrothermalVent extends BlockBaseNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - private static final VoxelShape SHAPE = Block.createCuboidShape(1, 1, 1, 15, 16, 15); - - public BlockHydrothermalVent() { - super(FabricBlockSettings.of(Material.STONE) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.STONE) - .noCollision() - .requiresTool()); - this.setDefaultState(getDefaultState().with(WATERLOGGED, true).with(ACTIVATED, false)); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(WATERLOGGED, ACTIVATED); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return false; - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return false; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - state = world.getBlockState(pos.down()); - return state.isOf(EndBlocks.SULPHURIC_ROCK.stone); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.WATER.getDefaultState(); - } - else if (state.get(WATERLOGGED) && facing == Direction.UP && neighborState.isOf(Blocks.WATER)) { - world.getBlockTickScheduler().schedule(pos, this, 20); - } - return state; - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess worldAccess = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER); - } - - @Override - public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); - } - - @Override - public BlockEntity createBlockEntity(BlockView world) { - return new BlockEntityHydrothermalVent(); - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - BlockPos up = pos.up(); - if (world.getBlockState(up).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); - world.getBlockTickScheduler().schedule(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); - } - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - if (world instanceof ServerWorld && state.get(WATERLOGGED) && world.getBlockState(pos.up()).isOf(Blocks.WATER)) { - scheduledTick(state,(ServerWorld) world, pos, world.random); - } - } - - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - if (!state.get(ACTIVATED) && random.nextBoolean()) { - super.randomDisplayTick(state, world, pos, random); - double x = pos.getX() + random.nextDouble(); - double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; - double z = pos.getZ() + random.nextDouble(); - if (state.get(WATERLOGGED)) { - world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { - world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); - } - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java b/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java deleted file mode 100644 index 95fb5e9f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BlockLacugroveSapling extends BlockFeatureSapling { - public BlockLacugroveSapling() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.LACUGROVE.getFeature(); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.END_MOSS) || world.getBlockState(pos.down()).isOf(EndBlocks.ENDSTONE_DUST); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockLanceleaf.java b/src/main/java/ru/betterend/blocks/BlockLanceleaf.java deleted file mode 100644 index 50005609..00000000 --- a/src/main/java/ru/betterend/blocks/BlockLanceleaf.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.PentaShape; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; - -public class BlockLanceleaf extends BlockPlant { - public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; - public static final IntProperty ROTATION = BlockProperties.ROTATION; - - public BlockLanceleaf() { - super(); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE, ROTATION); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - PentaShape shape = state.get(SHAPE); - if (shape == PentaShape.TOP) { - return world.getBlockState(pos.down()).isOf(this); - } - else if (shape == PentaShape.BOTTOM) { - return world.getBlockState(pos.down()).isOf(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.up()).isOf(this); - } - else { - return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); - } - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java b/src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java deleted file mode 100644 index 2744a0b8..00000000 --- a/src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockProperties.PentaShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockLanceleafSeed extends BlockPlantWithAge { - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { - int height = MHelper.randRange(4, 6, random); - int h = BlocksHelper.upRay(world, pos, height + 2); - if (h < height + 1) { - return; - } - int rotation = random.nextInt(4); - Mutable mut = new Mutable().set(pos); - BlockState plant = EndBlocks.LANCELEAF.getDefaultState().with(BlockProperties.ROTATION, rotation); - BlocksHelper.setWithoutUpdate(world, mut, plant.with(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); - for (int i = 2; i < height - 2; i++) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); - } - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockMengerSponge.java b/src/main/java/ru/betterend/blocks/BlockMengerSponge.java deleted file mode 100644 index 1b8c26e3..00000000 --- a/src/main/java/ru/betterend/blocks/BlockMengerSponge.java +++ /dev/null @@ -1,103 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Queue; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidBlock; -import net.minecraft.block.FluidDrainable; -import net.minecraft.block.Material; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.Pair; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; - -public class BlockMengerSponge extends BlockBaseNotFull implements IRenderTypeable { - public BlockMengerSponge() { - super(FabricBlockSettings.copyOf(Blocks.SPONGE).nonOpaque()); - } - - @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { - if (absorbWater(world, pos)) { - world.setBlockState(pos, EndBlocks.MENGER_SPONGE_WET.getDefaultState()); - } - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (absorbWater(world, pos)) { - return EndBlocks.MENGER_SPONGE_WET.getDefaultState(); - } - return state; - } - - private boolean absorbWater(WorldAccess world, BlockPos pos) { - Queue> queue = Lists.newLinkedList(); - queue.add(new Pair(pos, 0)); - int i = 0; - - while (!queue.isEmpty()) { - Pair pair = queue.poll(); - BlockPos blockPos = (BlockPos) pair.getLeft(); - int j = (Integer) pair.getRight(); - Direction[] var8 = Direction.values(); - int var9 = var8.length; - - for (int var10 = 0; var10 < var9; ++var10) { - Direction direction = var8[var10]; - BlockPos blockPos2 = blockPos.offset(direction); - BlockState blockState = world.getBlockState(blockPos2); - FluidState fluidState = world.getFluidState(blockPos2); - Material material = blockState.getMaterial(); - if (fluidState.isIn(FluidTags.WATER)) { - if (blockState.getBlock() instanceof FluidDrainable && ((FluidDrainable) blockState.getBlock()).tryDrainFluid(world, blockPos2, blockState) != Fluids.EMPTY) { - ++i; - if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); - } - } - else if (blockState.getBlock() instanceof FluidBlock) { - world.setBlockState(blockPos2, Blocks.AIR.getDefaultState(), 3); - ++i; - if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); - } - } - else if (material == Material.UNDERWATER_PLANT || material == Material.REPLACEABLE_UNDERWATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; - dropStacks(blockState, world, blockPos2, blockEntity); - world.setBlockState(blockPos2, Blocks.AIR.getDefaultState(), 3); - ++i; - if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); - } - } - } - } - - if (i > 64) { - break; - } - } - - return i > 0; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java b/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java deleted file mode 100644 index 9f81c688..00000000 --- a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java +++ /dev/null @@ -1,97 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockMengerSpongeWet extends BlockBaseNotFull implements IRenderTypeable { - public BlockMengerSpongeWet() { - super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).nonOpaque()); - } - - @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { - if (world.getDimension().isUltrawarm()) { - world.setBlockState(pos, EndBlocks.MENGER_SPONGE.getDefaultState(), 3); - world.syncWorldEvent(2009, pos, 0); - world.playSound((PlayerEntity) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); - } - } - - @Override - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - Direction direction = Direction.random(random); - if (direction != Direction.UP) { - BlockPos blockPos = pos.offset(direction); - BlockState blockState = world.getBlockState(blockPos); - if (!state.isOpaque() || !blockState.isSideSolidFullSquare(world, blockPos, direction.getOpposite())) { - double x = (double) pos.getX(); - double y = (double) pos.getY(); - double z = (double) pos.getZ(); - if (direction == Direction.DOWN) { - y -= 0.05; - x += random.nextDouble(); - z += random.nextDouble(); - } - else { - y += random.nextDouble() * 0.8; - if (direction.getAxis() == Direction.Axis.X) { - z += random.nextDouble(); - if (direction == Direction.EAST) { - ++x; - } - else { - x += 0.05; - } - } - else { - x += random.nextDouble(); - if (direction == Direction.SOUTH) { - ++z; - } - else { - z += 0.05; - } - } - } - - world.addParticle(ParticleTypes.DRIPPING_WATER, x, y, z, 0, 0, 0); - } - } - } - - @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - super.onBreak(world, pos, state, player); - BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java b/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java deleted file mode 100644 index 8fea3727..00000000 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.registry.EndBlocks; - -public class BlockMossyGlowshroomCap extends BlockBase { - public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); - - public BlockMossyGlowshroomCap() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); - this.setDefaultState(this.stateManager.getDefaultState().with(TRANSITION, false)); - } - - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getWorld().getBlockState(ctx.getBlockPos().down()))); - } - - protected void appendProperties(StateManager.Builder builder) { - builder.add(TRANSITION); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java b/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java deleted file mode 100644 index 0a287ab4..00000000 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BlockMossyGlowshroomSapling extends BlockFeatureSapling { - public BlockMossyGlowshroomSapling() { - super(7); - } - - @Override - protected Feature getFeature() { - return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.END_MOSS) || world.getBlockState(pos.down()).isOf(EndBlocks.END_MYCELIUM); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockMurkweed.java b/src/main/java/ru/betterend/blocks/BlockMurkweed.java deleted file mode 100644 index 8b47efbe..00000000 --- a/src/main/java/ru/betterend/blocks/BlockMurkweed.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; - -public class BlockMurkweed extends BlockPlant { - @Override - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - double x = pos.getX() + random.nextDouble(); - double y = pos.getY() + random.nextDouble() * 0.5 + 0.5; - double z = pos.getZ() + random.nextDouble(); - double v = random.nextDouble() * 0.1; - world.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, v, v, v); - } - - @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (entity instanceof LivingEntity && !((LivingEntity) entity).hasStatusEffect(StatusEffects.BLINDNESS)) { - ((LivingEntity) entity).addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 50)); - } - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockNeedlegrass.java b/src/main/java/ru/betterend/blocks/BlockNeedlegrass.java deleted file mode 100644 index 6d9aaa9f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockNeedlegrass.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.betterend.blocks; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.MHelper; - -public class BlockNeedlegrass extends BlockPlant { - @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (entity instanceof LivingEntity) { - entity.damage(DamageSource.CACTUS, 0.1F); - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(new ItemStack(Items.STICK, MHelper.randRange(0, 2, MHelper.RANDOM))); - } - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockPath.java b/src/main/java/ru/betterend/blocks/BlockPath.java deleted file mode 100644 index f6f99453..00000000 --- a/src/main/java/ru/betterend/blocks/BlockPath.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockBaseNotFull; - -public class BlockPath extends BlockBaseNotFull { - private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); - - public BlockPath(Block source) { - super(FabricBlockSettings.copyOf(source).allowsSpawning((state, world, pos, type) -> { return false; })); - if (source instanceof BlockTerrain) { - BlockTerrain terrain = (BlockTerrain) source; - terrain.setPathBlock(this); - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - return Collections.singletonList(new ItemStack(Blocks.END_STONE)); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index bc10e067..3c0cbb0d 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -1,33 +1,50 @@ package ru.betterend.blocks; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.StringIdentifiable; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import ru.betterend.registry.EndPortals; public class BlockProperties { - public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); - public final static EnumProperty PEDESTAL_STATE = EnumProperty.of("state", PedestalState.class); - public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.of("shape", HydraluxShape.class); - public static final EnumProperty PENTA_SHAPE = EnumProperty.of("shape", PentaShape.class); - public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); - public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); - public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); - public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); + public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class); + public static final EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); + public static final EnumProperty CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class); + public static final EnumProperty TRIPLE_SHAPE = EnumProperty.create("shape", TripleShape.class); + public static final EnumProperty PENTA_SHAPE = EnumProperty.create("shape", PentaShape.class); - public static enum TripleShape implements StringIdentifiable { - TOP("top"), - MIDDLE("middle"), - BOTTOM("bottom"); + public static final BooleanProperty TRANSITION = BooleanProperty.create("transition"); + public static final BooleanProperty HAS_LIGHT = BooleanProperty.create("has_light"); + public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item"); + public static final BooleanProperty IS_FLOOR = BooleanProperty.create("is_floor"); + public static final BooleanProperty NATURAL = BooleanProperty.create("natural"); + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final BooleanProperty SMALL = BooleanProperty.create("small"); + + public static final IntegerProperty DESTRUCTION_LONG = IntegerProperty.create("destruction", 0, 8); + public static final IntegerProperty DESTRUCTION = IntegerProperty.create("destruction", 0, 2); + public static final IntegerProperty ROTATION = IntegerProperty.create("rotation", 0, 3); + public static final IntegerProperty FULLNESS = IntegerProperty.create("fullness", 0, 3); + public static final IntegerProperty COLOR = IntegerProperty.create("color", 0, 7); + public static final IntegerProperty PORTAL = IntegerProperty.create("portal", 0, EndPortals.getCount()); + public static final IntegerProperty SIZE = IntegerProperty.create("size", 0, 7); + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); + + public static enum TripleShape implements StringRepresentable { + TOP("top", 0), + MIDDLE("middle", 1), + BOTTOM("bottom", 2); private final String name; + private final int index; - TripleShape(String name) { + TripleShape(String name, int index) { this.name = name; + this.index = index; } @Override - public String asString() { + public String getSerializedName() { return name; } @@ -35,9 +52,17 @@ public class BlockProperties { public String toString() { return name; } + + public int getIndex() { + return index; + } + + public static TripleShape fromIndex(int index) { + return index > 1 ? BOTTOM : index == 1 ? MIDDLE : TOP; + } } - public static enum PedestalState implements StringIdentifiable { + public static enum PedestalState implements StringRepresentable { PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), BOTTOM("bottom"), @@ -52,7 +77,7 @@ public class BlockProperties { } @Override - public String asString() { + public String getSerializedName() { return this.name; } @@ -62,7 +87,7 @@ public class BlockProperties { } } - public static enum HydraluxShape implements StringIdentifiable { + public static enum HydraluxShape implements StringRepresentable { FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), FLOWER_SMALL_BOTTOM("flower_small_bottom", true), @@ -79,7 +104,7 @@ public class BlockProperties { } @Override - public String asString() { + public String getSerializedName() { return name; } @@ -93,7 +118,7 @@ public class BlockProperties { } } - public static enum PentaShape implements StringIdentifiable { + public static enum PentaShape implements StringRepresentable { BOTTOM("bottom"), PRE_BOTTOM("pre_bottom"), MIDDLE("middle"), @@ -107,7 +132,61 @@ public class BlockProperties { } @Override - public String asString() { + public String getSerializedName() { + return name; + } + + @Override + public String toString() { + return name; + } + } + + public static enum LumecornShape implements StringRepresentable { + LIGHT_TOP("light_top", 15), + LIGHT_TOP_MIDDLE("light_top_middle", 15), + LIGHT_MIDDLE("light_middle", 15), + LIGHT_BOTTOM("light_bottom", 15), + MIDDLE("middle", 0), + BOTTOM_BIG("bottom_big", 0), + BOTTOM_SMALL("bottom_small", 0); + + private final String name; + private final int light; + + LumecornShape(String name, int light) { + this.name = name; + this.light = light; + } + + @Override + public String getSerializedName() { + return name; + } + + @Override + public String toString() { + return name; + } + + public int getLight() { + return light; + } + } + + public static enum CactusBottom implements StringRepresentable { + EMPTY("empty"), + SAND("sand"), + MOSS("moss"); + + private final String name; + + CactusBottom(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { return name; } diff --git a/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java b/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java deleted file mode 100644 index cdb301ad..00000000 --- a/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BlockPythadendronSapling extends BlockFeatureSapling { - public BlockPythadendronSapling() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.PYTHADENDRON_TREE.getFeature(); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.CHORUS_NYLIUM); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java b/src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java deleted file mode 100644 index 77e9192f..00000000 --- a/src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java +++ /dev/null @@ -1,202 +0,0 @@ -package ru.betterend.blocks; - -import java.util.List; - -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IColorProvider; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.particle.InfusionParticleType; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class BlockRespawnObelisk extends BlockBase implements IColorProvider, IRenderTypeable { - private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.createCuboidShape(1, 0, 1, 15, 16, 15); - private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - - public BlockRespawnObelisk() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { - return (state.get(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; - })); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return (state.get(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - for (int i = 0; i < 3; i++) { - if (!world.getBlockState(pos.up(i)).getMaterial().isReplaceable()) { - return false; - } - } - return true; - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - state = this.getDefaultState(); - BlocksHelper.setWithUpdate(world, pos, state.with(SHAPE, TripleShape.BOTTOM)); - BlocksHelper.setWithUpdate(world, pos.up(), state.with(SHAPE, TripleShape.MIDDLE)); - BlocksHelper.setWithUpdate(world, pos.up(2), state.with(SHAPE, TripleShape.TOP)); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - TripleShape shape = state.get(SHAPE); - if (shape == TripleShape.BOTTOM) { - if (world.getBlockState(pos.up()).isOf(this)) { - return state; - } - else { - return Blocks.AIR.getDefaultState(); - } - } - else if (shape == TripleShape.MIDDLE) { - if (world.getBlockState(pos.up()).isOf(this) && world.getBlockState(pos.down()).isOf(this)) { - return state; - } - else { - return Blocks.AIR.getDefaultState(); - } - } - else { - if (world.getBlockState(pos.down()).isOf(this)) { - return state; - } - else { - return Blocks.AIR.getDefaultState(); - } - } - } - - @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - if (player.isCreative()) { - TripleShape shape = state.get(SHAPE); - if (shape == TripleShape.MIDDLE) { - BlocksHelper.setWithUpdate(world, pos.down(), Blocks.AIR); - } - else if (shape == TripleShape.TOP) { - BlocksHelper.setWithUpdate(world, pos.down(2), Blocks.AIR); - } - } - super.onBreak(world, pos, state, player); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.BOTTOM) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.TRANSLUCENT; - } - - @Override - public BlockColorProvider getProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); - } - - @Override - public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return MHelper.color(255, 255, 255); - }; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ItemStack itemStack = player.getStackInHand(hand); - boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; - if (hand != Hand.MAIN_HAND || !canActivate) { - if (!world.isClient && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) player; - serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.fail_spawn"), true); - } - return ActionResult.FAIL; - } - else if (!world.isClient) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) player; - serverPlayerEntity.setSpawnPoint(world.getRegistryKey(), pos, 0.0F, false, false); - serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.set_spawn"), true); - double px = pos.getX() + 0.5; - double py = pos.getY() + 0.5; - double pz = pos.getZ() + 0.5; - InfusionParticleType particle = new InfusionParticleType(new ItemStack(EndItems.AMBER_GEM)); - if (world instanceof ServerWorld) { - double py1 = py; - double py2 = py - 0.2; - if (state.get(SHAPE) == TripleShape.BOTTOM) { - py1 += 1; - py2 += 2; - } - else if (state.get(SHAPE) == TripleShape.MIDDLE) { - py1 += 0; - py2 += 1; - } - else { - py1 -= 2; - } - ((ServerWorld) world).spawnParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); - ((ServerWorld) world).spawnParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); - } - world.playSound(null, px, py, py, SoundEvents.BLOCK_RESPAWN_ANCHOR_SET_SPAWN, SoundCategory.BLOCKS, 1F, 1F); - if (!player.isCreative()) { - itemStack.decrement(6); - } - } - return player.isCreative() ? ActionResult.PASS : ActionResult.success(world.isClient); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockShadowBerry.java b/src/main/java/ru/betterend/blocks/BlockShadowBerry.java deleted file mode 100644 index 2e192fc1..00000000 --- a/src/main/java/ru/betterend/blocks/BlockShadowBerry.java +++ /dev/null @@ -1,64 +0,0 @@ -package ru.betterend.blocks; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlantWithAge; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; - -public class BlockShadowBerry extends BlockPlantWithAge { - private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); - - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) {} - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(AGE) < 3) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(new ItemStack(this), new ItemStack(EndItems.SHADOW_BERRY_RAW, MHelper.randRange(1, 3, MHelper.RANDOM))); - } - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return state.get(AGE) < 3; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return state.get(AGE) < 3; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockShadowGrass.java b/src/main/java/ru/betterend/blocks/BlockShadowGrass.java deleted file mode 100644 index 9fd872b9..00000000 --- a/src/main/java/ru/betterend/blocks/BlockShadowGrass.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import ru.betterend.registry.EndParticles; - -public class BlockShadowGrass extends BlockTerrain { - public BlockShadowGrass() { - super(MaterialColor.BLACK); - } - - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - super.randomDisplayTick(state, world, pos, random); - if (random.nextInt(32) == 0) { - world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockSilkMothNest.java b/src/main/java/ru/betterend/blocks/BlockSilkMothNest.java deleted file mode 100644 index 1c99e9cb..00000000 --- a/src/main/java/ru/betterend/blocks/BlockSilkMothNest.java +++ /dev/null @@ -1,106 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.util.BlocksHelper; - -public class BlockSilkMothNest extends BlockBase implements IRenderTypeable { - public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; - private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); - private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); - - public BlockSilkMothNest() { - super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque()); - this.setDefaultState(getDefaultState().with(ACTIVE, true)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(ACTIVE, FACING); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(ACTIVE) ? BOTTOM : TOP; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - Direction dir = ctx.getPlayerFacing().getOpposite(); - return this.getDefaultState().with(FACING, dir); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!state.get(ACTIVE)) { - if (sideCoversSmallSquare(world, pos.up(), Direction.DOWN) || world.getBlockState(pos.up()).isIn(BlockTags.LEAVES)) { - return state; - } - else { - return Blocks.AIR.getDefaultState(); - } - } - return state; - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return state.get(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); - } - - @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - if (!state.get(ACTIVE) && player.isCreative()) { - BlocksHelper.setWithUpdate(world, pos.down(), Blocks.AIR); - } - BlockState up = world.getBlockState(pos.up()); - if (up.isOf(this) && !up.get(ACTIVE)) { - BlocksHelper.setWithUpdate(world, pos.up(), Blocks.AIR); - } - super.onBreak(world, pos, state, player); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockSounds.java b/src/main/java/ru/betterend/blocks/BlockSounds.java index cf39c972..21f89213 100644 --- a/src/main/java/ru/betterend/blocks/BlockSounds.java +++ b/src/main/java/ru/betterend/blocks/BlockSounds.java @@ -1,13 +1,13 @@ package ru.betterend.blocks; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundEvents; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.SoundType; public class BlockSounds { - public static final BlockSoundGroup TERRAIN_SOUND = new BlockSoundGroup(1.0F, 1.0F, - SoundEvents.BLOCK_STONE_BREAK, - SoundEvents.BLOCK_WART_BLOCK_STEP, - SoundEvents.BLOCK_STONE_PLACE, - SoundEvents.BLOCK_STONE_HIT, - SoundEvents.BLOCK_STONE_FALL); + public static final SoundType TERRAIN_SOUND = new SoundType(1.0F, 1.0F, + SoundEvents.STONE_BREAK, + SoundEvents.WART_BLOCK_STEP, + SoundEvents.STONE_PLACE, + SoundEvents.STONE_HIT, + SoundEvents.STONE_FALL); } diff --git a/src/main/java/ru/betterend/blocks/BlockStone.java b/src/main/java/ru/betterend/blocks/BlockStone.java deleted file mode 100644 index d8b9dd53..00000000 --- a/src/main/java/ru/betterend/blocks/BlockStone.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; - -public class BlockStone extends BlockBase { - - public BlockStone(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSoundGroup.STONE)); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java b/src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java deleted file mode 100644 index bfa5f4d8..00000000 --- a/src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java +++ /dev/null @@ -1,121 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockAttached; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; - -public class BlockSulphurCrystal extends BlockAttached implements IRenderTypeable, Waterloggable, FluidFillable { - private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public static final IntProperty AGE = IntProperty.of("age", 0, 2); - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - - public BlockSulphurCrystal() { - super(FabricBlockSettings.of(Material.STONE) - .materialColor(MaterialColor.YELLOW) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.GLASS) - .requiresTool() - .noCollision()); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - super.appendProperties(stateManager); - stateManager.add(AGE, WATERLOGGED); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return state.get(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return !state.get(WATERLOGGED); - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return !state.get(WATERLOGGED); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState state = super.getPlacementState(ctx); - if (state != null) { - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; - return state.with(WATERLOGGED, water); - } - return null; - } - - @Override - public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - return world.getBlockState(blockPos).isOf(EndBlocks.BRIMSTONE); - } - - static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.125, 0.125, 0.5, 0.875F, 0.875F, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.125, 0.125, 1.0, 0.875F, 0.875F)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.125, 0.125, 0.5, 0.875F, 0.875F)); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java b/src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java deleted file mode 100644 index b8140315..00000000 --- a/src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BlockTenaneaSapling extends BlockFeatureSapling { - public BlockTenaneaSapling() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.TENANEA.getFeature(); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.PINK_MOSS); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockTerrain.java b/src/main/java/ru/betterend/blocks/BlockTerrain.java deleted file mode 100644 index e47e1905..00000000 --- a/src/main/java/ru/betterend/blocks/BlockTerrain.java +++ /dev/null @@ -1,88 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.SnowBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; -import net.minecraft.world.chunk.light.ChunkLightProvider; -import ru.betterend.blocks.basis.BlockBase; - -public class BlockTerrain extends BlockBase { - private Block pathBlock; - - public BlockTerrain(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND).ticksRandomly()); - } - - public void setPathBlock(Block roadBlock) { - this.pathBlock = roadBlock; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (pathBlock != null && player.getMainHandStack().getItem().isIn(FabricToolTags.SHOVELS)) { - world.playSound(player, pos, SoundEvents.ITEM_SHOVEL_FLATTEN, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, pathBlock.getDefaultState()); - if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); - } - } - return ActionResult.SUCCESS; - } - return ActionResult.FAIL; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - return Collections.singletonList(new ItemStack(Blocks.END_STONE)); - } - - @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { - world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); - } - } - - public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockTerrainPlant.java b/src/main/java/ru/betterend/blocks/BlockTerrainPlant.java deleted file mode 100644 index d3587c9b..00000000 --- a/src/main/java/ru/betterend/blocks/BlockTerrainPlant.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import ru.betterend.blocks.basis.BlockPlant; - -public class BlockTerrainPlant extends BlockPlant { - private final Block ground; - - public BlockTerrainPlant(Block ground) { - super(true); - this.ground = ground; - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(ground); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java deleted file mode 100644 index f70b049c..00000000 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockPlant; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockUmbrellaMoss extends BlockPlant { - public BlockUmbrellaMoss() { - super(11); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; - } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } - - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return world.isAir(pos.up()); - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.getDefaultState().with(BlockDoublePlant.ROTATION, rot); - BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(BlockDoublePlant.TOP, true)); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java deleted file mode 100644 index 1529257a..00000000 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.registry.EndBlocks; - -public class BlockUmbrellaMossTall extends BlockDoublePlant { - public BlockUmbrellaMossTall() { - super(12); - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); - world.spawnEntity(item); - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java deleted file mode 100644 index 97772b79..00000000 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.betterend.blocks; - -import java.io.Reader; -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AbstractGlassBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndItems; - -public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned { - public BlockUmbrellaTreeMembrane() { - super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.TRANSLUCENT; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS)); - } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } -} diff --git a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java deleted file mode 100644 index 7391c96b..00000000 --- a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java +++ /dev/null @@ -1,123 +0,0 @@ -package ru.betterend.blocks; - -import java.util.Random; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidDrainable; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.Entity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable { - public BlockVentBubbleColumn() { - super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().dropsNothing()); - } - - @Override - public Fluid tryDrainFluid(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); - return Fluids.WATER; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.INVISIBLE; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState blockState = world.getBlockState(pos.down()); - return blockState.isOf(this) || blockState.isOf(EndBlocks.HYDROTHERMAL_VENT); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return VoxelShapes.empty(); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if (!state.canPlaceAt(world, pos)) { - return Blocks.WATER.getDefaultState(); - } - else { - BlockPos up = pos.up(); - if (world.getBlockState(up).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, up, this); - world.getBlockTickScheduler().schedule(up, this, 5); - } - } - return state; - } - - @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - if (random.nextInt(4) == 0) { - double px = pos.getX() + random.nextDouble(); - double py = pos.getY() + random.nextDouble(); - double pz = pos.getZ() + random.nextDouble(); - world.addImportantParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); - } - if (random.nextInt(200) == 0) { - world.playSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT, SoundCategory.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); - } - } - - @Environment(EnvType.CLIENT) - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - BlockState blockState = world.getBlockState(pos.up()); - if (blockState.isAir()) { - entity.onBubbleColumnSurfaceCollision(false); - if (!world.isClient) { - ServerWorld serverWorld = (ServerWorld) world; - - for (int i = 0; i < 2; ++i) { - serverWorld.spawnParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); - serverWorld.spawnParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, 0.0D, 0.2D); - } - } - } - else { - entity.onBubbleColumnCollision(false); - } - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return false; - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return false; - } - - @Override - public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); - } -} diff --git a/src/main/java/ru/betterend/blocks/BlueVineBlock.java b/src/main/java/ru/betterend/blocks/BlueVineBlock.java new file mode 100644 index 00000000..9187d92b --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlueVineBlock.java @@ -0,0 +1,23 @@ +package ru.betterend.blocks; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.UpDownPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class BlueVineBlock extends UpDownPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + } +} diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java new file mode 100644 index 00000000..ac6671dd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -0,0 +1,46 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; + +public class BlueVineLanternBlock extends BlockBase { + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; + + public BlueVineLanternBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); + this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return !state.getValue(NATURAL) || world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE; + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(NATURAL); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java new file mode 100644 index 00000000..586c81cc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -0,0 +1,55 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class BlueVineSeedBlock extends EndPlantWithAgeBlock { + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + int height = MHelper.randRange(2, 5, random); + int h = BlocksHelper.upRay(world, pos, height + 2); + if (h < height + 1) { + return; + } + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + for (int i = 1; i < height; i++) { + BlocksHelper.setWithoutUpdate(world, pos.above(i), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + } + BlocksHelper.setWithoutUpdate(world, pos.above(height), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + placeLantern(world, pos.above(height + 1)); + } + + private void placeLantern(WorldGenLevel world, BlockPos pos) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); + } + } + if (world.isEmptyBlock(pos.above())) { + BlocksHelper.setWithoutUpdate(world, pos.above(), EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.UP)); + } + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java new file mode 100644 index 00000000..a7c95243 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -0,0 +1,57 @@ +package ru.betterend.blocks; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class BoluxMushroomBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 9, 15); + + public BoluxMushroomBlock() { + super(10); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.RUTISCUS); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } +} diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java new file mode 100644 index 00000000..92e34923 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -0,0 +1,102 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import org.jetbrains.annotations.Nullable; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class BrimstoneBlock extends BlockBase { + public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; + + public BrimstoneBlock() { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); + registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(ACTIVATED); + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + if (world.isClientSide()) { + updateChunks((ClientLevel) world, pos); + } + } + + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { + if (world.isClientSide()) { + updateChunks((ClientLevel) world, pos); + } + } + + private void updateChunks(ClientLevel world, BlockPos pos) { + int y = pos.getY() >> 4; + int x1 = (pos.getX() - 2) >> 4; + int z1 = (pos.getZ() - 2) >> 4; + int x2 = (pos.getX() + 2) >> 4; + int z2 = (pos.getZ() + 2) >> 4; + for (int x = x1; x <= x2; x++) { + for (int z = z1; z <= z2; z++) { + world.setSectionDirtyWithNeighbors(x, y, z); + } + } + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + boolean deactivate = true; + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (world.getFluidState(pos.relative(dir)).getType().equals(Fluids.WATER)) { + deactivate = false; + break; + } + } + if (state.getValue(ACTIVATED)) { + if (deactivate) { + world.setBlockAndUpdate(pos, defaultBlockState().setValue(ACTIVATED, false)); + } + else if (state.getValue(ACTIVATED) && random.nextInt(16) == 0) { + Direction dir = BlocksHelper.randomDirection(random); + BlockPos side = pos.relative(dir); + BlockState sideState = world.getBlockState(side); + if (sideState.getBlock() instanceof SulphurCrystalBlock) { + if (sideState.getValue(SulphurCrystalBlock.AGE) < 2 && sideState.getValue(SulphurCrystalBlock.WATERLOGGED)) { + int age = sideState.getValue(SulphurCrystalBlock.AGE) + 1; + world.setBlockAndUpdate(side, sideState.setValue(SulphurCrystalBlock.AGE, age)); + } + } + else if (sideState.getFluidState().getType() == Fluids.WATER) { + BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.WATERLOGGED, true) + .setValue(SulphurCrystalBlock.AGE, 0); + world.setBlockAndUpdate(side, crystal); + } + } + } + else if (!deactivate && !state.getValue(ACTIVATED)) { + world.setBlockAndUpdate(pos, defaultBlockState().setValue(ACTIVATED, true)); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java new file mode 100644 index 00000000..6ffc1849 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -0,0 +1,60 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; + +public class BubbleCoralBlock extends UnderwaterPlantBlock { + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); + + public BubbleCoralBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + double x = pos.getX() + random.nextDouble(); + double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; + double z = pos.getZ() + random.nextDouble(); + world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java new file mode 100644 index 00000000..504fe6f8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.blocks; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; + +public class BulbVineBlock extends VineBlock { + public BulbVineBlock() { + super(15, true); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + return Lists.newArrayList(new ItemStack(EndItems.GLOWING_BULB)); + } + else if (MHelper.RANDOM.nextInt(8) == 0) { + return Lists.newArrayList(new ItemStack(EndBlocks.BULB_VINE_SEED)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + boolean canPlace = super.canSurvive(state, world, pos); + return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState(pos.below()).is(this); + } +} diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java new file mode 100644 index 00000000..d9d19915 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -0,0 +1,90 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndLanternBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable, BlockPatterned { + private static final VoxelShape SHAPE_CEIL = Block.box(4, 4, 4, 12, 16, 12); + private static final VoxelShape SHAPE_FLOOR = Block.box(4, 0, 4, 12, 12, 12); + + public BulbVineLanternBlock() { + this(FabricBlockSettings.of(Material.METAL) + .hardness(1) + .resistance(1) + .breakByTool(FabricToolTags.PICKAXES) + .materialColor(MaterialColor.COLOR_LIGHT_GRAY) + .luminance(15) + .requiresCorrectToolForDrops() + .sound(SoundType.LANTERN)); + } + + public BulbVineLanternBlock(Properties settings) { + super(settings); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + Map map = Maps.newHashMap(); + map.put("%glow%", getGlowTexture()); + map.put("%metal%", getMetalTexture(blockId)); + if (block.contains("item") || block.contains("ceil")) { + return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, map); + } + else { + return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, map); + } + } + + protected String getMetalTexture(ResourceLocation blockId) { + String name = blockId.getPath(); + name = name.substring(0, name.indexOf('_')); + return name + "_bulb_vine_lantern_metal"; + } + + protected String getGlowTexture() { + return "bulb_vine_lantern_bulb"; + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_BULB_LANTERN; + } +} diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java new file mode 100644 index 00000000..90d414b8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -0,0 +1,42 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider { + public BulbVineLanternColoredBlock(FabricBlockSettings settings) { + super(settings); + } + + @Override + public BlockColor getProvider() { + return (state, world, pos, tintIndex) -> { + return getColor(); + }; + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> { + return getColor(); + }; + } + + private int getColor() { + int color = BlocksHelper.getBlockColor(this); + int b = (color & 255); + int g = ((color >> 8) & 255); + int r = ((color >> 16) & 255); + float[] hsv = MHelper.fromRGBtoHSB(r, g, b); + return MHelper.fromHSBtoRGB(hsv[0], hsv[1], hsv[1] > 0.2 ? 1 : hsv[2]); + } + + @Override + protected String getGlowTexture() { + return "bulb_vine_lantern_overlay"; + } +} diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java new file mode 100644 index 00000000..38b5e60c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -0,0 +1,34 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; + +public class BulbVineSeedBlock extends EndPlantWithAgeBlock { + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState up = world.getBlockState(pos.above()); + return up.is(EndTags.GEN_TERRAIN) || up.is(BlockTags.LOGS) || up.is(BlockTags.LEAVES); + } + + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; + if (h > 2) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + for (int i = 1; i < h; i++) { + BlocksHelper.setWithoutUpdate(world, pos.below(i), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + } + BlocksHelper.setWithoutUpdate(world, pos.below(h), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java new file mode 100644 index 00000000..01565041 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; + +public class CavePumpkinBlock extends BlockBaseNotFull implements IRenderTypeable { + public static final BooleanProperty SMALL = BlockProperties.SMALL; + private static final VoxelShape SHAPE_SMALL; + private static final VoxelShape SHAPE_BIG; + + public CavePumpkinBlock() { + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); + registerDefaultState(defaultBlockState().setValue(SMALL, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SMALL); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return state.getValue(SMALL) ? SHAPE_SMALL : SHAPE_BIG; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); + } + + static { + VoxelShape lantern = Block.box(1, 0, 1, 15, 13, 15); + VoxelShape cap = Block.box(0, 12, 0, 16, 15, 16); + VoxelShape top = Block.box(5, 15, 5, 11, 16, 11); + SHAPE_BIG = Shapes.or(lantern, cap, top); + + lantern = Block.box(1, 7, 1, 15, 13, 15); + cap = Block.box(4, 12, 4, 12, 15, 12); + top = Block.box(6, 15, 6, 10, 16, 10); + SHAPE_SMALL = Shapes.or(lantern, cap, top); + } +} diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java new file mode 100644 index 00000000..c0898eb8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; + +public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.above()); + return isTerrain(down); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); + BlockState down = world.getBlockState(pos.below()); + if (down.getMaterial().isReplaceable() || (down.is(EndBlocks.CAVE_PUMPKIN) && down.getValue(BlockProperties.SMALL))) { + if (age < 3) { + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); + } + if (age == 2) { + world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, true)); + } + else if (age == 3) { + world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState()); + } + } + } + + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {} + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + state = super.updateShape(state, facing, neighborState, world, pos, neighborPos); + if (state.is(this) && state.getValue(BlockProperties.AGE) > 1) { + BlockState down = world.getBlockState(pos.below()); + if (!down.is(EndBlocks.CAVE_PUMPKIN)) { + state = state.setValue(BlockProperties.AGE, 1); + } + } + return state; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java new file mode 100644 index 00000000..36d883df --- /dev/null +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -0,0 +1,78 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class ChandelierBlock extends AttachedBlock implements IRenderTypeable, BlockPatterned { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public ChandelierBlock(Block source) { + super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + else if (block.contains("ceil")) { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_CEIL, blockId.getPath()); + } + else if (block.contains("wall")) { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_WALL, blockId.getPath()); + } + else { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_FLOOR, blockId.getPath()); + } + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_CHANDELIER; + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Block.box(5, 0, 5, 11, 13, 11)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.box(5, 3, 5, 11, 16, 11)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java new file mode 100644 index 00000000..f9878f5e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.blocks.basis.BlockBase; + +public class CharcoalBlock extends BlockBase { + public CharcoalBlock() { + super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); + FuelRegistry.INSTANCE.add(this, 16000); + } +} diff --git a/src/main/java/ru/betterend/blocks/CharniaBlock.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java new file mode 100644 index 00000000..86d510d6 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -0,0 +1,15 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; + +public class CharniaBlock extends UnderwaterPlantBlock { + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return canSupportCenter(world, pos.below(), Direction.UP) && world.getFluidState(pos).getType() == Fluids.WATER; + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockChorusGrass.java b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java similarity index 50% rename from src/main/java/ru/betterend/blocks/BlockChorusGrass.java rename to src/main/java/ru/betterend/blocks/ChorusGrassBlock.java index c9cfefc3..71635d36 100644 --- a/src/main/java/ru/betterend/blocks/BlockChorusGrass.java +++ b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import ru.betterend.blocks.basis.BlockPlant; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockChorusGrass extends BlockPlant { - public BlockChorusGrass() { +public class ChorusGrassBlock extends EndPlantBlock { + public ChorusGrassBlock() { super(true); } diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java new file mode 100644 index 00000000..17d6a839 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -0,0 +1,38 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class DenseEmeraldIceBlock extends BlockBase implements IRenderTypeable { + public DenseEmeraldIceBlock() { + super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java new file mode 100644 index 00000000..f124f539 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java @@ -0,0 +1,12 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; + +public class DenseSnowBlock extends BlockBase { + public DenseSnowBlock() { + super(FabricBlockSettings.of(Material.SNOW).strength(0.2F).sound(SoundType.SNOW)); + } +} diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java new file mode 100644 index 00000000..30494c1f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class DragonTreeSaplingBlock extends FeatureSaplingBlock { + public DragonTreeSaplingBlock() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.DRAGON_TREE.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS); + } +} diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java new file mode 100644 index 00000000..754dab66 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -0,0 +1,105 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import org.jetbrains.annotations.Nullable; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HalfTransparentBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTypeable, BlockPatterned { + public EmeraldIceBlock() { + super(FabricBlockSettings.copyOf(Blocks.ICE)); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { + super.playerDestroy(world, player, pos, state, blockEntity, stack); + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack) == 0) { + if (world.dimensionType().ultraWarm()) { + world.removeBlock(pos, false); + return; + } + + Material material = world.getBlockState(pos.below()).getMaterial(); + if (material.blocksMotion() || material.isLiquid()) { + world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); + } + } + + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11 - state.getLightBlock(world, pos)) { + this.melt(state, world, pos); + } + + } + + protected void melt(BlockState state, Level world, BlockPos pos) { + if (world.dimensionType().ultraWarm()) { + world.removeBlock(pos, false); + } + else { + world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); + world.neighborChanged(pos, Blocks.WATER, pos); + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java new file mode 100644 index 00000000..0988db53 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -0,0 +1,118 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; + +public class EndLilyBlock extends UnderwaterPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 16, 12); + private static final VoxelShape SHAPE_TOP = Block.box(2, 0, 2, 14, 6, 14); + + public EndLilyBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0) + .noCollission()); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return state.getValue(SHAPE) == TripleShape.TOP ? Blocks.AIR.defaultBlockState() : Blocks.WATER.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + VoxelShape shape = state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; + return shape.move(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultFluidState() : Fluids.WATER.getSource(false); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + if (state.getValue(SHAPE) == TripleShape.TOP) { + return world.getBlockState(pos.below()).getBlock() == this; + } + else if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + return isTerrain(world.getBlockState(pos.below())); + } + else { + BlockState up = world.getBlockState(pos.above()); + BlockState down = world.getBlockState(pos.below()); + return up.getBlock() == this && down.getBlock() == this; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.TOP) { + return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + } + return Collections.emptyList(); + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.END_LILY_SEED); + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java new file mode 100644 index 00000000..9bcdf0ec --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -0,0 +1,34 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { + @Override + public void grow(WorldGenLevel world, Random random, BlockPos pos) { + if (canGrow(world, pos)) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); + BlockPos up = pos.above(); + while (world.getFluidState(up).isSource()) { + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); + up = up.above(); + } + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.TOP)); + } + } + + private boolean canGrow(WorldGenLevel world, BlockPos pos) { + BlockPos up = pos.above(); + while (world.getBlockState(up).getFluidState().getType().equals(Fluids.WATER.getSource())) { + up = up.above(); + } + return world.isEmptyBlock(up); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java new file mode 100644 index 00000000..58a56cc7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -0,0 +1,63 @@ +package ru.betterend.blocks; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class EndLotusFlowerBlock extends EndPlantBlock { + private static final VoxelShape SHAPE_OUTLINE = Block.box(2, 0, 2, 14, 14, 14); + private static final VoxelShape SHAPE_COLLISION = Block.box(0, 0, 0, 16, 2, 16); + + public EndLotusFlowerBlock() { + super(FabricBlockSettings.of(Material.PLANT).luminance(15).noOcclusion()); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_LOTUS_STEM); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE_OUTLINE; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE_COLLISION; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + int count = MHelper.randRange(1, 2, MHelper.RANDOM); + return Lists.newArrayList(new ItemStack(EndBlocks.END_LOTUS_SEED, count)); + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.END_LOTUS_SEED); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java new file mode 100644 index 00000000..f2167e6a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -0,0 +1,75 @@ +package ru.betterend.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.WaterFluid; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class EndLotusLeafBlock extends BlockBaseNotFull implements IRenderTypeable { + public static final EnumProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final VoxelShape VSHAPE = Block.box(0, 0, 0, 16, 1, 16); + + public EndLotusLeafBlock() { + super(FabricBlockSettings.of(Material.PLANT).noOcclusion().sound(SoundType.WET_GRASS)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + return !down.getFluidState().isEmpty() && down.getFluidState().getType() instanceof WaterFluid; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(SHAPE, HORIZONTAL_FACING); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return VSHAPE; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.END_LOTUS_SEED); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java new file mode 100644 index 00000000..b9b8fb4d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -0,0 +1,118 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { + @Override + public void grow(WorldGenLevel world, Random random, BlockPos pos) { + if (canGrow(world, pos)) { + BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.LEAF, true); + BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).setValue(EndLotusStemBlock.WATERLOGGED, true); + BlockState stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); + BlockState flower = EndBlocks.END_LOTUS_FLOWER.defaultBlockState(); + + BlocksHelper.setWithoutUpdate(world, pos, roots); + MutableBlockPos bpos = new MutableBlockPos().set(pos); + bpos.setY(bpos.getY() + 1); + while (world.getFluidState(bpos).isSource()) { + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.WATERLOGGED, true)); + bpos.setY(bpos.getY() + 1); + } + + int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; + TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; + Direction dir = BlocksHelper.randomHorizontal(random); + BlockPos leafCenter = bpos.immutable().relative(dir); + if (hasLeaf(world, leafCenter)) { + generateLeaf(world, leafCenter); + BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.setValue(EndLotusStemBlock.SHAPE, shape).setValue(EndLotusStemBlock.FACING, dir)); + } + else { + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, shape)); + } + + bpos.setY(bpos.getY() + 1); + for (int i = 1; i <= height; i++) { + if (!world.isEmptyBlock(bpos)) { + bpos.setY(bpos.getY() - 1); + BlocksHelper.setWithoutUpdate(world, bpos, flower); + bpos.setY(bpos.getY() - 1); + stem = world.getBlockState(bpos); + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, TripleShape.TOP)); + return; + } + BlocksHelper.setWithoutUpdate(world, bpos, stem); + bpos.setY(bpos.getY() + 1); + } + + if (!world.isEmptyBlock(bpos) || height < 0) { + bpos.setY(bpos.getY() - 1); + } + + BlocksHelper.setWithoutUpdate(world, bpos, flower); + bpos.setY(bpos.getY() - 1); + stem = world.getBlockState(bpos); + if (!stem.is(EndBlocks.END_LOTUS_STEM)) { + stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); + if (!world.getBlockState(bpos.north()).getFluidState().isEmpty()) { + stem = stem.setValue(EndLotusStemBlock.WATERLOGGED, true); + } + } + + if (world.getBlockState(bpos.relative(dir)).is(EndBlocks.END_LOTUS_LEAF)) { + stem = stem.setValue(EndLotusStemBlock.LEAF, true).setValue(EndLotusStemBlock.FACING, dir); + } + + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, TripleShape.TOP)); + } + } + + private boolean canGrow(WorldGenLevel world, BlockPos pos) { + MutableBlockPos bpos = new MutableBlockPos(); + bpos.set(pos); + while (world.getBlockState(bpos).getFluidState().getType().equals(Fluids.WATER.getSource())) { + bpos.setY(bpos.getY() + 1); + } + return world.isEmptyBlock(bpos) && world.isEmptyBlock(bpos.above()); + } + + private void generateLeaf(WorldGenLevel world, BlockPos pos) { + MutableBlockPos p = new MutableBlockPos(); + BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); + BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); + for (Direction move: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + } + for (int i = 0; i < 4; i ++) { + Direction d1 = BlocksHelper.HORIZONTAL[i]; + Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + } + } + + private boolean hasLeaf(WorldGenLevel world, BlockPos pos) { + MutableBlockPos p = new MutableBlockPos(); + p.setY(pos.getY()); + int count = 0; + for (int x = -1; x < 2; x ++) { + p.setX(pos.getX() + x); + for (int z = -1; z < 2; z ++) { + p.setZ(pos.getZ() + z); + if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) + count ++; + } + } + return count == 9; + } +} diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java new file mode 100644 index 00000000..f007e202 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -0,0 +1,96 @@ +package ru.betterend.blocks; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.util.BlocksHelper; + +public class EndLotusStemBlock extends BlockBase implements SimpleWaterloggedBlock, IRenderTypeable { + public static final EnumProperty FACING = BlockStateProperties.FACING; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final BooleanProperty LEAF = BooleanProperty.create("leaf"); + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final Map SHAPES = Maps.newEnumMap(Axis.class); + + public EndLotusStemBlock() { + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); + this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.getValue(FACING).getAxis()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING, WATERLOGGED, SHAPE, LEAF); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelAccessor worldAccess = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if ((Boolean) state.getValue(WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + return state; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + static { + SHAPES.put(Axis.X, Block.box(0, 6, 6, 16, 10, 10)); + SHAPES.put(Axis.Y, Block.box(6, 0, 6, 10, 16, 10)); + SHAPES.put(Axis.Z, Block.box(6, 6, 0, 10, 10, 16)); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java new file mode 100644 index 00000000..0f24bb7f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.patterns.Patterns; + +public class EndPathBlock extends BlockBaseNotFull { + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 15, 16); + + public EndPathBlock(Block source) { + super(FabricBlockSettings.copyOf(source).isValidSpawn((state, world, pos, type) -> { return false; })); + if (source instanceof EndTerrainBlock) { + EndTerrainBlock terrain = (EndTerrainBlock) source; + terrain.setPathBlock(this); + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.END_STONE)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public String getModelPattern(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", name + "_top"); + map.put("%side%", name.replace("_path", "") + "_side"); + return Patterns.createJson(Patterns.BLOCK_PATH, map); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_ROTATED_TOP; + } +} diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index 54517efa..b626629a 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -3,14 +3,14 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; -public class EndPedestal extends BlockPedestal { +public class EndPedestal extends PedestalBlock { public EndPedestal(Block parent) { super(parent); @@ -18,7 +18,7 @@ public class EndPedestal extends BlockPedestal { @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath(); Map textures = new HashMap() { private static final long serialVersionUID = 1L; diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 27672179..5ae29c24 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,49 +1,68 @@ package ru.betterend.blocks; +import java.util.Objects; import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.NetherPortalBlock; -import net.minecraft.entity.Entity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.NetherPortalBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndPortals; +import ru.betterend.rituals.EternalRitual; + +public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { + public static final IntegerProperty PORTAL = BlockProperties.PORTAL; -public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable { public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(state -> { - return 12; - })); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(PORTAL); } @Override @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(100) == 0) { - world.playSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.BLOCK_PORTAL_AMBIENT, SoundCategory.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); + world.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.PORTAL_AMBIENT, SoundSource.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); } double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble(); double z = pos.getZ() + random.nextDouble(); int k = random.nextInt(2) * 2 - 1; - if (!world.getBlockState(pos.west()).isOf(this) && !world.getBlockState(pos.east()).isOf(this)) { + if (!world.getBlockState(pos.west()).is(this) && !world.getBlockState(pos.east()).is(this)) { x = pos.getX() + 0.5D + 0.25D * k; } else { z = pos.getZ() + 0.5D + 0.25D * k; @@ -53,111 +72,121 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {} + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) {} @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { return state; } @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { - TeleportingEntity teleEntity = TeleportingEntity.class.cast(entity); - if (teleEntity.hasCooldown()) return; - boolean isOverworld = world.getRegistryKey().equals(World.OVERWORLD); - ServerWorld destination = ((ServerWorld) world).getServer().getWorld(isOverworld ? World.END : World.OVERWORLD); - BlockPos exitPos = this.findExitPos(destination, pos, entity); - if (exitPos == null) return; - if (entity instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entity; - player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, entity.yaw, entity.pitch); - teleEntity.beSetCooldown(player.isCreative() ? 50 : 300); - } else { - teleEntity.beSetExitPos(exitPos); - entity.moveToWorld(destination); - teleEntity.beSetCooldown(300); + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { + if (world.isClientSide || !validate(entity)) return; + entity.setPortalCooldown(); + ServerLevel currentWorld = (ServerLevel) world; + MinecraftServer server = currentWorld.getServer(); + ServerLevel targetWorld = EndPortals.getWorld(server, state.getValue(PORTAL)); + boolean isInEnd = currentWorld.dimension().equals(Level.END); + ServerLevel destination = isInEnd ? targetWorld : server.getLevel(Level.END); + BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); + if (exitPos == null) return; + if (entity instanceof ServerPlayer) { + ServerPlayer player = (ServerPlayer) entity; + teleportPlayer(player, destination, exitPos); + } else { + TeleportingEntity teleEntity = (TeleportingEntity) entity; + teleEntity.be_setExitPos(exitPos); + Entity teleported = entity.changeDimension(destination); + if (teleported != null) { + teleported.setPortalCooldown(); } } } + + private boolean validate(Entity entity) { + return !entity.isPassenger() && !entity.isVehicle() && + entity.canChangeDimensions() && !entity.isOnPortalCooldown(); + } + + private void teleportPlayer(ServerPlayer player, ServerLevel destination, BlockPos exitPos) { + if (player.isCreative()) { + player.teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yRot, player.xRot); + } else { + TeleportingEntity teleEntity = (TeleportingEntity) player; + teleEntity.be_setExitPos(exitPos); + player.changeDimension(destination); + } + } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - private BlockPos findExitPos(ServerWorld world, BlockPos pos, Entity entity) { - Registry registry = world.getRegistryManager().getDimensionTypes(); - double mult = registry.get(DimensionType.THE_END_ID).getCoordinateScale(); - BlockPos.Mutable basePos; - if (world.getRegistryKey().equals(World.OVERWORLD)) { - basePos = pos.mutableCopy().set(pos.getX() / mult, pos.getY(), pos.getZ() / mult); - } else { - basePos = pos.mutableCopy().set(pos.getX() * mult, pos.getY(), pos.getZ() * mult); - } - Direction direction = Direction.EAST; - BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { - for (int i = 0; i < step; i++) { - checkPos.setY(5); - while(checkPos.getY() < world.getHeight()) { - BlockState state = world.getBlockState(checkPos); - if(state.isOf(this)) { - int offStep; - checkPos = this.findCenter(world, checkPos, state.get(AXIS)); - if (state.get(AXIS).equals(Direction.Axis.X)) { - if (entity.getMovementDirection().getAxis() == Direction.Axis.X) { - offStep = entity.getMovementDirection() == Direction.EAST ? 1 : -1; - float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); - entity.yaw = rotation; - } else { - offStep = entity.getMovementDirection() == Direction.NORTH ? 1 : -1; - } - return checkPos.add(0, 0, offStep); - } else { - if (entity.getMovementDirection().getAxis() == Direction.Axis.Z) { - offStep = entity.getMovementDirection() == Direction.SOUTH ? -1 : 1; - float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); - entity.yaw = rotation; - } else { - offStep = entity.getMovementDirection() == Direction.EAST ? 1 : -1; - } - return checkPos.add(offStep, 0, 0); - } - } - checkPos.move(Direction.UP); - } - checkPos.move(direction); + private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { + if (targetWorld == null) return null; + Registry registry = targetWorld.registryAccess().dimensionTypes(); + ResourceLocation targetWorldId = targetWorld.dimension().location(); + ResourceLocation currentWorldId = currentWorld.dimension().location(); + double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); + double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).coordinateScale(); + double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; + BlockPos.MutableBlockPos basePos = currentPos.mutable().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); + BlockPos.MutableBlockPos checkPos = basePos.mutable(); + BlockState currentState = currentWorld.getBlockState(currentPos); + int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1; + checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.is(this) && + state.getValue(PORTAL).equals(currentState.getValue(PORTAL))); + if (checkPos != null) { + BlockState checkState = targetWorld.getBlockState(checkPos); + Axis axis = checkState.getValue(AXIS); + checkPos = findCenter(targetWorld, checkPos, axis); + Direction frontDir = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE).getClockWise(); + Direction entityDir = entity.getMotionDirection(); + if (entityDir.getAxis().isVertical()) { + entityDir = frontDir; } - direction = direction.rotateYClockwise(); + if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { + entity.rotate(Rotation.CLOCKWISE_90); + entityDir = entityDir.getClockWise(); + } + return checkPos.relative(entityDir); } return null; } - private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis) { + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis) { + return findCenter(world, pos, axis, 1); + } + + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis, int step) { + if (step > 8) return pos; BlockState right, left; Direction rightDir, leftDir; - if (axis == Direction.Axis.X) { - right = world.getBlockState(pos.east()); - left = world.getBlockState(pos.west()); - rightDir = Direction.EAST; - leftDir = Direction.WEST; - } else { - right = world.getBlockState(pos.south()); - left = world.getBlockState(pos.north()); - rightDir = Direction.SOUTH; - leftDir = Direction.NORTH; - } - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(this)) { - return findCenter(world, pos.move(Direction.DOWN), axis); - } else if (right.isOf(this) && left.isOf(this)) { + rightDir = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); + leftDir = rightDir.getOpposite(); + right = world.getBlockState(pos.relative(rightDir)); + left = world.getBlockState(pos.relative(leftDir)); + BlockState down = world.getBlockState(pos.below()); + if (down.is(this)) { + return findCenter(world, pos.move(Direction.DOWN), axis, step); + } else if (right.is(this) && left.is(this)) { return pos; - } else if (right.isOf(this)) { - return findCenter(world, pos.move(rightDir), axis); - } else if (left.isOf(this)) { - return findCenter(world, pos.move(leftDir), axis); + } else if (right.is(this)) { + return findCenter(world, pos.move(rightDir), axis, ++step); + } else if (left.is(this)) { + return findCenter(world, pos.move(leftDir), axis, ++step); } return pos; } + + @Override + public BlockColor getProvider() { + return (state, world, pos, tintIndex) -> EndPortals.getColor(state.getValue(PORTAL)); + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> EndPortals.getColor(0); + } } diff --git a/src/main/java/ru/betterend/blocks/EndStoneBlock.java b/src/main/java/ru/betterend/blocks/EndStoneBlock.java new file mode 100644 index 00000000..db65cd45 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndStoneBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BlockBase; + +public class EndStoneBlock extends BlockBase { + public EndStoneBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(SoundType.STONE)); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 533f653b..4e326c72 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,138 +1,151 @@ package ru.betterend.blocks; -import java.util.Collections; import java.util.List; import java.util.Random; +import com.google.common.collect.Lists; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; import ru.betterend.blocks.basis.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; public class EndStoneSmelter extends BaseBlockWithEntity { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - public static final BooleanProperty LIT = Properties.LIT; + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty LIT = BlockStateProperties.LIT; public static final String ID = "end_stone_smelter"; public EndStoneSmelter() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.GRAY) + super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) .hardness(4F) .resistance(100F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); - this.setDefaultState(this.stateManager.getDefaultState() - .with(FACING, Direction.NORTH) - .with(LIT, false)); + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); + this.registerDefaultState(this.stateDefinition.any() + .setValue(FACING, Direction.NORTH) + .setValue(LIT, false)); } - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient) { - return ActionResult.SUCCESS; + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (world.isClientSide) { + return InteractionResult.SUCCESS; } else { this.openScreen(world, pos, player); - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } } - private void openScreen(World world, BlockPos pos, PlayerEntity player) { + private void openScreen(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EndStoneSmelterBlockEntity) { - player.openHandledScreen((EndStoneSmelterBlockEntity) blockEntity); + player.openMenu((EndStoneSmelterBlockEntity) blockEntity); } } @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(FACING, ctx.getPlayerFacing().getOpposite()); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new EndStoneSmelterBlockEntity(); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = Lists.newArrayList(new ItemStack(this)); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (blockEntity instanceof EndStoneSmelterBlockEntity) { + EndStoneSmelterBlockEntity smelterBlockEntity = (EndStoneSmelterBlockEntity) blockEntity; + for (int i = 0; i < smelterBlockEntity.getContainerSize(); i++) { + ItemStack item = smelterBlockEntity.getItem(i); + if (!item.isEmpty()) { + drop.add(item); + } + } + } + return drop; } @Override - public boolean hasComparatorOutput(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorOutput(BlockState state, World world, BlockPos pos) { + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { //TODO - return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)); + return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(world.getBlockEntity(pos)); } @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; } @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return (BlockState)state.with(FACING, rotation.rotate((Direction)state.get(FACING))); + public BlockState rotate(BlockState state, Rotation rotation) { + return (BlockState)state.setValue(FACING, rotation.rotate((Direction)state.getValue(FACING))); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return state.rotate(mirror.getRotation((Direction)state.get(FACING))); + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation((Direction)state.getValue(FACING))); } @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, LIT); } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - if (state.get(LIT)) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + if (state.getValue(LIT)) { double x = pos.getX() + 0.5D; double y = pos.getY(); double z = pos.getZ() + 0.5D; if (random.nextDouble() < 0.1D) { - world.playSound(x, y, z, SoundEvents.BLOCK_BLASTFURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false); + world.playLocalSound(x, y, z, SoundEvents.BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, false); } - Direction direction = (Direction)state.get(FACING); + Direction direction = (Direction)state.getValue(FACING); Direction.Axis axis = direction.getAxis(); double defOffset = random.nextDouble() * 0.6D - 0.3D; - double offX = axis == Direction.Axis.X ? direction.getOffsetX() * 0.52D : defOffset; + double offX = axis == Direction.Axis.X ? direction.getStepX() * 0.52D : defOffset; double offY = random.nextDouble() * 9.0D / 16.0D; - double offZ = axis == Direction.Axis.Z ? direction.getOffsetZ() * 0.52D : defOffset; + double offZ = axis == Direction.Axis.Z ? direction.getStepZ() * 0.52D : defOffset; world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D); } } diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java new file mode 100644 index 00000000..ae1840ea --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -0,0 +1,111 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.patterns.Patterns; + +public class EndTerrainBlock extends BlockBase { + private Block pathBlock; + + public EndTerrainBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(BlockSounds.TERRAIN_SOUND).randomTicks()); + } + + public void setPathBlock(Block roadBlock) { + this.pathBlock = roadBlock; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (pathBlock != null && player.getMainHandItem().getItem().is(FabricToolTags.SHOVELS)) { + world.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlockAndUpdate(pos, pathBlock.defaultBlockState()); + if (!player.isCreative()) { + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); + } + } + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.END_STONE)); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canStay(state, world, pos)) { + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); + } + } + + public boolean canStay(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } + + @Override + public String getModelPattern(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_ROTATED_TOP; + } +} diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 1b80fabd..bb20eb58 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -3,26 +3,26 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; public class EnderBlock extends BlockBase { public EnderBlock() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708) + super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK) .hardness(5F) .resistance(6F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); } @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { + public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF005548; } } diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java new file mode 100644 index 00000000..ef5b51cc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -0,0 +1,38 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.util.MHelper; + +public class EndstoneDustBlock extends FallingBlock { + @Environment(EnvType.CLIENT) + private static final int COLOR = MHelper.color(226, 239, 168); + + public EndstoneDustBlock() { + super(FabricBlockSettings.copyOf(Blocks.SAND) + .breakByTool(FabricToolTags.SHOVELS) + .materialColor(Blocks.END_STONE.defaultMaterialColor())); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Environment(EnvType.CLIENT) + public int getDustColor(BlockState state, BlockGetter world, BlockPos pos) { + return COLOR; + } +} diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index 12333694..8d057510 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -4,122 +4,127 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.explosion.Explosion; -import ru.betterend.blocks.basis.BlockPedestal; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; -public class EternalPedestal extends BlockPedestal { +public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public EternalPedestal() { super(EndBlocks.FLAVOLITE_RUNED_ETERNAL); - this.setDefaultState(this.getDefaultState().with(ACTIVATED, false)); + this.registerDefaultState(defaultBlockState().setValue(ACTIVATED, false)); } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult result = super.onUse(state, world, pos, player, hand, hit); - if (result.equals(ActionResult.SUCCESS)) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof EternalPedestalEntity) { - EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; - BlockState updatedState = world.getBlockState(pos); - if (pedestal.isEmpty() && updatedState.get(ACTIVATED)) { - if (pedestal.hasRitual()) { - EternalRitual ritual = pedestal.getRitual(); - ritual.removePortal(); - } - world.setBlockState(pos, updatedState.with(ACTIVATED, false)); - } else { - ItemStack itemStack = pedestal.getStack(0); - if (itemStack.getItem() == EndItems.ETERNAL_CRYSTAL) { - world.setBlockState(pos, updatedState.with(ACTIVATED, true)); - if (pedestal.hasRitual()) { - pedestal.getRitual().checkStructure(); + public void checkRitual(Level world, BlockPos pos) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EternalPedestalEntity) { + EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; + BlockState updatedState = world.getBlockState(pos); + if (pedestal.isEmpty()) { + if (pedestal.hasRitual()) { + EternalRitual ritual = pedestal.getRitual(); + if (ritual.isActive()) { + ResourceLocation targetWorld = ritual.getTargetWorldId(); + int portalId; + if (targetWorld != null) { + portalId = EndPortals.getPortalIdByWorld(targetWorld); } else { - EternalRitual ritual = new EternalRitual(world, pos); - ritual.checkStructure(); + portalId = EndPortals.getPortalIdByWorld(EndPortals.OVERWORLD_ID); } + ritual.disablePortal(portalId); + } + } + world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, false).setValue(HAS_LIGHT, false)); + } else { + ItemStack itemStack = pedestal.getItem(0); + ResourceLocation id = Registry.ITEM.getKey(itemStack.getItem()); + if (EndPortals.isAvailableItem(id)) { + world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true)); + if (pedestal.hasRitual()) { + pedestal.getRitual().checkStructure(); + } else { + EternalRitual ritual = new EternalRitual(world, pos); + ritual.checkStructure(); } } } } - return result; } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - BlockState updated = super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); - if (!updated.isOf(this)) return updated; + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + BlockState updated = super.updateShape(state, direction, newState, world, pos, posFrom); + if (!updated.is(this)) return updated; if (!this.isPlaceable(updated)) { - return updated.with(ACTIVATED, false); + return updated.setValue(ACTIVATED, false); } return updated; } @Override - public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { + public float getDestroyProgress(BlockState state, Player player, BlockGetter world, BlockPos pos) { return 0.0F; } @Override - public float getBlastResistance() { - return Blocks.BEDROCK.getBlastResistance(); + public float getExplosionResistance() { + return Blocks.BEDROCK.getExplosionResistance(); } @Override - public boolean shouldDropItemsOnExplosion(Explosion explosion) { + public boolean dropFromExplosion(Explosion explosion) { return false; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.isOf(this)) { - BlockProperties.PedestalState currentState = state.get(BlockProperties.PEDESTAL_STATE); + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.is(this)) { + BlockProperties.PedestalState currentState = state.getValue(BlockProperties.PEDESTAL_STATE); if (currentState.equals(BlockProperties.PedestalState.BOTTOM) || currentState.equals(BlockProperties.PedestalState.PILLAR)) { return Lists.newArrayList(); } } List drop = Lists.newArrayList(); - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); - if (blockEntity != null && blockEntity instanceof EternalPedestalEntity) { + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; if (!pedestal.isEmpty()) { - drop.add(pedestal.getStack(0)); + drop.add(pedestal.getItem(0)); } } return drop; } @Override - protected void appendProperties(StateManager.Builder stateManager) { - super.appendProperties(stateManager); + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); stateManager.add(ACTIVATED); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new EternalPedestalEntity(); } } diff --git a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java index e8fd7644..be662a47 100644 --- a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java @@ -4,34 +4,34 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.explosion.Explosion; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; public class EternalRunedFlavolite extends RunedFlavolite { @Override - public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { + public float getDestroyProgress(BlockState state, Player player, BlockGetter world, BlockPos pos) { return 0.0F; } @Override - public float getBlastResistance() { - return Blocks.BEDROCK.getBlastResistance(); + public float getExplosionResistance() { + return Blocks.BEDROCK.getExplosionResistance(); } @Override - public boolean shouldDropItemsOnExplosion(Explosion explosion) { + public boolean dropFromExplosion(Explosion explosion) { return false; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(); } } diff --git a/src/main/java/ru/betterend/blocks/FilaluxBlock.java b/src/main/java/ru/betterend/blocks/FilaluxBlock.java new file mode 100644 index 00000000..d9c8b473 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FilaluxBlock.java @@ -0,0 +1,15 @@ +package ru.betterend.blocks; + +import net.minecraft.world.level.block.state.BlockBehaviour; +import ru.betterend.blocks.basis.VineBlock; + +public class FilaluxBlock extends VineBlock { + public FilaluxBlock() { + super(15, true); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java new file mode 100644 index 00000000..692ae394 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; + +public class FilaluxLanternBlock extends BlockBase { + public FilaluxLanternBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WOOD)); + } +} diff --git a/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java new file mode 100644 index 00000000..b9721334 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class FilaluxWingsBlock extends AttachedBlock implements IRenderTypeable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public FilaluxWingsBlock() { + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sound(SoundType.WET_GRASS).noCollission()); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java new file mode 100644 index 00000000..bba1a69d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -0,0 +1,63 @@ +package ru.betterend.blocks; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.interfaces.ISpetialItem; + +public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); + + public FlamaeaBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS)); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(Blocks.WATER); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } + + @Override + public int getStackSize() { + return 64; + } + + @Override + public boolean canPlaceOnWater() { + return true; + } +} diff --git a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java new file mode 100644 index 00000000..c6a01f77 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; + +public class GlowingHymenophoreBlock extends BlockBase { + public GlowingHymenophoreBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); + } +} diff --git a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java new file mode 100644 index 00000000..22191437 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -0,0 +1,30 @@ +package ru.betterend.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class GlowingMossBlock extends EndPlantBlock { + public GlowingMossBlock(int light) { + super(light); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + } + + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java new file mode 100644 index 00000000..3eeb97ce --- /dev/null +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -0,0 +1,52 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; + +public class GlowingPillarLuminophorBlock extends BlockBase { + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; + + public GlowingPillarLuminophorBlock() { + super(FabricBlockSettings.of(Material.LEAVES) + .materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .strength(0.2F) + .luminance(15) + .sound(SoundType.GRASS)); + this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return !state.getValue(NATURAL) || world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(NATURAL); + } +} diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java new file mode 100644 index 00000000..4057fa93 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -0,0 +1,34 @@ +package ru.betterend.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.UpDownPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class GlowingPillarRootsBlock extends UpDownPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.AMBER_MOSS); + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.GLOWING_PILLAR_SEED); + } +} diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java new file mode 100644 index 00000000..8a239f8a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -0,0 +1,75 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { + public GlowingPillarSeedBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel(state -> state.getValue(AGE) * 3 + 3) + .randomTicks() + .noCollission()); + } + + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + int height = MHelper.randRange(1, 2, random); + int h = BlocksHelper.upRay(world, pos, height + 2); + if (h < height) { + return; + } + + MutableBlockPos mut = new MutableBlockPos().set(pos); + BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.defaultBlockState(); + if (height < 2) { + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + mut.move(Direction.UP); + } + else { + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + mut.move(Direction.UP); + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + mut.move(Direction.UP); + } + BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir: BlocksHelper.DIRECTIONS) { + pos = mut.relative(dir); + if (world.isEmptyBlock(pos)) { + BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); + } + } + mut.move(Direction.UP); + if (world.isEmptyBlock(mut)) { + BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP)); + } + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.AMBER_MOSS); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java new file mode 100644 index 00000000..453af173 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -0,0 +1,92 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { + public static final IntegerProperty COLOR = BlockProperties.COLOR; + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + + public HelixTreeLeavesBlock() { + super(FabricBlockSettings.of(Material.LEAVES) + .materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .sound(SoundType.WART_BLOCK) + .sound(SoundType.GRASS) + .strength(0.2F)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(COLOR); + } + + @Override + public BlockColor getProvider() { + return (state, world, pos, tintIndex) -> { + return MHelper.color(237, getGreen(state.getValue(COLOR)), 20); + }; + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> { + return MHelper.color(237, getGreen(4), 20); + }; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + private int getGreen(int color) { + float delta = color / 7F; + return (int) Mth.lerp(delta, 80, 158); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null) { + if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (MHelper.RANDOM.nextInt(16) <= fortune) { + return Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)); + } + return Lists.newArrayList(); + } + return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists.newArrayList(); + } +} diff --git a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java new file mode 100644 index 00000000..283cd3dc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java @@ -0,0 +1,12 @@ +package ru.betterend.blocks; + +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndFeatures; + +public class HelixTreeSaplingBlock extends FeatureSaplingBlock { + @Override + protected Feature getFeature() { + return EndFeatures.HELIX_TREE.getFeature(); + } +} diff --git a/src/main/java/ru/betterend/blocks/HydraluxBlock.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java new file mode 100644 index 00000000..17d64d4e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -0,0 +1,90 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.blocks.BlockProperties.HydraluxShape; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; + +public class HydraluxBlock extends UnderwaterPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.HYDRALUX_SHAPE; + + public HydraluxBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0) + .noCollission()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + HydraluxShape shape = state.getValue(SHAPE); + if (shape == HydraluxShape.FLOWER_BIG_TOP || shape == HydraluxShape.FLOWER_SMALL_TOP) { + return down.is(this); + } + else if (shape == HydraluxShape.ROOTS) { + return down.is(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.above()).is(this); + } + else { + return down.is(this) && world.getBlockState(pos.above()).is(this); + } + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.HYDRALUX_SAPLING); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + HydraluxShape shape = state.getValue(SHAPE); + if (shape == HydraluxShape.FLOWER_BIG_BOTTOM || shape == HydraluxShape.FLOWER_SMALL_BOTTOM) { + return Lists.newArrayList(new ItemStack(EndItems.HYDRALUX_PETAL, MHelper.randRange(1, 4, MHelper.RANDOM))); + } + else if (shape == HydraluxShape.ROOTS) { + return Lists.newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java new file mode 100644 index 00000000..0d5ded08 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -0,0 +1,30 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BlockBase; + +public class HydraluxPetalBlock extends BlockBase { + public HydraluxPetalBlock() { + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.AXES) + .breakByHand(true) + .hardness(1) + .resistance(1) + .materialColor(MaterialColor.PODZOL) + .sound(SoundType.WART_BLOCK)); + } + + public HydraluxPetalBlock(Properties settings) { + super(settings); + } + + @Override + public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {} +} diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java similarity index 56% rename from src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java rename to src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index a0ab719a..89cb5897 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -3,28 +3,29 @@ package ru.betterend.blocks; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.resources.ResourceLocation; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; +import ru.betterend.util.BlocksHelper; -public class BlockHydraluxPetalColored extends BlockHydraluxPetal implements IColorProvider { - public BlockHydraluxPetalColored(FabricBlockSettings settings) { +public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements IColorProvider { + public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } @Override - public BlockColorProvider getProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return BlocksHelper.getBlockColor(this); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return BlocksHelper.getBlockColor(this); }; } @@ -41,7 +42,7 @@ public class BlockHydraluxPetalColored extends BlockHydraluxPetal implements ICo } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_DIRECT; } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java new file mode 100644 index 00000000..2d69864b --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -0,0 +1,49 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.BlockProperties.HydraluxShape; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { + @Override + public void grow(WorldGenLevel world, Random random, BlockPos pos) { + int h = MHelper.randRange(4, 8, random); + MutableBlockPos mut = new MutableBlockPos().set(pos); + + for (int i = 1; i < h; i++) { + mut.setY(pos.getY() + i); + if (!world.getBlockState(mut).is(Blocks.WATER)) { + return; + } + } + + mut.setY(pos.getY()); + BlockState state = EndBlocks.HYDRALUX.defaultBlockState(); + BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); + for (int i = 1; i < h - 2; i++) { + mut.setY(pos.getY() + i); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); + } + + mut.setY(mut.getY() + 1); + boolean big = random.nextBoolean(); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); + + mut.setY(mut.getY() + 1); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.SULPHURIC_ROCK.stone); + } +} diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java new file mode 100644 index 00000000..e8b39590 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -0,0 +1,144 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import org.jetbrains.annotations.Nullable; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndParticles; +import ru.betterend.util.BlocksHelper; + +public class HydrothermalVentBlock extends BlockBaseNotFull implements EntityBlock, LiquidBlockContainer, SimpleWaterloggedBlock { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; + private static final VoxelShape SHAPE = Block.box(1, 1, 1, 15, 16, 15); + + public HydrothermalVentBlock() { + super(FabricBlockSettings.of(Material.STONE) + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.STONE) + .noCollission() + .requiresCorrectToolForDrops()); + this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, true).setValue(ACTIVATED, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(WATERLOGGED, ACTIVATED); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + state = world.getBlockState(pos.below()); + return state.is(EndBlocks.SULPHURIC_ROCK.stone); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.WATER.defaultBlockState(); + } + else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { + world.getBlockTicks().scheduleTick(pos, this, 20); + } + return state; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelAccessor worldAccess = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) { + return new BlockEntityHydrothermalVent(); + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + BlockPos up = pos.above(); + if (world.getBlockState(up).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); + world.getBlockTicks().scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); + } + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + if (world instanceof ServerLevel && state.getValue(WATERLOGGED) && world.getBlockState(pos.above()).is(Blocks.WATER)) { + tick(state,(ServerLevel) world, pos, world.random); + } + } + + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + if (!state.getValue(ACTIVATED) && random.nextBoolean()) { + super.animateTick(state, world, pos, random); + double x = pos.getX() + random.nextDouble(); + double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; + double z = pos.getZ() + random.nextDouble(); + if (state.getValue(WATERLOGGED)) { + world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); + } + else { + world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); + } + } + } +} diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index ff59fbbb..2cfd9506 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -1,24 +1,20 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPedestal; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.rituals.InfusionRitual; -public class InfusionPedestal extends BlockPedestal { +public class InfusionPedestal extends PedestalBlock { private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_PEDESTAL_TOP; @@ -28,45 +24,29 @@ public class InfusionPedestal extends BlockPedestal { } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; + public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); - InfusionPedestalEntity pedestal = null; if (blockEntity instanceof InfusionPedestalEntity) { - pedestal = (InfusionPedestalEntity) blockEntity; - if (!pedestal.isEmpty() && pedestal.hasRitual()) { - if (pedestal.getRitual().hasRecipe()) { - pedestal.getRitual().stop(); - return ActionResult.SUCCESS; - } else if (pedestal.getRitual().checkRecipe()) { - return ActionResult.SUCCESS; - } + InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity; + if (pedestal.hasRitual()) { + pedestal.getRitual().checkRecipe(); + } else { + InfusionRitual ritual = new InfusionRitual(world, pos); + pedestal.linkRitual(ritual); + ritual.checkRecipe(); } } - ActionResult result = super.onUse(state, world, pos, player, hand, hit); - if (result == ActionResult.SUCCESS) { - if (pedestal != null) { - if (pedestal.hasRitual()) { - pedestal.getRitual().checkRecipe(); - } else { - InfusionRitual ritual = new InfusionRitual(world, pos); - pedestal.linkRitual(ritual); - ritual.checkRecipe(); - } - } - } - return result; } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new InfusionPedestalEntity(); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if (state.isOf(this)) { - switch(state.get(STATE)) { + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + if (state.is(this)) { + switch(state.getValue(STATE)) { case PEDESTAL_TOP: { return SHAPE_PEDESTAL_TOP; } @@ -74,24 +54,24 @@ public class InfusionPedestal extends BlockPedestal { return SHAPE_DEFAULT; } default: { - return super.getOutlineShape(state, world, pos, context); + return super.getShape(state, world, pos, context); } } } - return super.getOutlineShape(state, world, pos, context); + return super.getShape(state, world, pos, context); } static { - VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); - VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); - VoxelShape pedestalTop = Block.createCuboidShape(1, 9, 1, 15, 11, 15); - VoxelShape pedestalDefault = Block.createCuboidShape(1, 13, 1, 15, 15, 15); - VoxelShape pillar = Block.createCuboidShape(3, 0, 3, 13, 9, 13); - VoxelShape pillarDefault = Block.createCuboidShape(3, 4, 3, 13, 13, 13); - VoxelShape eyeDefault = Block.createCuboidShape(4, 15, 4, 12, 16, 12); - VoxelShape eyeTop = Block.createCuboidShape(4, 11, 4, 12, 12, 12); - VoxelShape basin = VoxelShapes.union(basinDown, basinUp); - SHAPE_DEFAULT = VoxelShapes.union(basin, pillarDefault, pedestalDefault, eyeDefault); - SHAPE_PEDESTAL_TOP = VoxelShapes.union(pillar, pedestalTop, eyeTop); + VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); + VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); + VoxelShape pedestalTop = Block.box(1, 9, 1, 15, 11, 15); + VoxelShape pedestalDefault = Block.box(1, 13, 1, 15, 15, 15); + VoxelShape pillar = Block.box(3, 0, 3, 13, 9, 13); + VoxelShape pillarDefault = Block.box(3, 4, 3, 13, 13, 13); + VoxelShape eyeDefault = Block.box(4, 15, 4, 12, 16, 12); + VoxelShape eyeTop = Block.box(4, 11, 4, 12, 12, 12); + VoxelShape basin = Shapes.or(basinDown, basinUp); + SHAPE_DEFAULT = Shapes.or(basin, pillarDefault, pedestalDefault, eyeDefault); + SHAPE_PEDESTAL_TOP = Shapes.or(pillar, pedestalTop, eyeTop); } } diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java new file mode 100644 index 00000000..3e105494 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -0,0 +1,102 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.Registry; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.MHelper; + +public class JellyshroomCapBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { + public static final IntegerProperty COLOR = BlockProperties.COLOR; + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + private final Vec3i colorStart; + private final Vec3i colorEnd; + private final int coloritem; + + public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { + super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); + colorStart = new Vec3i(r1, g1, b1); + colorEnd = new Vec3i(r2, g2, b2); + coloritem = MHelper.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(COLOR); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + return Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public BlockColor getProvider() { + return (state, world, pos, tintIndex) -> { + float delta = (float) state.getValue(COLOR) / 7F; + int r = Mth.floor(Mth.lerp(delta, colorStart.getX() / 255F, colorEnd.getX() / 255F) * 255F); + int g = Mth.floor(Mth.lerp(delta, colorStart.getY() / 255F, colorEnd.getY() / 255F) * 255F); + int b = Mth.floor(Mth.lerp(delta, colorStart.getZ() / 255F, colorEnd.getZ() / 255F) * 255F); + return MHelper.color(r, g, b); + }; + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> { + return coloritem; + }; + } +} diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java new file mode 100644 index 00000000..72063a4c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class LacugroveSaplingBlock extends FeatureSaplingBlock { + public LacugroveSaplingBlock() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.LACUGROVE.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); + } +} diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java new file mode 100644 index 00000000..e40ae5c7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -0,0 +1,67 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.blocks.BlockProperties.PentaShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class LanceleafBlock extends EndPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; + public static final IntegerProperty ROTATION = BlockProperties.ROTATION; + + public LanceleafBlock() { + super(); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE, ROTATION); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + PentaShape shape = state.getValue(SHAPE); + if (shape == PentaShape.TOP) { + return world.getBlockState(pos.below()).is(this); + } + else if (shape == PentaShape.BOTTOM) { + return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.above()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); + } + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == PentaShape.BOTTOM) { + return Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + } + return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + } +} diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java new file mode 100644 index 00000000..f319eabc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -0,0 +1,46 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.BlockProperties.PentaShape; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class LanceleafSeedBlock extends EndPlantWithAgeBlock { + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + int height = MHelper.randRange(4, 6, random); + int h = BlocksHelper.upRay(world, pos, height + 2); + if (h < height + 1) { + return; + } + int rotation = random.nextInt(4); + MutableBlockPos mut = new MutableBlockPos().set(pos); + BlockState plant = EndBlocks.LANCELEAF.defaultBlockState().setValue(BlockProperties.ROTATION, rotation); + BlocksHelper.setWithoutUpdate(world, mut, plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); + for (int i = 2; i < height - 2; i++) { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); + } + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.AMBER_MOSS); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java new file mode 100644 index 00000000..befeb7c9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -0,0 +1,80 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class LargeAmaranitaBlock extends EndPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 14, 12); + private static final VoxelShape SHAPE_TOP = Shapes.or(Block.box(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM); + + public LargeAmaranitaBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.BOTTOM) { + return isTerrain(world.getBlockState(pos.below())) && world.getBlockState(pos.above()).is(this); + } + else if (shape == TripleShape.TOP) { + return world.getBlockState(pos.below()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); + } + } + + @Override + public OffsetType getOffsetType() { + return OffsetType.NONE; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java new file mode 100644 index 00000000..38e954ad --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -0,0 +1,103 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.LumecornShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; + +public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { + public static final EnumProperty SHAPE = EnumProperty.create("shape", LumecornShape.class); + private static final VoxelShape SHAPE_BOTTOM = Block.box(6, 0, 6, 10, 16, 10); + private static final VoxelShape SHAPE_TOP = Block.box(6, 0, 6, 10, 8, 10); + + public LumecornBlock() { + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .hardness(0.5F) + .luminance(state -> state.getValue(SHAPE).getLight())); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + LumecornShape shape = state.getValue(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { + return world.getBlockState(pos.below()).is(EndTags.END_GROUND); + } + else if (shape == LumecornShape.LIGHT_TOP) { + return world.getBlockState(pos.below()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); + } + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + LumecornShape shape = state.getValue(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { + return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + } + return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); + } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { + LumecornShape shape = state.getValue(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { + return new ItemStack(EndBlocks.LUMECORN_SEED); + } + return new ItemStack(EndItems.LUMECORN_ROD); + } +} diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java new file mode 100644 index 00000000..d3487a23 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -0,0 +1,28 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class LumecornSeedBlock extends EndPlantWithAgeBlock { + @Override + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java new file mode 100644 index 00000000..b2958584 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -0,0 +1,103 @@ +package ru.betterend.blocks; + +import java.util.Queue; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Tuple; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; + +public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeable { + public MengerSpongeBlock() { + super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); + } + + @Override + public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { + if (absorbWater(world, pos)) { + world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE_WET.defaultBlockState()); + } + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (absorbWater(world, pos)) { + return EndBlocks.MENGER_SPONGE_WET.defaultBlockState(); + } + return state; + } + + private boolean absorbWater(LevelAccessor world, BlockPos pos) { + Queue> queue = Lists.newLinkedList(); + queue.add(new Tuple(pos, 0)); + int i = 0; + + while (!queue.isEmpty()) { + Tuple pair = queue.poll(); + BlockPos blockPos = (BlockPos) pair.getA(); + int j = (Integer) pair.getB(); + Direction[] var8 = Direction.values(); + int var9 = var8.length; + + for (int var10 = 0; var10 < var9; ++var10) { + Direction direction = var8[var10]; + BlockPos blockPos2 = blockPos.relative(direction); + BlockState blockState = world.getBlockState(blockPos2); + FluidState fluidState = world.getFluidState(blockPos2); + Material material = blockState.getMaterial(); + if (fluidState.is(FluidTags.WATER)) { + if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) { + ++i; + if (j < 6) { + queue.add(new Tuple(blockPos2, j + 1)); + } + } + else if (blockState.getBlock() instanceof LiquidBlock) { + world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); + ++i; + if (j < 6) { + queue.add(new Tuple(blockPos2, j + 1)); + } + } + else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { + BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null; + dropResources(blockState, world, blockPos2, blockEntity); + world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); + ++i; + if (j < 6) { + queue.add(new Tuple(blockPos2, j + 1)); + } + } + } + } + + if (i > 64) { + break; + } + } + + return i > 0; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java new file mode 100644 index 00000000..90d219eb --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -0,0 +1,106 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTypeable { + public MengerSpongeWetBlock() { + super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).noOcclusion()); + } + + @Override + public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { + if (world.dimensionType().ultraWarm()) { + world.setBlock(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); + world.levelEvent(2009, pos, 0); + world.playSound((Player) null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); + } + } + + @Override + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + Direction direction = Direction.getRandom(random); + if (direction != Direction.UP) { + BlockPos blockPos = pos.relative(direction); + BlockState blockState = world.getBlockState(blockPos); + if (!state.canOcclude() || !blockState.isFaceSturdy(world, blockPos, direction.getOpposite())) { + double x = (double) pos.getX(); + double y = (double) pos.getY(); + double z = (double) pos.getZ(); + if (direction == Direction.DOWN) { + y -= 0.05; + x += random.nextDouble(); + z += random.nextDouble(); + } + else { + y += random.nextDouble() * 0.8; + if (direction.getAxis() == Direction.Axis.X) { + z += random.nextDouble(); + if (direction == Direction.EAST) { + ++x; + } + else { + x += 0.05; + } + } + else { + x += random.nextDouble(); + if (direction == Direction.SOUTH) { + ++z; + } + else { + z += 0.05; + } + } + } + + world.addParticle(ParticleTypes.DRIPPING_WATER, x, y, z, 0, 0, 0); + } + } + } + + @Override + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + if (!world.isClientSide()) { + world.levelEvent(2001, pos, getId(state)); + } + if (world.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) && (player == null || !player.isCreative())) { + ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(drop); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public FluidState getFluidState(BlockState state) { + return Fluids.WATER.getSource(false); + } +} diff --git a/src/main/java/ru/betterend/blocks/MissingTileBlock.java b/src/main/java/ru/betterend/blocks/MissingTileBlock.java new file mode 100644 index 00000000..a9c7eb5e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MissingTileBlock.java @@ -0,0 +1,11 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.blocks.basis.BlockBase; + +public class MissingTileBlock extends BlockBase { + public MissingTileBlock() { + super(FabricBlockSettings.copyOf(Blocks.END_STONE)); + } +} diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java new file mode 100644 index 00000000..662481cc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -0,0 +1,58 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.registry.EndBlocks; + +public class MossyDragonBoneBlock extends EndPillarBlock { + public MossyDragonBoneBlock() { + super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(EndBlocks.DRAGON_BONE_BLOCK)); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + world.setBlockAndUpdate(pos, Blocks.BONE_BLOCK.defaultBlockState().setValue(AXIS, state.getValue(AXIS))); + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getAmount() == 8) { + return false; + } else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } +} diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java new file mode 100644 index 00000000..8ba518da --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -0,0 +1,30 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; + +public class MossyGlowshroomCapBlock extends BlockBase { + public static final BooleanProperty TRANSITION = BlockProperties.TRANSITION; + + public MossyGlowshroomCapBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); + this.registerDefaultState(this.stateDefinition.any().setValue(TRANSITION, false)); + } + + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getClickedPos().below()))); + } + + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(TRANSITION); + } +} diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java new file mode 100644 index 00000000..3781d6ba --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { + public MossyGlowshroomSaplingBlock() { + super(7); + } + + @Override + protected Feature getFeature() { + return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); + } +} diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java new file mode 100644 index 00000000..4d2e3a12 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -0,0 +1,56 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.BlockBase; + +public class MossyObsidian extends BlockBase { + public MossyObsidian() { + super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); + } + } + + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer)blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getAmount() == 8) { + return false; + } else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } +} diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java new file mode 100644 index 00000000..cd7ec961 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class MurkweedBlock extends EndPlantBlock { + @Override + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + double x = pos.getX() + random.nextDouble(); + double y = pos.getY() + random.nextDouble() * 0.5 + 0.5; + double z = pos.getZ() + random.nextDouble(); + double v = random.nextDouble() * 0.1; + world.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, v, v, v); + } + + @Override + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { + if (entity instanceof LivingEntity && !((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS)) { + ((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); + } + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.SHADOW_GRASS); + } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java new file mode 100644 index 00000000..00abb588 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -0,0 +1,54 @@ +package ru.betterend.blocks; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class NeedlegrassBlock extends EndPlantBlock { + @Override + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { + if (entity instanceof LivingEntity) { + entity.hurt(DamageSource.CACTUS, 0.1F); + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(new ItemStack(Items.STICK, MHelper.randRange(0, 2, MHelper.RANDOM))); + } + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.SHADOW_GRASS); + } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java new file mode 100644 index 00000000..55fa5910 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -0,0 +1,11 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.blocks.basis.EndPillarBlock; + +public class NeonCactusBlock extends EndPillarBlock { + public NeonCactusBlock() { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); + } +} diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java new file mode 100644 index 00000000..80781aee --- /dev/null +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -0,0 +1,397 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.CactusBottom; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + public static final EnumProperty CACTUS_BOTTOM = BlockProperties.CACTUS_BOTTOM; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + private static final EnumMap BIG_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap BIG_SHAPES = Maps.newEnumMap(Axis.class); + private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); + private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); + private static final int MAX_LENGTH = 12; + + public NeonCactusPlantBlock() { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); + registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelAccessor world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); + BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (down.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + return state; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + world.getBlockTicks().scheduleTick(pos, this, 2); + if ((Boolean) state.getValue(WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + Direction dir = state.getValue(FACING); + BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); + if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (downState.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + return state; + } + + @Override + public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { + if (!blockState.canSurvive(serverLevel, blockPos)) { + serverLevel.destroyBlock(blockPos, true, null, 1); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + TripleShape shape = state.getValue(SHAPE); + Direction dir = state.getValue(FACING); + BlockState next = view.getBlockState(pos.relative(dir)); + if (next.is(this)) { + Axis axis = dir.getAxis(); + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES.get(axis); + } + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); + } + else { + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES_OPEN.get(dir); + } + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + Direction dir = state.getValue(FACING); + BlockPos supportPos = pos.relative(dir.getOpposite()); + BlockState support = level.getBlockState(supportPos); + return support.is(this) || support.isFaceSturdy(level, supportPos, dir); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (!this.canSurvive(state, world, pos) || random.nextInt(8) > 0) { + return; + } + Direction dir = state.getValue(FACING); + if (!world.isEmptyBlock(pos.relative(dir))) { + return; + } + int length = getLength(state, world, pos, MAX_LENGTH); + if (length < 0 || length > MAX_LENGTH - 1) { + return; + } + if (dir.getAxis().isHorizontal()) { + int horizontal = getHorizontal(state, world, pos, 2); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return; + } + } + } + else if (length > 1 && world.getBlockState(pos.relative(dir.getOpposite())).is(this)) { + Direction side = getSideDirection(world, pos, state, dir, random); + BlockPos sidePos = pos.relative(side); + if (world.isEmptyBlock(sidePos)) { + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlocksHelper.setWithoutUpdate(world, sidePos, placement); + } + } + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); + mutateStem(placement, world, pos, MAX_LENGTH); + } + + public void growPlant(WorldGenLevel world, BlockPos pos, Random random) { + growPlant(world, pos, random, MHelper.randRange(MAX_LENGTH >> 1, MAX_LENGTH, random)); + } + + public void growPlant(WorldGenLevel world, BlockPos pos, Random random, int iterations) { + BlockState state = defaultBlockState(); + BlockState downState = world.getBlockState(pos.below()); + if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (downState.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + BlocksHelper.setWithoutUpdate(world, pos, state); + List ends = Lists.newArrayList(pos.mutable()); + for (int i = 0; i < iterations; i++) { + int count = ends.size(); + for (int n = 0; n < count; n++) { + if (!growIteration(world, ends.get(n), random, ends, i)) { + ends.remove(n); + count--; + n--; + } + } + } + } + + private boolean growIteration(WorldGenLevel world, MutableBlockPos pos, Random random, List ends, int length) { + BlockState state = world.getBlockState(pos); + if (!state.is(this)) { + return false; + } + Direction dir = state.getValue(FACING); + if (!world.isEmptyBlock(pos.relative(dir))) { + return false; + } + if (dir.getAxis().isHorizontal()) { + int horizontal = getHorizontal(state, world, pos, 2); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return false; + } + } + } + else if (length > 1 && world.getBlockState(pos.below()).is(this)) { + Direction side = getSideDirection(world, pos, state, dir, random); + BlockPos sidePos = pos.relative(side); + if (world.isEmptyBlock(sidePos)) { + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlocksHelper.setWithoutUpdate(world, sidePos, placement); + ends.add(sidePos.mutable()); + } + } + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); + mutateStem(placement, world, pos, MAX_LENGTH); + pos.move(dir); + return true; + } + + private Direction getSideDirection(WorldGenLevel world, BlockPos pos, BlockState iterState, Direction dir, Random random) { + MutableBlockPos iterPos = pos.mutable(); + Direction startDir = dir; + Direction lastDir = null; + while (iterState.is(this) && startDir.getAxis().isVertical()) { + startDir = iterState.getValue(FACING); + if (lastDir == null) { + for (Direction side: BlocksHelper.HORIZONTAL) { + BlockState sideState = world.getBlockState(iterPos.relative(side)); + if (sideState.is(this)) { + Direction sideDir = sideState.getValue(FACING); + if (sideDir != side) { + continue; + } + lastDir = sideDir; + } + } + } + iterPos.move(dir); + iterState = world.getBlockState(iterPos); + } + + Direction side = lastDir == null ? BlocksHelper.randomHorizontal(random) : lastDir.getClockWise(); + if (side.getOpposite() == startDir) { + side = side.getOpposite(); + } + return side; + } + + @Override + public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { + return false; + } + + @Override + public void entityInside(BlockState blockState, Level level, BlockPos blockPos, Entity entity) { + entity.hurt(DamageSource.CACTUS, 1.0F); + } + + private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { + int length = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + if (!state.is(EndTags.END_GROUND)) { + length = -1; + } + break; + } + dir = state.getValue(FACING).getOpposite(); + length ++; + } + return length; + } + + private int getHorizontal(BlockState state, WorldGenLevel world, BlockPos pos, int max) { + int count = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + break; + } + dir = state.getValue(FACING).getOpposite(); + if (dir.getStepY() != 0) { + break; + } + count ++; + } + return count; + } + + private void mutateStem(BlockState state, WorldGenLevel world, BlockPos pos, int max) { + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + return; + } + int size = (i + 2) * 3 / max; + int src = state.getValue(SHAPE).getIndex(); + dir = state.getValue(FACING).getOpposite(); + if (src < size) { + TripleShape shape = TripleShape.fromIndex(size); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(SHAPE, shape)); + } + } + } + + static { + BIG_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); + BIG_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); + BIG_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); + + MEDIUM_SHAPES.put(Axis.X, Block.box(0, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES.put(Axis.Y, Block.box(3, 0, 3, 13, 16, 13)); + MEDIUM_SHAPES.put(Axis.Z, Block.box(3, 3, 0, 13, 13, 16)); + + SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); + SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); + SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); + + BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); + BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); + MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); + SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); + SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + } +} diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index 29f8039a..122ff0a1 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -3,13 +3,13 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.blocks.basis.BlockPedestal; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; -public class PedestalVanilla extends BlockPedestal { +public class PedestalVanilla extends PedestalBlock { public PedestalVanilla(Block parent) { super(parent); @@ -17,7 +17,7 @@ public class PedestalVanilla extends BlockPedestal { @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath().replace("_block", ""); Map textures = new HashMap() { private static final long serialVersionUID = 1L; diff --git a/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java new file mode 100644 index 00000000..1fed3cf3 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java @@ -0,0 +1,61 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; + +public class PondAnemoneBlock extends UnderwaterPlantBlock { + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); + + public PondAnemoneBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(13) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + double x = pos.getX() + random.nextDouble(); + double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; + double z = pos.getZ() + random.nextDouble(); + world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java new file mode 100644 index 00000000..2455e3b8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class PythadendronSaplingBlock extends FeatureSaplingBlock { + public PythadendronSaplingBlock() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.PYTHADENDRON_TREE.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM); + } +} diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java new file mode 100644 index 00000000..05dc7fe9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -0,0 +1,202 @@ +package ru.betterend.blocks; + +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.particle.InfusionParticleType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IRenderTypeable { + private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.box(1, 0, 1, 15, 16, 15); + private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.box(2, 0, 2, 14, 16, 14); + + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + public RespawnObeliskBlock() { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { + return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; + })); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + for (int i = 0; i < 3; i++) { + if (!world.getBlockState(pos.above(i)).getMaterial().isReplaceable()) { + return false; + } + } + return true; + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + state = this.defaultBlockState(); + BlocksHelper.setWithUpdate(world, pos, state.setValue(SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithUpdate(world, pos.above(), state.setValue(SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithUpdate(world, pos.above(2), state.setValue(SHAPE, TripleShape.TOP)); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.BOTTOM) { + if (world.getBlockState(pos.above()).is(this)) { + return state; + } + else { + return Blocks.AIR.defaultBlockState(); + } + } + else if (shape == TripleShape.MIDDLE) { + if (world.getBlockState(pos.above()).is(this) && world.getBlockState(pos.below()).is(this)) { + return state; + } + else { + return Blocks.AIR.defaultBlockState(); + } + } + else { + if (world.getBlockState(pos.below()).is(this)) { + return state; + } + else { + return Blocks.AIR.defaultBlockState(); + } + } + } + + @Override + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + if (player.isCreative()) { + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.MIDDLE) { + BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); + } + else if (shape == TripleShape.TOP) { + BlocksHelper.setWithUpdate(world, pos.below(2), Blocks.AIR); + } + } + super.playerWillDestroy(world, pos, state, player); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public BlockColor getProvider() { + return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> { + return MHelper.color(255, 255, 255); + }; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + ItemStack itemStack = player.getItemInHand(hand); + boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; + if (hand != InteractionHand.MAIN_HAND || !canActivate) { + if (!world.isClientSide && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { + ServerPlayer serverPlayerEntity = (ServerPlayer) player; + serverPlayerEntity.displayClientMessage(new TranslatableComponent("message.betterend.fail_spawn"), true); + } + return InteractionResult.FAIL; + } + else if (!world.isClientSide) { + ServerPlayer serverPlayerEntity = (ServerPlayer) player; + serverPlayerEntity.setRespawnPosition(world.dimension(), pos, 0.0F, false, false); + serverPlayerEntity.displayClientMessage(new TranslatableComponent("message.betterend.set_spawn"), true); + double px = pos.getX() + 0.5; + double py = pos.getY() + 0.5; + double pz = pos.getZ() + 0.5; + InfusionParticleType particle = new InfusionParticleType(new ItemStack(EndItems.AMBER_GEM)); + if (world instanceof ServerLevel) { + double py1 = py; + double py2 = py - 0.2; + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + py1 += 1; + py2 += 2; + } + else if (state.getValue(SHAPE) == TripleShape.MIDDLE) { + py1 += 0; + py2 += 1; + } + else { + py1 -= 2; + } + ((ServerLevel) world).sendParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); + ((ServerLevel) world).sendParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); + } + world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); + if (!player.isCreative()) { + itemStack.shrink(6); + } + } + return player.isCreative() ? InteractionResult.PASS : InteractionResult.sidedSuccess(world.isClientSide); + } +} diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9e4b18d4..b457f8be 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; @@ -13,14 +13,14 @@ public class RunedFlavolite extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { - super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getBlastResistance()).luminance(state -> { - return state.get(ACTIVATED) ? 8 : 0; + super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getExplosionResistance()).luminance(state -> { + return state.getValue(ACTIVATED) ? 8 : 0; })); - this.setDefaultState(stateManager.getDefaultState().with(ACTIVATED, false)); + this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } } diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java new file mode 100644 index 00000000..0bbe5d06 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndCropBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class ShadowBerryBlock extends EndCropBlock { + private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 8, 15); + + public ShadowBerryBlock() { + super(EndItems.SHADOW_BERRY_RAW, EndBlocks.SHADOW_GRASS); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } +} diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java new file mode 100644 index 00000000..955c4688 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.registry.EndParticles; + +public class ShadowGrassBlock extends EndTerrainBlock { + public ShadowGrassBlock() { + super(MaterialColor.COLOR_BLACK); + } + + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + super.animateTick(state, world, pos, random); + if (random.nextInt(32) == 0) { + world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java new file mode 100644 index 00000000..ea66f3ca --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -0,0 +1,114 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class SilkMothHiveBlock extends BlockBase { + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; + + public SilkMothHiveBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByHand(true).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + this.registerDefaultState(defaultBlockState().setValue(FULLNESS, 0)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING, FULLNESS); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getHorizontalDirection().getOpposite(); + return this.defaultBlockState().setValue(FACING, dir); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + Direction dir = state.getValue(FACING); + BlockPos spawn = pos.relative(dir); + if (!world.getBlockState(spawn).isAir()) { + return; + } + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + if (count > 6) { + return; + } + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + moth.moveTo(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.toYRot(), 0); + moth.setDeltaMovement(new Vec3(dir.getStepX() * 0.4, 0, dir.getStepZ() * 0.4)); + moth.setHive(world, pos); + world.addFreshEntity(moth); + world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (hand == InteractionHand.MAIN_HAND) { + ItemStack stack = player.getMainHandItem(); + if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); + Direction dir = state.getValue(FACING); + double px = pos.getX() + dir.getStepX() + 0.5; + double py = pos.getY() + dir.getStepY() + 0.5; + double pz = pos.getZ() + dir.getStepZ() + 0.5; + ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(8, 16, world.getRandom())); + ItemEntity entity = new ItemEntity(world, px, py, pz, drop); + world.addFreshEntity(entity); + if (world.getRandom().nextInt(4) == 0) { + drop = new ItemStack(EndItems.SILK_MOTH_MATRIX); + entity = new ItemEntity(world, px, py, pz, drop); + world.addFreshEntity(entity); + } + if (!player.isCreative()) { + stack.setDamageValue(stack.getDamageValue() + 1); + } + return InteractionResult.SUCCESS; + } + } + return InteractionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java new file mode 100644 index 00000000..358d8cbc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -0,0 +1,173 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { + public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; + private static final VoxelShape TOP = box(6, 0, 6, 10, 16, 10); + private static final VoxelShape BOTTOM = box(0, 0, 0, 16, 16, 16); + + public SilkMothNestBlock() { + super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + this.registerDefaultState(defaultBlockState().setValue(ACTIVE, true).setValue(FULLNESS, 0)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(ACTIVE, FACING, FULLNESS); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(ACTIVE) ? BOTTOM : TOP; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getHorizontalDirection().getOpposite(); + return this.defaultBlockState().setValue(FACING, dir); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!state.getValue(ACTIVE)) { + if (canSupportCenter(world, pos.above(), Direction.DOWN) || world.getBlockState(pos.above()).is(BlockTags.LEAVES)) { + return state; + } + else { + return Blocks.AIR.defaultBlockState(); + } + } + return state; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); + } + + @Override + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + if (!state.getValue(ACTIVE) && player.isCreative()) { + BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); + } + BlockState up = world.getBlockState(pos.above()); + if (up.is(this) && !up.getValue(ACTIVE)) { + BlocksHelper.setWithUpdate(world, pos.above(), Blocks.AIR); + } + super.playerWillDestroy(world, pos, state, player); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (!state.getValue(ACTIVE)) { + return; + } + if (random.nextBoolean()) { + return; + } + Direction dir = state.getValue(FACING); + BlockPos spawn = pos.relative(dir); + if (!world.getBlockState(spawn).isAir()) { + return; + } + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + if (count > 6) { + return; + } + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + moth.moveTo(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.toYRot(), 0); + moth.setDeltaMovement(new Vec3(dir.getStepX() * 0.4, 0, dir.getStepZ() * 0.4)); + moth.setHive(world, pos); + world.addFreshEntity(moth); + world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (hand == InteractionHand.MAIN_HAND) { + ItemStack stack = player.getMainHandItem(); + if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); + Direction dir = state.getValue(FACING); + double px = pos.getX() + dir.getStepX() + 0.5; + double py = pos.getY() + dir.getStepY() + 0.5; + double pz = pos.getZ() + dir.getStepZ() + 0.5; + ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(1, 4, world.getRandom())); + ItemEntity entity = new ItemEntity(world, px, py, pz, drop); + world.addFreshEntity(entity); + drop = new ItemStack(EndItems.SILK_MOTH_MATRIX, MHelper.randRange(1, 3, world.getRandom())); + entity = new ItemEntity(world, px, py, pz, drop); + world.addFreshEntity(entity); + if (!player.isCreative()) { + stack.setDamageValue(stack.getDamageValue() + 1); + } + return InteractionResult.SUCCESS; + } + } + return InteractionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java new file mode 100644 index 00000000..edb75b91 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -0,0 +1,78 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.util.BlocksHelper; + +public class SmallAmaranitaBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + BlockPos bigPos = growBig(world, pos); + if (bigPos != null) { + if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { + replaceMushroom(world, bigPos); + replaceMushroom(world, bigPos.south()); + replaceMushroom(world, bigPos.east()); + replaceMushroom(world, bigPos.south().east()); + } + return; + } + EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); + } + + private BlockPos growBig(ServerLevel world, BlockPos pos) { + for (int x = -1; x < 2; x++) { + for (int z = -1; z < 2; z++) { + BlockPos p = pos.offset(x, 0, z); + if (checkFrame(world, p)) { + return p; + } + } + } + return null; + } + + private boolean checkFrame(ServerLevel world, BlockPos pos) { + return world.getBlockState(pos).is(this) && + world.getBlockState(pos.south()).is(this) && + world.getBlockState(pos.east()).is(this) && + world.getBlockState(pos.south().east()).is(this); + } + + private void replaceMushroom(ServerLevel world, BlockPos pos) { + if (world.getBlockState(pos).is(this)) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + } + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(8) == 0; + } +} diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java new file mode 100644 index 00000000..f9f6b212 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -0,0 +1,103 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; + +public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypeable, BonemealableBlock { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public SmallJellyshroomBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.NETHER_WART) + .noCollission()); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + BlockState support = world.getBlockState(blockPos); + return canSupportCenter(world, blockPos, direction) && support.canOcclude() && support.getLightEmission() == 0; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Block.box(3, 0, 3, 13, 16, 13)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.box(3, 0, 3, 13, 16, 13)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).is(EndTags.END_GROUND); + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(16) == 0; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); + } +} diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java new file mode 100644 index 00000000..6572cbf2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -0,0 +1,19 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.EndPillarBlock; + +public class SmaragdantCrystalBlock extends EndPillarBlock { + public SmaragdantCrystalBlock() { + super(FabricBlockSettings.of(Material.GLASS) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .hardness(1F) + .resistance(1F) + .noOcclusion() + .sound(SoundType.GLASS)); + } +} diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java new file mode 100644 index 00000000..2e8626a8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -0,0 +1,107 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class SmaragdantCrystalShardBlock extends AttachedBlock implements IRenderTypeable, SimpleWaterloggedBlock, LiquidBlockContainer { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public SmaragdantCrystalShardBlock() { + super(FabricBlockSettings.of(Material.STONE) + .materialColor(MaterialColor.COLOR_GREEN) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .sound(SoundType.GLASS) + .requiresCorrectToolForDrops() + .noCollission()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); + stateManager.add(WATERLOGGED); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return !state.getValue(WATERLOGGED); + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return !state.getValue(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + if (state != null) { + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; + return state.setValue(WATERLOGGED, water); + } + return null; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + return world.getBlockState(blockPos).isFaceSturdy(world, blockPos, direction); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.125, 0.125, 0.125, 0.875F, 0.875F, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.125, 0.125, 0.125, 1.0, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.125, 0.125, 0.875F, 0.875F, 0.875F)); + } +} diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java new file mode 100644 index 00000000..d0becc90 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -0,0 +1,121 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; + +public class SulphurCrystalBlock extends AttachedBlock implements IRenderTypeable, SimpleWaterloggedBlock, LiquidBlockContainer { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 2); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public SulphurCrystalBlock() { + super(FabricBlockSettings.of(Material.STONE) + .materialColor(MaterialColor.COLOR_YELLOW) + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.GLASS) + .requiresCorrectToolForDrops() + .noCollission()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); + stateManager.add(AGE, WATERLOGGED); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return !state.getValue(WATERLOGGED); + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return !state.getValue(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + if (state != null) { + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; + return state.setValue(WATERLOGGED, water); + } + return null; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + return world.getBlockState(blockPos).is(EndBlocks.BRIMSTONE); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.125, 0.125, 0.5, 0.875F, 0.875F, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.125, 0.125, 1.0, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.125, 0.125, 0.5, 0.875F, 0.875F)); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java similarity index 55% rename from src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java rename to src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index fbd09f88..82238857 100644 --- a/src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -4,28 +4,28 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockVine; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndParticles; import ru.betterend.util.MHelper; -public class BlockTenaneaFlowers extends BlockVine implements IColorProvider { +public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { public static final Vec3i[] COLORS; - public BlockTenaneaFlowers() { + public TenaneaFlowersBlock() { super(15); } @Override - public BlockColorProvider getProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { long i = (MHelper.getRandom(pos.getX(), pos.getZ()) & 63) + pos.getY(); double delta = i * 0.1; @@ -37,9 +37,9 @@ public class BlockTenaneaFlowers extends BlockVine implements IColorProvider { Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); float[] hsb = MHelper.fromRGBtoHSB(r, g, b); return MHelper.fromHSBtoRGB(hsb[0], MHelper.max(0.5F, hsb[1]), hsb[2]); @@ -47,20 +47,20 @@ public class BlockTenaneaFlowers extends BlockVine implements IColorProvider { } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(255, 255, 255); }; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - super.randomDisplayTick(state, world, pos, random); + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + super.animateTick(state, world, pos, random); if (random.nextInt(32) == 0) { double x = (double) pos.getX() + random.nextGaussian() + 0.5; double z = (double) pos.getZ() + random.nextGaussian() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java new file mode 100644 index 00000000..c4e8393f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class TenaneaSaplingBlock extends FeatureSaplingBlock { + public TenaneaSaplingBlock() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.LUCERNIA.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); + } +} diff --git a/src/main/java/ru/betterend/blocks/TerminiteBlock.java b/src/main/java/ru/betterend/blocks/TerminiteBlock.java index 204a2e55..19c031c3 100644 --- a/src/main/java/ru/betterend/blocks/TerminiteBlock.java +++ b/src/main/java/ru/betterend/blocks/TerminiteBlock.java @@ -1,17 +1,17 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; public class TerminiteBlock extends BlockBase { public TerminiteBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708) + super(FabricBlockSettings.of(Material.METAL, MaterialColor.WARPED_WART_BLOCK) .hardness(7F) .resistance(9F) - .requiresTool() - .sounds(BlockSoundGroup.METAL)); + .requiresCorrectToolForDrops() + .sound(SoundType.METAL)); } } diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java new file mode 100644 index 00000000..090b3b15 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndPlantBlock; + +public class TerrainPlantBlock extends EndPlantBlock { + private final Block[] ground; + + public TerrainPlantBlock(Block... ground) { + super(true); + this.ground = ground; + } + + @Override + protected boolean isTerrain(BlockState state) { + for (Block block: ground) { + if (state.is(block)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java new file mode 100644 index 00000000..08fe2dbf --- /dev/null +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -0,0 +1,49 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class TwistedUmbrellaMossBlock extends EndPlantBlock { + public TwistedUmbrellaMossBlock() { + super(11); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); + } + + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return world.isEmptyBlock(pos.above()); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); + BlocksHelper.setWithoutUpdate(world, pos, bs); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(DoublePlantBlock.TOP, true)); + } +} diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java new file mode 100644 index 00000000..3d0ff3e8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -0,0 +1,28 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.registry.EndBlocks; + +public class TwistedUmbrellaMossTallBlock extends DoublePlantBlock { + public TwistedUmbrellaMossTallBlock() { + super(12); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); + world.addFreshEntity(item); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java new file mode 100644 index 00000000..e9fb7790 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -0,0 +1,49 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class UmbrellaMossBlock extends EndPlantBlock { + public UmbrellaMossBlock() { + super(11); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); + } + + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return world.isEmptyBlock(pos.above()); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); + BlocksHelper.setWithoutUpdate(world, pos, bs); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(DoublePlantBlock.TOP, true)); + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java new file mode 100644 index 00000000..51045ffb --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -0,0 +1,28 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.registry.EndBlocks; + +public class UmbrellaMossTallBlock extends DoublePlantBlock { + public UmbrellaMossTallBlock() { + super(12); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); + world.addFreshEntity(item); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java new file mode 100644 index 00000000..2565ca21 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -0,0 +1,55 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; + +public class UmbrellaTreeClusterBlock extends BlockBase { + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; + + public UmbrellaTreeClusterBlock() { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.COLOR_PURPLE) + .luminance(15)); + registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(NATURAL); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + ItemStack stack = player.getMainHandItem(); + if (stack.getItem() == Items.GLASS_BOTTLE) { + if (!player.isCreative()) { + stack.shrink(1); + } + stack = new ItemStack(EndItems.UMBRELLA_CLUSTER_JUICE); + player.addItem(stack); + world.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS, 1, 1, false); + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().setValue(NATURAL, state.getValue(NATURAL))); + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java new file mode 100644 index 00000000..a8805689 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -0,0 +1,39 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class UmbrellaTreeClusterEmptyBlock extends BlockBase { + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; + + public UmbrellaTreeClusterEmptyBlock() { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.COLOR_PURPLE) + .randomTicks()); + registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(NATURAL); + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (state.getValue(NATURAL) && random.nextInt(16) == 0) { + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().setValue(UmbrellaTreeClusterBlock.NATURAL, true)); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java new file mode 100644 index 00000000..215bb8a2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -0,0 +1,101 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned { + public static final IntegerProperty COLOR = BlockProperties.COLOR; + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + + public UmbrellaTreeMembraneBlock() { + super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(COLOR); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(COLOR) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections.emptyList(); + } + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { + return state.getValue(COLOR) > 0; + } + + @Environment(EnvType.CLIENT) + public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { + if (state.getValue(COLOR) > 0) { + return super.skipRendering(state, stateFrom, direction); + } + else { + return false; + } + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java new file mode 100644 index 00000000..cc01c356 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -0,0 +1,31 @@ +package ru.betterend.blocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.blocks.basis.FeatureSaplingBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { + public UmbrellaTreeSaplingBlock() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.UMBRELLA_TREE.getFeature(); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } +} diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java new file mode 100644 index 00000000..e01729ef --- /dev/null +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -0,0 +1,123 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer { + public VentBubbleColumnBlock() { + super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).noOcclusion().noCollission().noDrops()); + } + + @Override + public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); + return Fluids.WATER; + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.INVISIBLE; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState blockState = world.getBlockState(pos.below()); + return blockState.is(this) || blockState.is(EndBlocks.HYDROTHERMAL_VENT); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!state.canSurvive(world, pos)) { + return Blocks.WATER.defaultBlockState(); + } + else { + BlockPos up = pos.above(); + if (world.getBlockState(up).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, up, this); + world.getBlockTicks().scheduleTick(up, this, 5); + } + } + return state; + } + + @Environment(EnvType.CLIENT) + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + if (random.nextInt(4) == 0) { + double px = pos.getX() + random.nextDouble(); + double py = pos.getY() + random.nextDouble(); + double pz = pos.getZ() + random.nextDouble(); + world.addAlwaysVisibleParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); + } + if (random.nextInt(200) == 0) { + world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BUBBLE_COLUMN_UPWARDS_AMBIENT, SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); + } + } + + @Environment(EnvType.CLIENT) + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { + BlockState blockState = world.getBlockState(pos.above()); + if (blockState.isAir()) { + entity.onAboveBubbleCol(false); + if (!world.isClientSide) { + ServerLevel serverWorld = (ServerLevel) world; + + for (int i = 0; i < 2; ++i) { + serverWorld.sendParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); + serverWorld.sendParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, 0.0D, 0.2D); + } + } + } + else { + entity.onInsideBubbleColumn(false); + } + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return Fluids.WATER.getSource(false); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java new file mode 100644 index 00000000..474859ff --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -0,0 +1,76 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import ru.betterend.util.BlocksHelper; + +public abstract class AttachedBlock extends BlockBaseNotFull { + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public AttachedBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.UP)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState blockState = this.defaultBlockState(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); + for (int i = 0; i < directions.length; ++i) { + Direction direction = directions[i]; + Direction direction2 = direction.getOpposite(); + blockState = (BlockState) blockState.setValue(FACING, direction2); + if (blockState.canSurvive(worldView, blockPos)) { + return blockState; + } + } + return null; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + return canSupportCenter(world, blockPos, direction) || world.getBlockState(blockPos).is(BlockTags.LEAVES); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBark.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java similarity index 57% rename from src/main/java/ru/betterend/blocks/basis/BlockBark.java rename to src/main/java/ru/betterend/blocks/basis/BarkBlock.java index 94847b94..f408f369 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBark.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -2,28 +2,28 @@ package ru.betterend.blocks.basis; import java.io.Reader; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import ru.betterend.patterns.Patterns; -public class BlockBark extends BlockPillar { - public BlockBark(Settings settings) { +public class BarkBlock extends EndPillarBlock { + public BarkBlock(Properties settings) { super(settings); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, getName(blockId), blockId.getPath()); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, getName(blockId), blockId.getPath()); } - private String getName(Identifier blockId) { + private String getName(ResourceLocation blockId) { String name = blockId.getPath(); return name.replace("_bark", "_log_side"); } diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java index 4442e05d..fffe742d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java @@ -3,26 +3,25 @@ package ru.betterend.blocks.basis; import java.util.Collections; import java.util.List; -import net.minecraft.block.BlockState; -import net.minecraft.block.BlockWithEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.world.BlockView; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; -public class BaseBlockWithEntity extends BlockWithEntity { - - public BaseBlockWithEntity(Settings settings) { +public class BaseBlockWithEntity extends BaseEntityBlock { + public BaseBlockWithEntity(Properties settings) { super(settings); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return null; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java b/src/main/java/ru/betterend/blocks/basis/BlockAttached.java deleted file mode 100644 index 84710157..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java +++ /dev/null @@ -1,75 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.util.BlocksHelper; - -public abstract class BlockAttached extends BlockBaseNotFull { - public BlockAttached(Settings settings) { - super(settings); - } - - public static final DirectionProperty FACING = Properties.FACING; - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(FACING); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState blockState = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); - for (int i = 0; i < directions.length; ++i) { - Direction direction = directions[i]; - Direction direction2 = direction.getOpposite(); - blockState = (BlockState) blockState.with(FACING, direction2); - if (blockState.canPlaceAt(worldView, blockPos)) { - return blockState; - } - } - return null; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - return sideCoversSmallSquare(world, blockPos, direction) || world.getBlockState(blockPos).isIn(BlockTags.LEAVES); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java b/src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java deleted file mode 100644 index 5adef8f5..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.PillarBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class BlockBarkStripable extends BlockBark { - private final Block striped; - - public BlockBarkStripable(MaterialColor color, Block striped) { - super(FabricBlockSettings.copyOf(striped).materialColor(color)); - this.striped = striped; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, striped.getDefaultState().with(PillarBlock.AXIS, state.get(PillarBlock.AXIS)), 11); - if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); - } - } - return ActionResult.SUCCESS; - } - return ActionResult.FAIL; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java b/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java deleted file mode 100644 index 8cf0e69c..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java +++ /dev/null @@ -1,110 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.List; -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BarrelBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.PiglinBrain; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import ru.betterend.blocks.entities.EBarrelBlockEntity; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndBlockEntities; - -public class BlockBarrel extends BarrelBlock implements BlockPatterned { - public BlockBarrel(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); - } - - @Override - public BlockEntity createBlockEntity(BlockView world) { - return EndBlockEntities.BARREL.instantiate(); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - List drop = super.getDroppedStacks(state, builder); - drop.add(new ItemStack(this.asItem())); - return drop; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, - BlockHitResult hit) { - if (world.isClient) { - return ActionResult.SUCCESS; - } else { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof EBarrelBlockEntity) { - player.openHandledScreen((EBarrelBlockEntity) blockEntity); - player.incrementStat(Stats.OPEN_BARREL); - PiglinBrain.onGuardedBlockInteracted(player, true); - } - - return ActionResult.CONSUME; - } - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof EBarrelBlockEntity) { - ((EBarrelBlockEntity) blockEntity).tick(); - } - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, - ItemStack itemStack) { - if (itemStack.hasCustomName()) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof EBarrelBlockEntity) { - ((EBarrelBlockEntity) blockEntity).setCustomName(itemStack.getName()); - } - } - } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } - - @Override - public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); - if (block.contains("open")) { - return Patterns.createJson(Patterns.BLOCK_BARREL_OPEN, texture, texture); - } - return Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_BARREL; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index cdebbf74..9299f6d6 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -4,39 +4,39 @@ import java.io.Reader; import java.util.Collections; import java.util.List; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class BlockBase extends Block implements BlockPatterned { - public BlockBase(Settings settings) { + public BlockBase(Properties settings) { super(settings); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java index dbf23923..754b09b0 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java @@ -1,25 +1,25 @@ package ru.betterend.blocks.basis; -import net.minecraft.block.BlockState; -import net.minecraft.entity.EntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; public class BlockBaseNotFull extends BlockBase { - public BlockBaseNotFull(Settings settings) { + public BlockBaseNotFull(Properties settings) { super(settings); } - public boolean canSuffocate(BlockState state, BlockView view, BlockPos pos) { + public boolean canSuffocate(BlockState state, BlockGetter view, BlockPos pos) { return false; } - public boolean isSimpleFullBlock(BlockState state, BlockView view, BlockPos pos) { + public boolean isSimpleFullBlock(BlockState state, BlockGetter view, BlockPos pos) { return false; } - public boolean allowsSpawning(BlockState state, BlockView view, BlockPos pos, EntityType type) { + public boolean allowsSpawning(BlockState state, BlockGetter view, BlockPos pos, EntityType type) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java b/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java deleted file mode 100644 index a2b7cce5..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java +++ /dev/null @@ -1,58 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.Patterns; - -public class BlockBookshelf extends BlockBase { - public BlockBookshelf(Block source) { - super(FabricBlockSettings.copyOf(source)); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { - int silk = EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool); - if (silk > 0) { - return Collections.singletonList(new ItemStack(this)); - } - } - return Collections.singletonList(new ItemStack(Items.BOOK, 3)); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(Patterns.BLOCK_BOOKSHELF, getName(blockId), blockId.getPath()); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(data, getName(blockId), blockId.getPath()); - } - - private String getName(Identifier blockId) { - String name = blockId.getPath(); - return name.replace("_bookshelf", ""); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java b/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java deleted file mode 100644 index a02c7b44..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; - -public class BlockBulbVineLantern extends BlockLantern implements IRenderTypeable { - private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(4, 4, 4, 12, 16, 12); - private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(4, 0, 4, 12, 12, 12); - - public BlockBulbVineLantern() { - this(FabricBlockSettings.of(Material.METAL) - .sounds(BlockSoundGroup.LANTERN) - .hardness(1) - .resistance(1) - .breakByTool(FabricToolTags.PICKAXES) - .materialColor(MaterialColor.LIGHT_GRAY) - .requiresTool() - .luminance(15)); - } - - public BlockBulbVineLantern(FabricBlockSettings settings) { - super(settings); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java b/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java deleted file mode 100644 index b567a990..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; -import ru.betterend.interfaces.IColorProvider; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockBulbVineLanternColored extends BlockBulbVineLantern implements IColorProvider, BlockPatterned { - public BlockBulbVineLanternColored(FabricBlockSettings settings) { - super(settings); - } - - @Override - public BlockColorProvider getProvider() { - return (state, world, pos, tintIndex) -> { - return this.getDefaultMaterialColor().color; - }; - } - - @Override - public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return this.getDefaultMaterialColor().color; - }; - } - - @Override - public String getStatesPattern(Reader data) { - String path = "betterend:block/bulb_lantern_colored"; - return Patterns.createJson(data, path, path); - } - - @Override - public String getModelPattern(String block) { - String path = "betterend:block/bulb_lantern_colored"; - if (block.contains("item") || block.contains("ceil")) { - return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_COLORED_CEIL, path, path); - } - else { - return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_COLORED_FLOOR, path, path); - } - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_BULB_LANTERN; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockChest.java b/src/main/java/ru/betterend/blocks/basis/BlockChest.java deleted file mode 100644 index 580f3ca8..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockChest.java +++ /dev/null @@ -1,66 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndBlockEntities; - -public class BlockChest extends ChestBlock implements BlockPatterned { - - private final Block parent; - - public BlockChest(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque(), () -> { - return EndBlockEntities.CHEST; - }); - this.parent = source; - } - - @Override - public BlockEntity createBlockEntity(BlockView world) - { - return EndBlockEntities.CHEST.instantiate(); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) - { - List drop = super.getDroppedStacks(state, builder); - drop.add(new ItemStack(this.asItem())); - return drop; - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String path) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - if (path.contains("item")) { - return Patterns.createJson(Patterns.ITEM_CHEST, blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockComposter.java b/src/main/java/ru/betterend/blocks/basis/BlockComposter.java deleted file mode 100644 index 2c4cc28c..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockComposter.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ComposterBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockComposter extends ComposterBlock implements BlockPatterned { - public BlockComposter(Block source) { - super(FabricBlockSettings.copyOf(source)); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this.asItem())); - } - - @Override - public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, blockId, blockId); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - String blockName = blockId.getPath(); - return Patterns.createJson(Patterns.BLOCK_COMPOSTER, blockName); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_COMPOSTER; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java b/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java deleted file mode 100644 index c1290b9e..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java +++ /dev/null @@ -1,153 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; - -public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); - public static final IntProperty ROTATION = BlockProperties.ROTATION; - public static final BooleanProperty TOP = BooleanProperty.of("top"); - - public BlockDoublePlant() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); - } - - public BlockDoublePlant(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance((state) -> { return state.get(TOP) ? light : 0; }) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(TOP, ROTATION); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - BlockState up = world.getBlockState(pos.up()); - return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable()); - } - - public boolean canStayAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - BlockState up = world.getBlockState(pos.up()); - return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this); - } - - protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canStayAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(TOP)) { - return Lists.newArrayList(); - } - - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return true; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return true; - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); - world.spawnEntity(item); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - int rot = world.random.nextInt(4); - BlockState bs = this.getDefaultState().with(ROTATION, rot); - BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(TOP, true)); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java b/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java deleted file mode 100644 index 1adad8e6..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java +++ /dev/null @@ -1,119 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; -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.registry.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndTags; - -public abstract class BlockFeatureSapling extends BlockBaseNotFull implements Fertilizable, IRenderTypeable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - - public BlockFeatureSapling() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByHand(true) - .collidable(false) - .breakInstantly() - .sounds(BlockSoundGroup.GRASS) - .ticksRandomly()); - } - - public BlockFeatureSapling(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByHand(true) - .collidable(false) - .breakInstantly() - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .ticksRandomly()); - } - - protected abstract Feature getFeature(); - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) - return Blocks.AIR.getDefaultState(); - else - return state; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return true; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return random.nextInt(16) == 0; - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null); - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { - grow(world, random, pos, state); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - if (block.contains("item")) { - block = block.split("/")[1]; - return Patterns.createJson(Patterns.ITEM_BLOCK, block); - } - return Patterns.createJson(Patterns.BLOCK_SAPLING, block); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SAPLING; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFur.java b/src/main/java/ru/betterend/blocks/basis/BlockFur.java deleted file mode 100644 index 232b749f..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockFur.java +++ /dev/null @@ -1,88 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.EnumMap; -import java.util.List; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.util.MHelper; - -public class BlockFur extends BlockAttached implements IRenderTypeable { - private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - private final ItemConvertible drop; - private final int dropChance; - - public BlockFur(ItemConvertible drop, int light, int dropChance) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); - this.drop = drop; - this.dropChance = dropChance; - } - - public BlockFur(ItemConvertible drop, int dropChance) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); - this.drop = drop; - this.dropChance = dropChance; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else if (MHelper.RANDOM.nextInt(dropChance) == 0) { - return Lists.newArrayList(new ItemStack(drop)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLadder.java b/src/main/java/ru/betterend/blocks/basis/BlockLadder.java deleted file mode 100644 index d5d5cba9..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockLadder.java +++ /dev/null @@ -1,159 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.util.BlocksHelper; - -public class BlockLadder extends BlockBaseNotFull implements IRenderTypeable, BlockPatterned { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - protected static final VoxelShape EAST_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); - protected static final VoxelShape WEST_SHAPE = Block.createCuboidShape(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); - protected static final VoxelShape SOUTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); - protected static final VoxelShape NORTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); - - public BlockLadder(Block block) { - super(FabricBlockSettings.copyOf(block).nonOpaque()); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(FACING); - stateManager.add(WATERLOGGED); - } - - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - switch (state.get(FACING)) { - case SOUTH: - return SOUTH_SHAPE; - case WEST: - return WEST_SHAPE; - case EAST: - return EAST_SHAPE; - default: - return NORTH_SHAPE; - } - } - - private boolean canPlaceOn(BlockView world, BlockPos pos, Direction side) { - BlockState blockState = world.getBlockState(pos); - return !blockState.emitsRedstonePower() && blockState.isSideSolidFullSquare(world, pos, side); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - return this.canPlaceOn(world, pos.offset(direction.getOpposite()), direction); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, - WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (facing.getOpposite() == state.get(FACING) && !state.canPlaceAt(world, pos)) { - return Blocks.AIR.getDefaultState(); - } else { - if ((Boolean) state.get(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - - return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); - } - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState blockState2; - if (!ctx.canReplaceExisting()) { - blockState2 = ctx.getWorld().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); - if (blockState2.getBlock() == this && blockState2.get(FACING) == ctx.getSide()) { - return null; - } - } - - blockState2 = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); - Direction[] var6 = ctx.getPlacementDirections(); - int var7 = var6.length; - - for (int var8 = 0; var8 < var7; ++var8) { - Direction direction = var6[var8]; - if (direction.getAxis().isHorizontal()) { - blockState2 = (BlockState) blockState2.with(FACING, direction.getOpposite()); - if (blockState2.canPlaceAt(worldView, blockPos)) { - return (BlockState) blockState2.with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } - } - } - - return null; - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } - - @Override - public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, blockId, blockId); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - if (block.contains("item")) { - return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_LADDER; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLantern.java b/src/main/java/ru/betterend/blocks/basis/BlockLantern.java deleted file mode 100644 index 0448bfbc..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockLantern.java +++ /dev/null @@ -1,118 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Waterloggable; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; - -public class BlockLantern extends BlockBaseNotFull implements Waterloggable, FluidFillable { - public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - - public BlockLantern(Block source) { - this(FabricBlockSettings.copyOf(source).luminance(15).nonOpaque()); - } - - public BlockLantern(FabricBlockSettings settings) { - super(settings.nonOpaque()); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(IS_FLOOR, WATERLOGGED); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - Direction dir = ctx.getSide(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; - if (dir != Direction.DOWN && dir != Direction.UP) { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else { - return null; - } - } - else if (dir == Direction.DOWN) { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else { - return null; - } - } - else { - if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else { - return null; - } - } - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - if (state.get(IS_FLOOR)) { - return sideCoversSmallSquare(world, pos.down(), Direction.UP); - } - else { - return sideCoversSmallSquare(world, pos.up(), Direction.DOWN); - } - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - Boolean water = state.get(WATERLOGGED); - if (water) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - if (!canPlaceAt(state, world, pos)) { - return water ? Blocks.WATER.getDefaultState() : Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return false; - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return false; - } - - @Override - public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java b/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java deleted file mode 100644 index a00e8f35..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java +++ /dev/null @@ -1,90 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.MaterialColor; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.util.MHelper; - -public class BlockLeaves extends LeavesBlock implements BlockPatterned, IRenderTypeable { - private final Block sapling; - - public BlockLeaves(Block sapling, MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color) - .breakByTool(FabricToolTags.SHEARS)); - this.sapling = sapling; - } - - public BlockLeaves(Block sapling, MaterialColor color, int light) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color) - .luminance(light) - .breakByTool(FabricToolTags.SHEARS)); - this.sapling = sapling; - } - - @Override - public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, blockId, blockId); - } - - @Override - public String getModelPattern(String block) { - String blockId = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(Patterns.BLOCK_BASE, blockId, blockId); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isEffectiveOn(state) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); - if (MHelper.RANDOM.nextInt(16) <= fortune) { - return Lists.newArrayList(new ItemStack(sapling)); - } - return Lists.newArrayList(); - } - return MHelper.RANDOM.nextInt(16) == 0 ? Lists.newArrayList(new ItemStack(sapling)) : Lists.newArrayList(); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java b/src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java deleted file mode 100644 index 11f90960..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.PillarBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class BlockLogStripable extends BlockPillar { - private final Block striped; - - public BlockLogStripable(MaterialColor color, Block striped) { - super(FabricBlockSettings.copyOf(striped).materialColor(color)); - this.striped = striped; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, striped.getDefaultState().with(PillarBlock.AXIS, state.get(PillarBlock.AXIS)), 11); - if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); - } - } - return ActionResult.SUCCESS; - } - return ActionResult.FAIL; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockOre.java b/src/main/java/ru/betterend/blocks/basis/BlockOre.java deleted file mode 100644 index 0fc93d69..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockOre.java +++ /dev/null @@ -1,90 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.OreBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.util.MHelper; - -public class BlockOre extends OreBlock implements BlockPatterned { - private final Item dropItem; - private final int minCount; - private final int maxCount; - private final int expirience; - - public BlockOre(Item drop, int minCount, int maxCount, int expirience) { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) - .hardness(3F) - .resistance(9F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); - this.dropItem = drop; - this.minCount = minCount; - this.maxCount = maxCount; - this.expirience = expirience; - } - - @Override - protected int getExperienceWhenMined(Random random) { - return this.expirience > 0 ? random.nextInt(expirience) + 1 : 0; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - int count = 0; - int enchantment = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); - if (enchantment > 0) { - int min = MathHelper.clamp(minCount + enchantment, minCount, maxCount); - int max = maxCount + (enchantment / Enchantments.FORTUNE.getMaxLevel()); - if (min == max) { - return Collections.singletonList(new ItemStack(dropItem, max)); - } - count = MHelper.randRange(min, max, MHelper.RANDOM); - } else { - count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM); - } - return Collections.singletonList(new ItemStack(dropItem, count)); - } - return Collections.emptyList(); - } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPedestal.java b/src/main/java/ru/betterend/blocks/basis/BlockPedestal.java deleted file mode 100644 index ad05a8f6..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockPedestal.java +++ /dev/null @@ -1,377 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockProperties.PedestalState; -import ru.betterend.blocks.entities.PedestalBlockEntity; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; - -public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvider { - public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; - public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; - public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; - - private static final VoxelShape SHAPE_DEFAULT; - private static final VoxelShape SHAPE_COLUMN; - private static final VoxelShape SHAPE_PILLAR; - private static final VoxelShape SHAPE_PEDESTAL_TOP; - private static final VoxelShape SHAPE_COLUMN_TOP; - private static final VoxelShape SHAPE_BOTTOM; - - /** - * - * Register new Pedestal block with Better End mod id. - * - * @param name - * @param source - * @return new Pedestal block with Better End id. - */ - public static Block registerPedestal(String name, Block source) { - return EndBlocks.registerBlock(name, new BlockPedestal(source)); - } - - /** - * - * Register new Pedestal block with specified mod id. - * - * @param id - * @param source - * @return new Pedestal block with specified id. - */ - public static Block registerPedestal(Identifier id, Block source) { - return EndBlocks.registerBlock(id, new BlockPedestal(source)); - } - - protected final Block parent; - protected float height = 1.0F; - - public BlockPedestal(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> { - return state.get(HAS_LIGHT) ? 12 : 0; - })); - this.setDefaultState(stateManager.getDefaultState().with(STATE, PedestalState.DEFAULT).with(HAS_ITEM, false).with(HAS_LIGHT, false)); - this.parent = parent; - } - - public float getHeight(BlockState state) { - if (state.getBlock() instanceof BlockPedestal && state.get(STATE) == PedestalState.PEDESTAL_TOP) { - return this.height - 0.2F; - } - return this.height; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; - if (!this.isPlaceable(state)) { - return ActionResult.PASS; - } - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof PedestalBlockEntity) { - PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - if (pedestal.isEmpty()) { - ItemStack itemStack = player.getStackInHand(hand); - if (itemStack.isEmpty()) return ActionResult.CONSUME; - pedestal.setStack(0, itemStack.split(1)); - return ActionResult.SUCCESS; - } else { - ItemStack itemStack = pedestal.getStack(0); - if (player.giveItemStack(itemStack)) { - pedestal.removeStack(world, state); - return ActionResult.SUCCESS; - } - return ActionResult.FAIL; - } - } - return ActionResult.PASS; - } - - @Override - @Nullable - public BlockState getPlacementState(ItemPlacementContext context) { - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); - BlockState upState = world.getBlockState(pos.up()); - BlockState downState = world.getBlockState(pos.down()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); - boolean hasPedestalOver = upState.getBlock() instanceof BlockPedestal; - boolean hasPedestalUnder = downState.getBlock() instanceof BlockPedestal; - if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - return this.getDefaultState().with(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - return this.getDefaultState().with(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { - return this.getDefaultState().with(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { - return this.getDefaultState().with(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { - return this.getDefaultState().with(STATE, PedestalState.BOTTOM); - } - return this.getDefaultState(); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - BlockState updated = this.getUpdatedState(state, direction, newState, world, pos, posFrom); - if (!updated.isOf(this)) return updated; - if (!this.isPlaceable(updated)) { - this.moveStoredStack(world, updated, pos); - } - return updated; - } - - private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if (!state.isOf(this)) return state.getStateForNeighborUpdate(direction, newState, world, pos, posFrom); - if (direction != Direction.UP && direction != Direction.DOWN) return state; - BlockState upState = world.getBlockState(pos.up()); - BlockState downState = world.getBlockState(pos.down()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); - boolean hasPedestalOver = upState.getBlock() instanceof BlockPedestal; - boolean hasPedestalUnder = downState.getBlock() instanceof BlockPedestal; - if (direction == Direction.UP) { - upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) || newState.isIn(BlockTags.WALLS); - hasPedestalOver = newState.getBlock() instanceof BlockPedestal; - } else if (direction == Direction.DOWN) { - hasPedestalUnder = newState.getBlock() instanceof BlockPedestal; - } - if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - return state.with(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - return state.with(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { - return state.with(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { - return state.with(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { - return state.with(STATE, PedestalState.BOTTOM); - } - return state.with(STATE, PedestalState.DEFAULT); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - List drop = Lists.newArrayList(super.getDroppedStacks(state, builder)); - if (state.isOf(this)) { - if (isPlaceable(state)) { - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); - if (blockEntity != null && blockEntity instanceof PedestalBlockEntity) { - PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - if (!pedestal.isEmpty()) { - drop.add(pedestal.getStack(0)); - } - } - } else { - return drop; - } - } - return drop; - } - - private void moveStoredStack(WorldAccess world, BlockState state, BlockPos pos) { - ItemStack stack = ItemStack.EMPTY; - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof PedestalBlockEntity && state.isOf(this)) { - PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - stack = pedestal.getStack(0); - pedestal.clear(); - BlocksHelper.setWithoutUpdate(world, pos, state.with(HAS_ITEM, false)); - } - if (!stack.isEmpty()) { - BlockPos upPos = pos.up(); - this.moveStoredStack(world, stack, world.getBlockState(upPos), upPos); - } - } - - private void moveStoredStack(WorldAccess world, ItemStack stack, BlockState state, BlockPos pos) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (!state.isOf(this)) { - this.dropStoredStack(blockEntity, stack, pos); - } else if (state.get(STATE).equals(PedestalState.PILLAR)) { - BlockPos upPos = pos.up(); - this.moveStoredStack(world, stack, world.getBlockState(upPos), upPos); - } else if (!this.isPlaceable(state)) { - this.dropStoredStack(blockEntity, stack, pos); - } else if (blockEntity instanceof PedestalBlockEntity) { - PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - if (pedestal.isEmpty()) { - pedestal.setStack(0, stack); - } else { - this.dropStoredStack(blockEntity, stack, pos); - } - } else { - this.dropStoredStack(blockEntity, stack, pos); - } - } - - private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { - if (blockEntity != null && blockEntity.getWorld() != null) { - World world = blockEntity.getWorld(); - Block.dropStack(world, this.getDropPos(world, pos), stack); - } - } - - private BlockPos getDropPos(WorldAccess world, BlockPos pos) { - BlockPos dropPos; - for(int i = 2; i < Direction.values().length; i++) { - dropPos = pos.offset(Direction.byId(i)); - if (world.getBlockState(dropPos).isAir()) { - return dropPos.toImmutable(); - } - } - if (world.getBlockState(pos.up()).isAir()) { - return pos.up(); - } - return this.getDropPos(world, pos.up()); - } - - protected boolean isPlaceable(BlockState state) { - if (!state.isOf(this)) return false; - PedestalState currentState = state.get(STATE); - return currentState != PedestalState.BOTTOM && - currentState != PedestalState.COLUMN && - currentState != PedestalState.PILLAR && - currentState != PedestalState.COLUMN_TOP; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if (state.isOf(this)) { - switch(state.get(STATE)) { - case BOTTOM: { - return SHAPE_BOTTOM; - } - case PEDESTAL_TOP: { - return SHAPE_PEDESTAL_TOP; - } - case COLUMN_TOP: { - return SHAPE_COLUMN_TOP; - } - case PILLAR: { - return SHAPE_PILLAR; - } - case COLUMN: { - return SHAPE_COLUMN; - } - default: { - return SHAPE_DEFAULT; - } - } - } - return super.getOutlineShape(state, world, pos, context); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); - } - - @Override - public BlockEntity createBlockEntity(BlockView world) { - return new PedestalBlockEntity(); - } - - @Override - public boolean hasComparatorOutput(BlockState state) { - return state.getBlock() instanceof BlockPedestal; - } - - @Override - public int getComparatorOutput(BlockState state, World world, BlockPos pos) { - return state.get(HAS_ITEM) ? 15 : 0; - } - - @Override - public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, texture, texture); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); - String name = blockId.getPath(); - Map textures = new HashMap() { - private static final long serialVersionUID = 1L; - { - put("%mod%", blockId.getNamespace() ); - put("%top%", name + "_top"); - put("%base%", name + "_base"); - put("%pillar%", name + "_pillar"); - put("%bottom%", name + "_bottom"); - } - }; - if (block.contains("column_top")) { - return Patterns.createJson(Patterns.BLOCK_PEDESTAL_COLUMN_TOP, textures); - } else if (block.contains("column")) { - return Patterns.createJson(Patterns.BLOKC_PEDESTAL_COLUMN, textures); - } else if (block.contains("top")) { - return Patterns.createJson(Patterns.BLOCK_PEDESTAL_TOP, textures); - } else if (block.contains("bottom")) { - return Patterns.createJson(Patterns.BLOCK_PEDESTAL_BOTTOM, textures); - } else if (block.contains("pillar")) { - return Patterns.createJson(Patterns.BLOCK_PEDESTAL_PILLAR, textures); - } - return Patterns.createJson(Patterns.BLOCK_PEDESTAL_DEFAULT, textures); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PEDESTAL; - } - - static { - VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); - VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); - VoxelShape columnTopUp = Block.createCuboidShape(1, 14, 1, 15, 16, 15); - VoxelShape columnTopDown = Block.createCuboidShape(2, 13, 2, 14, 14, 14); - VoxelShape pedestalTop = Block.createCuboidShape(1, 8, 1, 15, 10, 15); - VoxelShape pedestalDefault = Block.createCuboidShape(1, 12, 1, 15, 14, 15); - VoxelShape pillar = Block.createCuboidShape(3, 0, 3, 13, 8, 13); - VoxelShape pillarDefault = Block.createCuboidShape(3, 0, 3, 13, 12, 13); - VoxelShape columnTop = VoxelShapes.union(columnTopDown, columnTopUp); - VoxelShape basin = VoxelShapes.union(basinDown, basinUp); - SHAPE_PILLAR = Block.createCuboidShape(3, 0, 3, 13, 16, 13); - SHAPE_DEFAULT = VoxelShapes.union(basin, pillarDefault, pedestalDefault); - SHAPE_PEDESTAL_TOP = VoxelShapes.union(pillar, pedestalTop); - SHAPE_COLUMN_TOP = VoxelShapes.union(SHAPE_PILLAR, columnTop); - SHAPE_COLUMN = VoxelShapes.union(basin, SHAPE_PILLAR, columnTop); - SHAPE_BOTTOM = VoxelShapes.union(basin, SHAPE_PILLAR); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPillar.java b/src/main/java/ru/betterend/blocks/basis/BlockPillar.java deleted file mode 100644 index 6f64faf9..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockPillar.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.minecraft.block.BlockState; -import net.minecraft.block.PillarBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockPillar extends PillarBlock implements BlockPatterned { - public BlockPillar(Settings settings) { - super(settings); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, texture, texture); - } - - @Override - public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(Patterns.BLOCK_PILLAR, texture, texture); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PILLAR; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockPlant.java deleted file mode 100644 index 3cc74c74..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockPlant.java +++ /dev/null @@ -1,131 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndTags; - -public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - - public BlockPlant() { - this(false); - } - - public BlockPlant(int light) { - this(false, light); - } - - public BlockPlant(boolean replaceable) { - super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); - } - - public BlockPlant(boolean replaceable, int light) { - super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); - } - - public BlockPlant(Settings settings) { - super(settings); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - return isTerrain(down); - } - - protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return true; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return true; - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); - world.spawnEntity(item); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java b/src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java deleted file mode 100644 index 2d13df0d..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; - -public abstract class BlockPlantWithAge extends BlockPlant { - public static final IntProperty AGE = IntProperty.of("age", 0, 3); - - public BlockPlantWithAge() { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); - } - - public BlockPlantWithAge(FabricBlockSettings settings) { - super(settings); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(AGE); - } - - public abstract void growAdult(StructureWorldAccess world, Random random, BlockPos pos); - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - if (random.nextInt(4) == 0) { - int age = state.get(AGE); - if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); - } - else { - growAdult(world, random, pos); - } - } - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { - grow(world, random, pos, state); - } - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java b/src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java deleted file mode 100644 index 0bd66e41..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockPressurePlate extends PressurePlateBlock implements BlockPatterned { - - private final Block parent; - - public BlockPressurePlate(Block source) { - super(ActivationRule.EVERYTHING, FabricBlockSettings.copyOf(source).nonOpaque()); - this.parent = source; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - if (block.contains("down")) { - return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PLATE; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSign.java b/src/main/java/ru/betterend/blocks/basis/BlockSign.java deleted file mode 100644 index 659b94ac..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockSign.java +++ /dev/null @@ -1,184 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AbstractSignBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.DyeItem; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.SignType; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.entities.ESignBlockEntity; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockSign extends AbstractSignBlock implements BlockPatterned { - public static final IntProperty ROTATION = Properties.ROTATION; - public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); - private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { - Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), - Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) }; - - private final Block parent; - - public BlockSign(Block source) { - super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque(), SignType.OAK); - this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); - this.parent = source; - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(ROTATION, FLOOR, WATERLOGGED); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(FLOOR) ? SHAPE : WALL_SHAPES[state.get(ROTATION) >> 2]; - } - - @Override - public BlockEntity createBlockEntity(BlockView world) { - return new ESignBlockEntity(); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ItemStack itemStack = player.getStackInHand(hand); - boolean bl = itemStack.getItem() instanceof DyeItem && player.abilities.allowModifyWorld; - if (world.isClient) { - return bl ? ActionResult.SUCCESS : ActionResult.CONSUME; - } else { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof ESignBlockEntity) { - ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; - if (bl) { - boolean bl2 = signBlockEntity.setTextColor(((DyeItem) itemStack.getItem()).getColor()); - if (bl2 && !player.isCreative()) { - itemStack.decrement(1); - } - } - return signBlockEntity.onActivate(player) ? ActionResult.SUCCESS : ActionResult.PASS; - } else { - return ActionResult.PASS; - } - } - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, - ItemStack itemStack) { - if (placer != null && placer instanceof PlayerEntity) { - ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); - if (!world.isClient) { - sign.setEditor((PlayerEntity) placer); - ((ServerPlayerEntity) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); - } else - sign.setEditable(true); - } - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, - WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if ((Boolean) state.get(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - - return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - if (ctx.getSide() == Direction.UP) { - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); - return this.getDefaultState().with(FLOOR, true) - .with(ROTATION, MathHelper.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) - .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } else if (ctx.getSide() != Direction.DOWN) { - BlockState blockState = this.getDefaultState(); - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); - Direction[] var7 = directions; - int var8 = directions.length; - - for (int var9 = 0; var9 < var8; ++var9) { - Direction direction = var7[var9]; - if (direction.getAxis().isHorizontal()) { - Direction direction2 = direction.getOpposite(); - int rot = MathHelper.floor((180.0 + direction2.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; - blockState = blockState.with(ROTATION, rot); - if (blockState.canPlaceAt(worldView, blockPos)) { - return blockState.with(FLOOR, false).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } - } - } - } - - return null; - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String path) { - Identifier parentId = Registry.BLOCK.getId(parent); - if (path.contains("item")) { - return Patterns.createJson(Patterns.ITEM_GENERATED, path); - } - return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return (BlockState) state.with(ROTATION, rotation.rotate((Integer) state.get(ROTATION), 16)); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return (BlockState) state.with(ROTATION, mirror.mirror((Integer) state.get(ROTATION), 16)); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java b/src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java deleted file mode 100644 index fa5bd33f..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.patterns.Patterns; - -public class BlockSimpleLeaves extends BlockBaseNotFull implements IRenderTypeable { - public BlockSimpleLeaves(MaterialColor color) { - super(FabricBlockSettings.of(Material.LEAVES) - .strength(0.2F) - .sounds(BlockSoundGroup.GRASS) - .nonOpaque() - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color)); - } - - public BlockSimpleLeaves(MaterialColor color, int light) { - super(FabricBlockSettings.of(Material.LEAVES) - .strength(0.2F) - .sounds(BlockSoundGroup.GRASS) - .nonOpaque() - .luminance(light) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color)); - } - - @Override - public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, texture, texture); - } - - @Override - public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(Patterns.BLOCK_BASE, texture, texture); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java b/src/main/java/ru/betterend/blocks/basis/BlockSlab.java deleted file mode 100644 index d08a9c5e..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SlabBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockSlab extends SlabBlock implements BlockPatterned { - - private final Block parent; - - public BlockSlab(Block source) { - super(FabricBlockSettings.copyOf(source)); - this.parent = source; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(Patterns.BLOCK_SLAB, parentId.getPath(), blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SLAB; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java b/src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java deleted file mode 100644 index f5c61f1c..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java +++ /dev/null @@ -1,84 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.interfaces.IColorProvider; -import ru.betterend.patterns.Patterns; -import ru.betterend.util.MHelper; - -public class BlockStoneLantern extends BlockLantern implements IColorProvider { - private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(3, 1, 3, 13, 16, 13); - private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(3, 0, 3, 13, 15, 13); - private static final Vec3i[] COLORS = AuroraCrystalBlock.COLORS; - - public BlockStoneLantern(Block source) { - super(FabricBlockSettings.copyOf(source).luminance(15)); - } - - @Override - public BlockColorProvider getProvider() { - return (state, world, pos, tintIndex) -> { - long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); - double delta = i * 0.1; - int index = MHelper.floor(delta); - int index2 = (index + 1) & 3; - delta -= index; - index &= 3; - - Vec3i color1 = COLORS[index]; - Vec3i color2 = COLORS[index2]; - - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); - - return MHelper.color(r, g, b); - }; - } - - @Override - public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); - }; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_STONE_LANTERN; - } - - @Override - public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); - if (block.contains("ceil")) { - return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, texture, texture); - } - return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, texture, texture); - } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java b/src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java deleted file mode 100644 index 8dce5c00..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockStonePressurePlate extends PressurePlateBlock implements BlockPatterned { - - private final Block parent; - - public BlockStonePressurePlate(Block source) { - super(ActivationRule.MOBS, FabricBlockSettings.copyOf(source).nonOpaque()); - this.parent = source; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - if (block.contains("down")) { - return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PLATE; - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java deleted file mode 100644 index 4c549a74..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java +++ /dev/null @@ -1,144 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; - -public class BlockUnderwaterPlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable, FluidFillable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - - public BlockUnderwaterPlant() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); - } - - public BlockUnderwaterPlant(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); - } - - public BlockUnderwaterPlant(Settings settings) { - super(settings); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - state = world.getBlockState(pos); - return isTerrain(down) && state.getFluidState().getFluid().equals(Fluids.WATER.getStill()); - } - - protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND) || state.getBlock() == EndBlocks.ENDSTONE_DUST; - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.WATER.getDefaultState(); - } - else { - return state; - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return true; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return true; - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); - world.spawnEntity(item); - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return false; - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return false; - } - - @Override - public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java b/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java deleted file mode 100644 index df166e16..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.Random; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; - -public abstract class BlockUnderwaterPlantWithAge extends BlockUnderwaterPlant { - public static final IntProperty AGE = IntProperty.of("age", 0, 3); - - public BlockUnderwaterPlantWithAge() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(AGE); - } - - public abstract void grow(StructureWorldAccess world, Random random, BlockPos pos); - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - if (random.nextInt(4) == 0) { - int age = state.get(AGE); - if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); - } - else { - grow(world, random, pos); - } - } - } - - @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { - grow(world, random, pos, state); - } - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java deleted file mode 100644 index 2ea2bb31..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.betterend.blocks.basis; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; - -public class BlockUnderwaterWallPlant extends BlockWallPlant implements FluidFillable { - - public BlockUnderwaterWallPlant() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); - } - - public BlockUnderwaterWallPlant(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); - } - - public BlockUnderwaterWallPlant(Settings settings) { - super(settings); - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return false; - } - - @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return false; - } - - @Override - public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getFluidState(pos).getFluid() == Fluids.WATER && super.canPlaceAt(state, world, pos); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java deleted file mode 100644 index b66f805d..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java +++ /dev/null @@ -1,95 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndTags; - -public class BlockUpDownPlant extends BlockBaseNotFull implements IRenderTypeable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - - public BlockUpDownPlant() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPE; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - BlockState up = world.getBlockState(pos.up()); - return (isTerrain(down) || down.getBlock() == this) && (isSupport(up, world, pos) || up.getBlock() == this); - } - - protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); - } - - protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { - return sideCoversSmallSquare(world, pos.up(), Direction.UP); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { - super.afterBreak(world, player, pos, state, blockEntity, stack); - world.updateNeighbor(pos, Blocks.AIR, pos.down()); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockVine.java b/src/main/java/ru/betterend/blocks/basis/BlockVine.java deleted file mode 100644 index 5ff39c4b..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockVine.java +++ /dev/null @@ -1,145 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.util.BlocksHelper; - -public class BlockVine extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape VOXEL_SHAPE = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - - public BlockVine() { - this(0, false); - } - - public BlockVine(int light) { - this(light, false); - } - - public BlockVine(int light, boolean bottomOnly) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .luminance((state) -> { - return bottomOnly ? state.get(SHAPE) == TripleShape.BOTTOM ? light : 0 : light; - }) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(SHAPE, TripleShape.BOTTOM)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SHAPE); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return VOXEL_SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return isSupport(state, world, pos); - } - - protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { - BlockState up = world.getBlockState(pos.up()); - return up.isOf(this) || up.isIn(BlockTags.LEAVES) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - if (world.getBlockState(pos.down()).getBlock() != this) - return state.with(SHAPE, TripleShape.BOTTOM); - else if (world.getBlockState(pos.up()).getBlock() != this) - return state.with(SHAPE, TripleShape.TOP); - return state.with(SHAPE, TripleShape.MIDDLE); - } - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); - } - return world.getBlockState(pos).isAir(); - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); - } - return world.isAir(pos); - } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); - } - world.setBlockState(pos, getDefaultState()); - BlocksHelper.setWithoutUpdate(world, pos, getDefaultState()); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java b/src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java deleted file mode 100644 index b2580ad7..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldView; - -public class BlockWallMushroom extends BlockWallPlant { - public BlockWallMushroom(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.AXES) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .sounds(BlockSoundGroup.WOOD) - .hardness(0.2F) - .breakByHand(true) - .noCollision()); - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Lists.newArrayList(new ItemStack(this)); - } - - @Override - public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { - return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java deleted file mode 100644 index f2e1d94a..00000000 --- a/src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java +++ /dev/null @@ -1,125 +0,0 @@ -package ru.betterend.blocks.basis; - -import java.util.EnumMap; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import ru.betterend.util.BlocksHelper; - -public class BlockWallPlant extends BlockPlant { - private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of( - Direction.NORTH, Block.createCuboidShape(1, 1, 8, 15, 15, 16), - Direction.SOUTH, Block.createCuboidShape(1, 1, 0, 15, 15, 8), - Direction.WEST, Block.createCuboidShape(8, 1, 1, 16, 15, 15), - Direction.EAST, Block.createCuboidShape(0, 1, 1, 8, 15, 15))); - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - - public BlockWallPlant() { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); - } - - public BlockWallPlant(int light) { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); - } - - public BlockWallPlant(Settings settings) { - super(settings); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(FACING); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPES.get(state.get(FACING)); - } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - BlockState blockState = world.getBlockState(blockPos); - return isSupport(world, blockPos, blockState, direction); - } - - public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { - return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState blockState = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); - for (int i = 0; i < directions.length; ++i) { - Direction direction = directions[i]; - if (direction.getAxis().isHorizontal()) { - Direction direction2 = direction.getOpposite(); - blockState = blockState.with(FACING, direction2); - if (blockState.canPlaceAt(worldView, blockPos)) { - return blockState; - } - } - } - return null; - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - return state; - } - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } -} diff --git a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java new file mode 100644 index 00000000..a1c09b06 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java @@ -0,0 +1,153 @@ +package ru.betterend.blocks.basis; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; + +public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { + private static final VoxelShape SHAPE = Block.box(4, 2, 4, 12, 16, 12); + public static final IntegerProperty ROTATION = BlockProperties.ROTATION; + public static final BooleanProperty TOP = BooleanProperty.create("top"); + + public DoublePlantBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(TOP, false)); + } + + public DoublePlantBlock(int light) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(TOP) ? light : 0) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(TOP, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(TOP, ROTATION); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + BlockState up = world.getBlockState(pos.above()); + return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable()); + } + + public boolean canStayAt(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + BlockState up = world.getBlockState(pos.above()); + return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this); + } + + protected boolean isTerrain(BlockState state) { + return state.is(EndTags.END_GROUND); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canStayAt(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(TOP)) { + return Lists.newArrayList(); + } + + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return true; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + int rot = world.random.nextInt(4); + BlockState bs = this.defaultBlockState().setValue(ROTATION, rot); + BlocksHelper.setWithoutUpdate(world, pos, bs); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(TOP, true)); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java new file mode 100644 index 00000000..cb7a867a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -0,0 +1,84 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { + private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION; + protected final int level; + + public EndAnvilBlock(MaterialColor color, int level) { + super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); + this.level = level; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(DESTRUCTION); + } + + public IntegerProperty getDestructionProperty() { + return DESTRUCTION; + } + + public int getCraftingLevel() { + return level; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack stack = new ItemStack(this); + int level = state.getValue(getDestructionProperty()); + stack.getOrCreateTag().putInt("level", level); + return Collections.singletonList(stack); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + Map map = Maps.newHashMap(); + map.put("%anvil%", blockId.getPath()); + map.put("%top%", getTop(blockId, block)); + return Patterns.createJson(Patterns.BLOCK_ANVIL, map); + } + + protected String getTop(ResourceLocation blockId, String block) { + if (block.contains("item")) { + return blockId.getPath() + "_top_0"; + } + char last = block.charAt(block.length() - 1); + return blockId.getPath() + "_top_" + last; + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_ANVIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java new file mode 100644 index 00000000..96e02235 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -0,0 +1,110 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.piglin.PiglinAi; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.BlockHitResult; +import ru.betterend.blocks.entities.EBarrelBlockEntity; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlockEntities; + +public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { + public EndBarrelBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion()); + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) { + return EndBlockEntities.BARREL.create(); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = super.getDrops(state, builder); + drop.add(new ItemStack(this.asItem())); + return drop; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + if (world.isClientSide) { + return InteractionResult.SUCCESS; + } else { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + player.openMenu((EBarrelBlockEntity) blockEntity); + player.awardStat(Stats.OPEN_BARREL); + PiglinAi.angerNearbyPiglins(player, true); + } + + return InteractionResult.CONSUME; + } + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + ((EBarrelBlockEntity) blockEntity).tick(); + } + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, + ItemStack itemStack) { + if (itemStack.hasCustomHoverName()) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + ((EBarrelBlockEntity) blockEntity).setCustomName(itemStack.getHoverName()); + } + } + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + String texture = Registry.BLOCK.getKey(this).getPath(); + if (block.contains("open")) { + return Patterns.createJson(Patterns.BLOCK_BARREL_OPEN, texture, texture); + } + return Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_BARREL; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java new file mode 100644 index 00000000..99d73b01 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java @@ -0,0 +1,41 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; + +public class EndBlockStripableLogLog extends EndPillarBlock { + private final Block striped; + + public EndBlockStripableLogLog(MaterialColor color, Block striped) { + super(FabricBlockSettings.copyOf(striped).materialColor(color)); + this.striped = striped; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (player.getMainHandItem().getItem().is(FabricToolTags.AXES)) { + world.playSound(player, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlock(pos, striped.defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)), 11); + if (player != null && !player.isCreative()) { + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); + } + } + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java new file mode 100644 index 00000000..cbe352f3 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -0,0 +1,58 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.patterns.Patterns; + +public class EndBookshelfBlock extends BlockBase { + public EndBookshelfBlock(Block source) { + super(FabricBlockSettings.copyOf(source)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + int silk = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool); + if (silk > 0) { + return Collections.singletonList(new ItemStack(this)); + } + } + return Collections.singletonList(new ItemStack(Items.BOOK, 3)); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(Patterns.BLOCK_BOOKSHELF, getName(blockId), blockId.getPath()); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, getName(blockId), blockId.getPath()); + } + + private String getName(ResourceLocation blockId) { + String name = blockId.getPath(); + return name.replace("_bookshelf", ""); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java new file mode 100644 index 00000000..1b03516c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -0,0 +1,55 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChainBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndChainBlock extends ChainBlock implements BlockPatterned, IRenderTypeable { + public EndChainBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.CHAIN).materialColor(color)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_CHAIN, blockId.getPath(), blockId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_CHAIN; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java new file mode 100644 index 00000000..a7d6344a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlockEntities; + +public class EndChestBlock extends ChestBlock implements BlockPatterned { + private final Block parent; + + public EndChestBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion(), () -> { + return EndBlockEntities.CHEST; + }); + this.parent = source; + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) + { + return EndBlockEntities.CHEST.create(); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) + { + List drop = super.getDrops(state, builder); + drop.add(new ItemStack(this.asItem())); + return drop; + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String path) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + if (path.contains("item")) { + return Patterns.createJson(Patterns.ITEM_CHEST, blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java new file mode 100644 index 00000000..fdf45dff --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java @@ -0,0 +1,45 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndComposterBlock extends ComposterBlock implements BlockPatterned { + public EndComposterBlock(Block source) { + super(FabricBlockSettings.copyOf(source)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this.asItem())); + } + + @Override + public String getStatesPattern(Reader data) { + String blockId = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, blockId, blockId); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + String blockName = blockId.getPath(); + return Patterns.createJson(Patterns.BLOCK_COMPOSTER, blockName); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_COMPOSTER; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java similarity index 59% rename from src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java rename to src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java index 7840de90..0f930b7f 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java @@ -6,35 +6,35 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CraftingTableBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CraftingTableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockCraftingTable extends CraftingTableBlock implements BlockPatterned { - public BlockCraftingTable(Block source) { +public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPatterned { + public EndCraftingTableBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this.asItem())); } @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); String blockName = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_SIDED, new HashMap() { private static final long serialVersionUID = 1L; @@ -51,7 +51,7 @@ public class BlockCraftingTable extends CraftingTableBlock implements BlockPatte } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java new file mode 100644 index 00000000..8413c649 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java @@ -0,0 +1,122 @@ +package ru.betterend.blocks.basis; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class EndCropBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); + + private final Block[] terrain; + private final Item drop; + + public EndCropBlock(Item drop, Block... terrain) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.HOES) + .breakByHand(true) + .sound(SoundType.GRASS) + .randomTicks() + .noCollission()); + this.drop = drop; + this.terrain = terrain; + this.registerDefaultState(defaultBlockState().setValue(AGE, 0)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(AGE); + } + + @Override + protected boolean isTerrain(BlockState state) { + for (Block block: terrain) { + if (state.is(block)) { + return true; + } + } + return false; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(AGE) < 3) { + return Collections.singletonList(new ItemStack(this)); + } + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (enchantment > 0) { + int countSeeds = MHelper.randRange(Mth.clamp(1 + enchantment, 1, 3), 3, MHelper.RANDOM); + int countDrops = MHelper.randRange(Mth.clamp(1 + enchantment, 1, 2), 2, MHelper.RANDOM); + return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); + } + } + int countSeeds = MHelper.randRange(1, 3, MHelper.RANDOM); + int countDrops = MHelper.randRange(1, 2, MHelper.RANDOM); + return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); + if (age < 3) { + BlocksHelper.setWithUpdate(world, pos, state.setValue(AGE, age + 1)); + } + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return state.getValue(AGE) < 3; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return state.getValue(AGE) < 3; + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state) && random.nextInt(8) == 0) { + performBonemeal(world, random, pos, state); + } + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockDoor.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java similarity index 59% rename from src/main/java/ru/betterend/blocks/basis/BlockDoor.java rename to src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index f41ae172..edd17f80 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockDoor.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -1,31 +1,31 @@ package ru.betterend.blocks.basis; - + import java.io.Reader; import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DoorBlock; -import net.minecraft.block.enums.DoubleBlockHalf; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - -public class BlockDoor extends DoorBlock implements IRenderTypeable, BlockPatterned { - public BlockDoor(Block block) { - super(FabricBlockSettings.copy(block).nonOpaque()); +import ru.betterend.patterns.Patterns; + +public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPatterned { + public EndDoorBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(3F, 3F).noOcclusion()); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(HALF) == DoubleBlockHalf.LOWER) + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(HALF) == DoubleBlockHalf.LOWER) return Collections.singletonList(new ItemStack(this.asItem())); else return Collections.emptyList(); @@ -38,13 +38,13 @@ public class BlockDoor extends DoorBlock implements IRenderTypeable, BlockPatter @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } @Override public String getModelPattern(String block) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, block); } @@ -61,7 +61,7 @@ public class BlockDoor extends DoorBlock implements IRenderTypeable, BlockPatter } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_DOOR; } -} +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFence.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java similarity index 52% rename from src/main/java/ru/betterend/blocks/basis/BlockFence.java rename to src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index 17b7d007..513214fd 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockFence.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -5,41 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockFence extends FenceBlock implements BlockPatterned { - +public class EndFenceBlock extends FenceBlock implements BlockPatterned { private final Block parent; - public BlockFence(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + public EndFenceBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_FENCE, parentId.getPath(), blockId.getPath()); } @@ -50,7 +49,7 @@ public class BlockFence extends FenceBlock implements BlockPatterned { } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_FENCE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java new file mode 100644 index 00000000..68690e6c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -0,0 +1,98 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.stats.Stats; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRenderTypeable { + public EndFurnaceBlock(Block source) { + super(FabricBlockSettings.copyOf(source).luminance((state) -> { + return state.getValue(LIT) ? 13 : 0; + })); + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) { + return new EFurnaceBlockEntity(); + } + + @Override + protected void openContainer(Level world, BlockPos pos, Player player) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EFurnaceBlockEntity) { + player.openMenu((MenuProvider) blockEntity); + player.awardStat(Stats.INTERACT_WITH_FURNACE); + } + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + Map map = Maps.newHashMap(); + map.put("%top%", blockId.getPath() + "_top"); + map.put("%side%", blockId.getPath() + "_side"); + if (block.contains("_on")) { + map.put("%front%", blockId.getPath() + "_front_on"); + map.put("%glow%", blockId.getPath() + "_glow"); + return Patterns.createJson(Patterns.BLOCK_FURNACE_GLOW, map); + } + else { + map.put("%front%", blockId.getPath() + "_front"); + return Patterns.createJson(Patterns.BLOCK_FURNACE, map); + } + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_FURNACE; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = Lists.newArrayList(new ItemStack(this)); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (blockEntity instanceof EFurnaceBlockEntity) { + EFurnaceBlockEntity entity = (EFurnaceBlockEntity) blockEntity; + for (int i = 0; i < entity.getContainerSize(); i++) { + drop.add(entity.getItem(i)); + } + } + return drop; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockGate.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java similarity index 55% rename from src/main/java/ru/betterend/blocks/basis/BlockGate.java rename to src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index 37cc1ecd..156407c2 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockGate.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -5,41 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceGateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockGate extends FenceGateBlock implements BlockPatterned { - +public class EndGateBlock extends FenceGateBlock implements BlockPatterned { private final Block parent; - public BlockGate(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + public EndGateBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("wall")) { if (block.contains("open")) { return Patterns.createJson(Patterns.BLOCK_GATE_OPEN_WALL, parentId.getPath(), blockId.getPath()); @@ -54,7 +53,7 @@ public class BlockGate extends FenceGateBlock implements BlockPatterned { } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_GATE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java new file mode 100644 index 00000000..505b3ae9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -0,0 +1,159 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.BlocksHelper; + +public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, BlockPatterned { + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + protected static final VoxelShape EAST_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); + protected static final VoxelShape WEST_SHAPE = Block.box(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + protected static final VoxelShape SOUTH_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); + protected static final VoxelShape NORTH_SHAPE = Block.box(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); + + public EndLadderBlock(Block block) { + super(FabricBlockSettings.copyOf(block).noOcclusion()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING); + stateManager.add(WATERLOGGED); + } + + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + switch (state.getValue(FACING)) { + case SOUTH: + return SOUTH_SHAPE; + case WEST: + return WEST_SHAPE; + case EAST: + return EAST_SHAPE; + default: + return NORTH_SHAPE; + } + } + + private boolean canPlaceOn(BlockGetter world, BlockPos pos, Direction side) { + BlockState blockState = world.getBlockState(pos); + return !blockState.isSignalSource() && blockState.isFaceSturdy(world, pos, side); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = (Direction) state.getValue(FACING); + return this.canPlaceOn(world, pos.relative(direction.getOpposite()), direction); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, + LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (facing.getOpposite() == state.getValue(FACING) && !state.canSurvive(world, pos)) { + return Blocks.AIR.defaultBlockState(); + } else { + if ((Boolean) state.getValue(WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + + return super.updateShape(state, facing, neighborState, world, pos, neighborPos); + } + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState blockState2; + if (!ctx.replacingClickedOnBlock()) { + blockState2 = ctx.getLevel().getBlockState(ctx.getClickedPos().relative(ctx.getClickedFace().getOpposite())); + if (blockState2.getBlock() == this && blockState2.getValue(FACING) == ctx.getClickedFace()) { + return null; + } + } + + blockState2 = this.defaultBlockState(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + Direction[] var6 = ctx.getNearestLookingDirections(); + int var7 = var6.length; + + for (int var8 = 0; var8 < var7; ++var8) { + Direction direction = var6[var8]; + if (direction.getAxis().isHorizontal()) { + blockState2 = (BlockState) blockState2.setValue(FACING, direction.getOpposite()); + if (blockState2.canSurvive(worldView, blockPos)) { + return (BlockState) blockState2.setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); + } + } + } + + return null; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public String getStatesPattern(Reader data) { + String blockId = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, blockId, blockId); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_LADDER; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java new file mode 100644 index 00000000..136a9e17 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -0,0 +1,119 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.blocks.BlockProperties; + +public class EndLanternBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { + public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public EndLanternBlock(Block source) { + this(FabricBlockSettings.copyOf(source).luminance(15).noOcclusion()); + } + + public EndLanternBlock(Properties settings) { + super(settings.noOcclusion()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(IS_FLOOR, WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; + if (dir != Direction.DOWN && dir != Direction.UP) { + if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { + return null; + } + } + else if (dir == Direction.DOWN) { + if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { + return null; + } + } + else { + if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else { + return null; + } + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + if (state.getValue(IS_FLOOR)) { + return canSupportCenter(world, pos.below(), Direction.UP); + } + else { + return canSupportCenter(world, pos.above(), Direction.DOWN); + } + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + Boolean water = state.getValue(WATERLOGGED); + if (water) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + if (!canSurvive(state, world, pos)) { + return water ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java new file mode 100644 index 00000000..4e9509ca --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -0,0 +1,93 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.MHelper; + +public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRenderTypeable { + private final Block sapling; + + public EndLeavesBlock(Block sapling, MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) + .materialColor(color) + .breakByTool(FabricToolTags.HOES) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); + this.sapling = sapling; + } + + public EndLeavesBlock(Block sapling, MaterialColor color, int light) { + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) + .materialColor(color) + .luminance(light) + .breakByTool(FabricToolTags.HOES) + .breakByTool(FabricToolTags.SHEARS) + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); + this.sapling = sapling; + } + + @Override + public String getStatesPattern(Reader data) { + String blockId = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, blockId, blockId); + } + + @Override + public String getModelPattern(String block) { + String blockId = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(Patterns.BLOCK_BASE, blockId, blockId); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null) { + if (tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (MHelper.RANDOM.nextInt(16) <= fortune) { + return Lists.newArrayList(new ItemStack(sapling)); + } + return Lists.newArrayList(); + } + return MHelper.RANDOM.nextInt(16) == 0 ? Lists.newArrayList(new ItemStack(sapling)) : Lists.newArrayList(); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java new file mode 100644 index 00000000..a10f97ff --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndMetalPaneBlock extends IronBarsBlock implements BlockPatterned, IRenderTypeable { + public EndMetalPaneBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(5.0F, 6.0F).noOcclusion()); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); + } + if (block.contains("post")) { + return Patterns.createJson(Patterns.BLOCK_BARS_POST, blockId.getPath(), blockId.getPath()); + } + else { + return Patterns.createJson(Patterns.BLOCK_BARS_SIDE, blockId.getPath(), blockId.getPath()); + } + } + + @Environment(EnvType.CLIENT) + public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { + if (direction.getAxis().isVertical() && stateFrom.getBlock().is(this) && !stateFrom.equals(state)) { + return false; + } + return super.skipRendering(state, stateFrom, direction); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_BARS; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java new file mode 100644 index 00000000..307dda00 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java @@ -0,0 +1,52 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WeightedPressurePlateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements BlockPatterned { + private final Block parent; + + public EndMetalPlateBlock(Block source) { + super(15, FabricBlockSettings.copyOf(source).noCollission().noOcclusion().requiresCorrectToolForDrops().strength(0.5F)); + this.parent = source; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + if (block.contains("down")) { + return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_PLATE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java new file mode 100644 index 00000000..74c0bbb7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java @@ -0,0 +1,90 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.OreBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.MHelper; + +public class EndOreBlock extends OreBlock implements BlockPatterned { + private final Item dropItem; + private final int minCount; + private final int maxCount; + private final int expirience; + + public EndOreBlock(Item drop, int minCount, int maxCount, int expirience) { + super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) + .hardness(3F) + .resistance(9F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); + this.dropItem = drop; + this.minCount = minCount; + this.maxCount = maxCount; + this.expirience = expirience; + } + + @Override + protected int xpOnDrop(Random random) { + return this.expirience > 0 ? random.nextInt(expirience) + 1 : 0; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + int count = 0; + int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (enchantment > 0) { + int min = Mth.clamp(minCount + enchantment, minCount, maxCount); + int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel()); + if (min == max) { + return Collections.singletonList(new ItemStack(dropItem, max)); + } + count = MHelper.randRange(min, max, MHelper.RANDOM); + } else { + count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM); + } + return Collections.singletonList(new ItemStack(dropItem, count)); + } + return Collections.emptyList(); + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java new file mode 100644 index 00000000..82e02e7a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -0,0 +1,48 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndPillarBlock extends RotatedPillarBlock implements BlockPatterned { + public EndPillarBlock(Properties settings) { + super(settings); + } + + public EndPillarBlock(Block block) { + super(FabricBlockSettings.copyOf(block)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, texture, texture); + } + + @Override + public String getModelPattern(String block) { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(Patterns.BLOCK_PILLAR, texture, texture); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_PILLAR; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java new file mode 100644 index 00000000..bf785d30 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -0,0 +1,131 @@ +package ru.betterend.blocks.basis; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndTags; + +public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + + public EndPlantBlock() { + this(false); + } + + public EndPlantBlock(int light) { + this(false, light); + } + + public EndPlantBlock(boolean replaceable) { + super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); + } + + public EndPlantBlock(boolean replaceable, int light) { + super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.GRASS) + .noCollission()); + } + + public EndPlantBlock(Properties settings) { + super(settings); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + return isTerrain(down); + } + + protected boolean isTerrain(BlockState state) { + return state.is(EndTags.END_GROUND); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return true; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java new file mode 100644 index 00000000..ed6bc623 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks.basis; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.BlockProperties; + +public abstract class EndPlantWithAgeBlock extends EndPlantBlock { + public static final IntegerProperty AGE = BlockProperties.AGE; + + public EndPlantWithAgeBlock() { + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .randomTicks() + .noCollission()); + } + + public EndPlantWithAgeBlock(Properties settings) { + super(settings); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(AGE); + } + + public abstract void growAdult(WorldGenLevel world, Random random, BlockPos pos); + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); + if (age < 3) { + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); + } + else { + growAdult(world, random, pos); + } + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (random.nextInt(8) == 0) { + performBonemeal(world, random, pos, state); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java new file mode 100644 index 00000000..a178faad --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java @@ -0,0 +1,52 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.PressurePlateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { + private final Block parent; + + public EndPlateBlock(Sensitivity rule, Block source) { + super(rule, FabricBlockSettings.copyOf(source).noCollission().noOcclusion().strength(0.5F)); + this.parent = source; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + if (block.contains("down")) { + return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return this.stateDefinition.getProperty("facing") != null ? Patterns.STATE_PLATE_ROTATED : Patterns.STATE_PLATE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java new file mode 100644 index 00000000..eca5c594 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -0,0 +1,210 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SignBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.entities.ESignBlockEntity; +import ru.betterend.interfaces.ISpetialItem; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.BlocksHelper; + +public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialItem { + public static final IntegerProperty ROTATION = BlockStateProperties.ROTATION_16; + public static final BooleanProperty FLOOR = BooleanProperty.create("floor"); + private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { + Block.box(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), + Block.box(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), + Block.box(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), + Block.box(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) + }; + + private final Block parent; + + public EndSignBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollission().noOcclusion(), WoodType.OAK); + this.registerDefaultState(this.stateDefinition.any().setValue(ROTATION, 0).setValue(FLOOR, false).setValue(WATERLOGGED, false)); + this.parent = source; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(ROTATION, FLOOR, WATERLOGGED); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(FLOOR) ? SHAPE : WALL_SHAPES[state.getValue(ROTATION) >> 2]; + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) { + return new ESignBlockEntity(); + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + if (placer != null && placer instanceof Player) { + ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); + if (!world.isClientSide) { + sign.setAllowedPlayerEditor((Player) placer); + ((ServerPlayer) placer).connection.send(new ClientboundOpenSignEditorPacket(pos)); + } + else { + sign.setEditable(true); + } + } + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if ((Boolean) state.getValue(WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + if (!canSurvive(state, world, pos)) { + return state.getValue(WATERLOGGED) ? state.getFluidState().createLegacyBlock() : Blocks.AIR.defaultBlockState(); + } + return super.updateShape(state, facing, neighborState, world, pos, neighborPos); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + if (!state.getValue(FLOOR)) { + int index = (((state.getValue(ROTATION) >> 2) + 2)) & 3; + return world.getBlockState(pos.relative(BlocksHelper.HORIZONTAL[index])).getMaterial().isSolid(); + } + else { + return world.getBlockState(pos.below()).getMaterial().isSolid(); + } + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + if (ctx.getClickedFace() == Direction.UP) { + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + return this.defaultBlockState().setValue(FLOOR, true) + .setValue(ROTATION, Mth.floor((180.0 + ctx.getRotation() * 16.0 / 360.0) + 0.5 - 12) & 15) + .setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); + } + else if (ctx.getClickedFace() != Direction.DOWN) { + BlockState blockState = this.defaultBlockState(); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); + + for (int i = 0; i < directions.length; ++i) { + Direction direction = directions[i]; + if (direction.getAxis().isHorizontal()) { + Direction dir = direction.getOpposite(); + int rot = Mth.floor((180.0 + dir.toYRot() * 16.0 / 360.0) + 0.5 + 4) & 15; + blockState = blockState.setValue(ROTATION, rot); + if (blockState.canSurvive(worldView, blockPos)) { + return blockState.setValue(FLOOR, false).setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); + } + } + } + } + + return null; + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String path) { + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + if (path.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, path); + } + return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return (BlockState) state.setValue(ROTATION, rotation.rotate((Integer) state.getValue(ROTATION), 16)); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return (BlockState) state.setValue(ROTATION, mirror.mirror((Integer) state.getValue(ROTATION), 16)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + // TODO Auto-generated method stub + return false; + } + + @Override + public int getStackSize() { + return 16; + } + + @Override + public boolean canPlaceOnWater() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java new file mode 100644 index 00000000..ef75cac8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -0,0 +1,49 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndSlabBlock extends SlabBlock implements BlockPatterned { + private final Block parent; + + public EndSlabBlock(Block source) { + super(FabricBlockSettings.copyOf(source)); + this.parent = source; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + return Patterns.createJson(Patterns.BLOCK_SLAB, parentId.getPath(), blockId.getPath()); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SLAB; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStairs.java b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java similarity index 51% rename from src/main/java/ru/betterend/blocks/basis/BlockStairs.java rename to src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java index 3dc261fa..98d020cd 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStairs.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java @@ -5,41 +5,41 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.StairsBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockStairs extends StairsBlock implements BlockPatterned { +public class EndStairsBlock extends StairBlock implements BlockPatterned { private final Block parent; - public BlockStairs(Block source) { - super(source.getDefaultState(), FabricBlockSettings.copyOf(source)); + public EndStairsBlock(Block source) { + super(source.defaultBlockState(), FabricBlockSettings.copyOf(source)); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("inner")) { return Patterns.createJson(Patterns.BLOCK_STAIR_INNER, parentId.getPath(), blockId.getPath()); } @@ -50,7 +50,7 @@ public class BlockStairs extends StairsBlock implements BlockPatterned { } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_STAIRS; } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java similarity index 51% rename from src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java rename to src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java index 025569b3..538d06f8 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java @@ -5,41 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.WoodenButtonBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.StoneButtonBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockWoodenButton extends WoodenButtonBlock implements BlockPatterned { - +public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatterned { private final Block parent; - public BlockWoodenButton(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + public EndStoneButtonBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); } @@ -50,7 +49,7 @@ public class BlockWoodenButton extends WoodenButtonBlock implements BlockPattern } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java new file mode 100644 index 00000000..16b16f0e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java @@ -0,0 +1,9 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.world.level.block.Block; + +public class EndStonelateBlock extends EndPlateBlock { + public EndStonelateBlock(Block source) { + super(Sensitivity.MOBS, source); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java similarity index 55% rename from src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java rename to src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java index 08777a7c..626beccd 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java @@ -6,25 +6,25 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.TrapdoorBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockTrapdoor extends TrapdoorBlock implements IRenderTypeable, BlockPatterned { - public BlockTrapdoor(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); +public class EndTrapdoorBlock extends TrapDoorBlock implements IRenderTypeable, BlockPatterned { + public EndTrapdoorBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(3.0F, 3.0F).noOcclusion()); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @@ -35,13 +35,13 @@ public class BlockTrapdoor extends TrapdoorBlock implements IRenderTypeable, Blo @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); String name = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_TRAPDOOR, new HashMap() { private static final long serialVersionUID = 1L; @@ -53,7 +53,7 @@ public class BlockTrapdoor extends TrapdoorBlock implements IRenderTypeable, Blo } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_TRAPDOOR; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java new file mode 100644 index 00000000..656e7898 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -0,0 +1,59 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; + +public class EndUnderwaterWallPlantBlock extends EndWallPlantBlock implements LiquidBlockContainer { + + public EndUnderwaterWallPlantBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); + } + + public EndUnderwaterWallPlantBlock(int light) { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.WET_GRASS) + .noCollission()); + } + + public EndUnderwaterWallPlantBlock(Properties settings) { + super(settings); + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return Fluids.WATER.getSource(false); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getFluidState(pos).getType() == Fluids.WATER && super.canSurvive(state, world, pos); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWall.java b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java similarity index 55% rename from src/main/java/ru/betterend/blocks/basis/BlockWall.java rename to src/main/java/ru/betterend/blocks/basis/EndWallBlock.java index 2010a583..c8e51c77 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWall.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java @@ -5,41 +5,41 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.WallBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockWall extends WallBlock implements BlockPatterned { +public class EndWallBlock extends WallBlock implements BlockPatterned { private final Block parent; - public BlockWall(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + public EndWallBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_WALL, parentId.getPath(), blockId.getPath()); } @@ -53,7 +53,7 @@ public class BlockWall extends WallBlock implements BlockPatterned { } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_WALL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java new file mode 100644 index 00000000..69357296 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -0,0 +1,125 @@ +package ru.betterend.blocks.basis; + +import java.util.EnumMap; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.util.BlocksHelper; + +public class EndWallPlantBlock extends EndPlantBlock { + private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of( + Direction.NORTH, Block.box(1, 1, 8, 15, 15, 16), + Direction.SOUTH, Block.box(1, 1, 0, 15, 15, 8), + Direction.WEST, Block.box(8, 1, 1, 16, 15, 15), + Direction.EAST, Block.box(0, 1, 1, 8, 15, 15))); + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + + public EndWallPlantBlock() { + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); + } + + public EndWallPlantBlock(int light) { + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.GRASS) + .noCollission()); + } + + public EndWallPlantBlock(Properties settings) { + super(settings); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPES.get(state.getValue(FACING)); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + BlockState blockState = world.getBlockState(blockPos); + return isSupport(world, blockPos, blockState, direction); + } + + public boolean isSupport(LevelReader world, BlockPos pos, BlockState blockState, Direction direction) { + return blockState.getMaterial().isSolid() && blockState.isFaceSturdy(world, pos, direction); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState blockState = this.defaultBlockState(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); + for (int i = 0; i < directions.length; ++i) { + Direction direction = directions[i]; + if (direction.getAxis().isHorizontal()) { + Direction direction2 = direction.getOpposite(); + blockState = blockState.setValue(FACING, direction2); + if (blockState.canSurvive(worldView, blockPos)) { + return blockState; + } + } + } + return null; + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java similarity index 50% rename from src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java rename to src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index a7dd86e5..a2455f6d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -5,41 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.StoneButtonBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WoodButtonBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockStoneButton extends StoneButtonBlock implements BlockPatterned { - +public class EndWoodenButtonBlock extends WoodButtonBlock implements BlockPatterned { private final Block parent; - public BlockStoneButton(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + public EndWoodenButtonBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).noOcclusion()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); } @@ -50,7 +49,7 @@ public class BlockStoneButton extends StoneButtonBlock implements BlockPatterned } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java new file mode 100644 index 00000000..90454903 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java @@ -0,0 +1,9 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.world.level.block.Block; + +public class EndWoodenPlateBlock extends EndPlateBlock { + public EndWoodenPlateBlock(Block source) { + super(Sensitivity.EVERYTHING, source); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java new file mode 100644 index 00000000..b5b4b11c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -0,0 +1,119 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndTags; + +public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements BonemealableBlock, IRenderTypeable { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + + public FeatureSaplingBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByHand(true) + .collidable(false) + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()); + } + + public FeatureSaplingBlock(int light) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByHand(true) + .collidable(false) + .luminance(light) + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()); + } + + protected abstract Feature getFeature(); + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndTags.END_GROUND); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) + return Blocks.AIR.defaultBlockState(); + else + return state; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return true; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(16) == 0; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + getFeature().place(world, world.getChunkSource().getGenerator(), random, pos, null); + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state)) { + performBonemeal(world, random, pos, state); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public String getStatesPattern(Reader data) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + if (block.contains("item")) { + block = block.split("/")[1]; + return Patterns.createJson(Patterns.ITEM_BLOCK, block); + } + return Patterns.createJson(Patterns.BLOCK_CROSS, block); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SAPLING; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java new file mode 100644 index 00000000..01e4ef2c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -0,0 +1,88 @@ +package ru.betterend.blocks.basis; + +import java.util.EnumMap; +import java.util.List; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.util.MHelper; + +public class FurBlock extends AttachedBlock implements IRenderTypeable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + private final ItemLike drop; + private final int dropChance; + + public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(wet ? SoundType.WET_GRASS : SoundType.GRASS) + .noCollission()); + this.drop = drop; + this.dropChance = dropChance; + } + + public FurBlock(ItemLike drop, int dropChance) { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); + this.drop = drop; + this.dropChance = dropChance; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return BOUNDING_SHAPES.get(state.getValue(FACING)); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { + return Lists.newArrayList(new ItemStack(drop)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java new file mode 100644 index 00000000..7f3a1f7e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -0,0 +1,394 @@ +package ru.betterend.blocks.basis; + +import java.awt.Point; +import java.io.Reader; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.PedestalState; +import ru.betterend.blocks.InfusionPedestal; +import ru.betterend.blocks.entities.PedestalBlockEntity; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlocks; +import ru.betterend.rituals.InfusionRitual; + +public class PedestalBlock extends BlockBaseNotFull implements EntityBlock { + public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; + public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; + public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; + + private static final VoxelShape SHAPE_DEFAULT; + private static final VoxelShape SHAPE_COLUMN; + private static final VoxelShape SHAPE_PILLAR; + private static final VoxelShape SHAPE_PEDESTAL_TOP; + private static final VoxelShape SHAPE_COLUMN_TOP; + private static final VoxelShape SHAPE_BOTTOM; + + /** + * + * Register new Pedestal block with Better End mod id. + * + * @param name + * @param source + * @return new Pedestal block with Better End id. + */ + public static Block registerPedestal(String name, Block source) { + return EndBlocks.registerBlock(name, new PedestalBlock(source)); + } + + /** + * + * Register new Pedestal block with specified mod id. + * + * @param id + * @param source + * @return new Pedestal block with specified id. + */ + public static Block registerPedestal(ResourceLocation id, Block source) { + return EndBlocks.registerBlock(id, new PedestalBlock(source)); + } + + protected final Block parent; + protected float height = 1.0F; + + public PedestalBlock(Block parent) { + super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); + this.parent = parent; + } + + public float getHeight(BlockState state) { + if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { + return this.height - 0.2F; + } + return this.height; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (world.isClientSide || !state.is(this)) return InteractionResult.CONSUME; + if (!isPlaceable(state)) { + return InteractionResult.PASS; + } + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof PedestalBlockEntity) { + PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; + if (pedestal.isEmpty()) { + ItemStack itemStack = player.getItemInHand(hand); + if (itemStack.isEmpty()) return InteractionResult.CONSUME; + pedestal.setItem(0, itemStack.split(1)); + checkRitual(world, pos); + return InteractionResult.SUCCESS; + } else { + ItemStack itemStack = pedestal.getItem(0); + if (player.addItem(itemStack)) { + pedestal.removeItemNoUpdate(0); + checkRitual(world, pos); + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } + } + return InteractionResult.PASS; + } + + public void checkRitual(Level world, BlockPos pos) { + MutableBlockPos posMutable = new MutableBlockPos(); + for (Point point: InfusionRitual.getMap()) { + posMutable.set(pos).move(point.x, 0, point.y); + BlockState state = world.getBlockState(posMutable); + if (state.getBlock() instanceof InfusionPedestal) { + ((InfusionPedestal) state.getBlock()).checkRitual(world, posMutable); + break; + } + } + } + + @Override + @Nullable + public BlockState getStateForPlacement(BlockPlaceContext context) { + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + BlockState upState = world.getBlockState(pos.above()); + BlockState downState = world.getBlockState(pos.below()); + boolean upSideSolid = upState.isFaceSturdy(world, pos.above(), Direction.DOWN) || upState.is(BlockTags.WALLS); + boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; + boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; + if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { + return defaultBlockState().setValue(STATE, PedestalState.COLUMN_TOP); + } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + return defaultBlockState().setValue(STATE, PedestalState.COLUMN); + } else if (hasPedestalUnder && hasPedestalOver) { + return defaultBlockState().setValue(STATE, PedestalState.PILLAR); + } else if (hasPedestalUnder) { + return defaultBlockState().setValue(STATE, PedestalState.PEDESTAL_TOP); + } else if (hasPedestalOver) { + return defaultBlockState().setValue(STATE, PedestalState.BOTTOM); + } + return defaultBlockState(); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + BlockState updated = getUpdatedState(state, direction, newState, world, pos, posFrom); + if (!updated.is(this)) return updated; + if (!isPlaceable(updated)) { + moveStoredStack(world, updated, pos); + } + return updated; + } + + private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!state.is(this)) return state.updateShape(direction, newState, world, pos, posFrom); + if (direction != Direction.UP && direction != Direction.DOWN) return state; + BlockState upState = world.getBlockState(pos.above()); + BlockState downState = world.getBlockState(pos.below()); + boolean upSideSolid = upState.isFaceSturdy(world, pos.above(), Direction.DOWN) || upState.is(BlockTags.WALLS); + boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; + boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; + if (direction == Direction.UP) { + upSideSolid = newState.isFaceSturdy(world, posFrom, Direction.DOWN) || newState.is(BlockTags.WALLS); + hasPedestalOver = newState.getBlock() instanceof PedestalBlock; + } else { + hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; + } + BlockState updatedState; + if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { + updatedState = state.setValue(STATE, PedestalState.COLUMN_TOP); + } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + updatedState = state.setValue(STATE, PedestalState.COLUMN); + } else if (hasPedestalUnder && hasPedestalOver) { + updatedState = state.setValue(STATE, PedestalState.PILLAR); + } else if (hasPedestalUnder) { + updatedState = state.setValue(STATE, PedestalState.PEDESTAL_TOP); + } else if (hasPedestalOver) { + updatedState = state.setValue(STATE, PedestalState.BOTTOM); + } else { + updatedState = state.setValue(STATE, PedestalState.DEFAULT); + } + if (!isPlaceable(updatedState)) { + updatedState = updatedState.setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false); + } + return updatedState; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = Lists.newArrayList(super.getDrops(state, builder)); + if (state.is(this)) { + if (isPlaceable(state)) { + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (blockEntity instanceof PedestalBlockEntity) { + PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; + if (!pedestal.isEmpty()) { + drop.add(pedestal.getItem(0)); + } + } + } else { + return drop; + } + } + return drop; + } + + private void moveStoredStack(LevelAccessor world, BlockState state, BlockPos pos) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof PedestalBlockEntity && state.is(this)) { + PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; + ItemStack stack = pedestal.removeItemNoUpdate(0); + if (!stack.isEmpty()) { + moveStoredStack(blockEntity, world, stack, pos.above()); + } + } + } + + private void moveStoredStack(BlockEntity blockEntity, LevelAccessor world, ItemStack stack, BlockPos pos) { + BlockState state = world.getBlockState(pos); + if (!state.is(this)) { + dropStoredStack(blockEntity, stack, pos); + } else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { + moveStoredStack(blockEntity, world, stack, pos.above()); + } else if (!isPlaceable(state)) { + dropStoredStack(blockEntity, stack, pos); + } else if (blockEntity instanceof PedestalBlockEntity) { + PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; + if (pedestal.isEmpty()) { + pedestal.setItem(0, stack); + } else { + dropStoredStack(blockEntity, stack, pos); + } + } else { + dropStoredStack(blockEntity, stack, pos); + } + } + + private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { + if (blockEntity != null && blockEntity.getLevel() != null) { + Level world = blockEntity.getLevel(); + Block.popResource(world, getDropPos(world, pos), stack); + } + } + + private BlockPos getDropPos(LevelAccessor world, BlockPos pos) { + BlockPos dropPos; + if (world.getBlockState(pos).isAir()) { + return pos; + } + if (world.getBlockState(pos.above()).isAir()) { + return pos.above(); + } + for(int i = 2; i < Direction.values().length; i++) { + dropPos = pos.relative(Direction.from3DDataValue(i)); + if (world.getBlockState(dropPos).isAir()) { + return dropPos.immutable(); + } + } + return getDropPos(world, pos.above()); + } + + public boolean isPlaceable(BlockState state) { + if (!state.is(this)) return false; + PedestalState currentState = state.getValue(STATE); + return currentState == PedestalState.DEFAULT || + currentState == PedestalState.PEDESTAL_TOP; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + if (state.is(this)) { + switch(state.getValue(STATE)) { + case BOTTOM: { + return SHAPE_BOTTOM; + } + case PEDESTAL_TOP: { + return SHAPE_PEDESTAL_TOP; + } + case COLUMN_TOP: { + return SHAPE_COLUMN_TOP; + } + case PILLAR: { + return SHAPE_PILLAR; + } + case COLUMN: { + return SHAPE_COLUMN; + } + default: { + return SHAPE_DEFAULT; + } + } + } + return super.getShape(state, world, pos, context); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); + } + + @Override + public BlockEntity newBlockEntity(BlockGetter world) { + return new PedestalBlockEntity(); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return state.getBlock() instanceof PedestalBlock; + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { + return state.getValue(HAS_ITEM) ? 15 : 0; + } + + @Override + public String getStatesPattern(Reader data) { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, texture, texture); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(parent); + String name = blockId.getPath(); + Map textures = new HashMap() { + private static final long serialVersionUID = 1L; + { + put("%mod%", blockId.getNamespace() ); + put("%top%", name + "_top"); + put("%base%", name + "_base"); + put("%pillar%", name + "_pillar"); + put("%bottom%", name + "_bottom"); + } + }; + if (block.contains("column_top")) { + return Patterns.createJson(Patterns.BLOCK_PEDESTAL_COLUMN_TOP, textures); + } else if (block.contains("column")) { + return Patterns.createJson(Patterns.BLOKC_PEDESTAL_COLUMN, textures); + } else if (block.contains("top")) { + return Patterns.createJson(Patterns.BLOCK_PEDESTAL_TOP, textures); + } else if (block.contains("bottom")) { + return Patterns.createJson(Patterns.BLOCK_PEDESTAL_BOTTOM, textures); + } else if (block.contains("pillar")) { + return Patterns.createJson(Patterns.BLOCK_PEDESTAL_PILLAR, textures); + } + return Patterns.createJson(Patterns.BLOCK_PEDESTAL_DEFAULT, textures); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_PEDESTAL; + } + + static { + VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); + VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); + VoxelShape columnTopUp = Block.box(1, 14, 1, 15, 16, 15); + VoxelShape columnTopDown = Block.box(2, 13, 2, 14, 14, 14); + VoxelShape pedestalTop = Block.box(1, 8, 1, 15, 10, 15); + VoxelShape pedestalDefault = Block.box(1, 12, 1, 15, 14, 15); + VoxelShape pillar = Block.box(3, 0, 3, 13, 8, 13); + VoxelShape pillarDefault = Block.box(3, 0, 3, 13, 12, 13); + VoxelShape columnTop = Shapes.or(columnTopDown, columnTopUp); + VoxelShape basin = Shapes.or(basinDown, basinUp); + SHAPE_PILLAR = Block.box(3, 0, 3, 13, 16, 13); + SHAPE_DEFAULT = Shapes.or(basin, pillarDefault, pedestalDefault); + SHAPE_PEDESTAL_TOP = Shapes.or(pillar, pedestalTop); + SHAPE_COLUMN_TOP = Shapes.or(SHAPE_PILLAR, columnTop); + SHAPE_COLUMN = Shapes.or(basin, SHAPE_PILLAR, columnTop); + SHAPE_BOTTOM = Shapes.or(basin, SHAPE_PILLAR); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java new file mode 100644 index 00000000..8fc9a20b --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java @@ -0,0 +1,60 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.Patterns; + +public class SimpleLeavesBlock extends BlockBaseNotFull implements IRenderTypeable { + public SimpleLeavesBlock(MaterialColor color) { + super(FabricBlockSettings.of(Material.LEAVES) + .strength(0.2F) + .materialColor(color) + .sound(SoundType.GRASS) + .noOcclusion() + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); + } + + public SimpleLeavesBlock(MaterialColor color, int light) { + super(FabricBlockSettings.of(Material.LEAVES) + .luminance(light) + .materialColor(color) + .strength(0.2F) + .sound(SoundType.GRASS) + .noOcclusion() + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); + } + + @Override + public String getStatesPattern(Reader data) { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, texture, texture); + } + + @Override + public String getModelPattern(String block) { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(Patterns.BLOCK_BASE, texture, texture); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java new file mode 100644 index 00000000..4bcf8179 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -0,0 +1,237 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.Patterns; + +public class StalactiteBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer, IRenderTypeable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; + public static final IntegerProperty SIZE = BlockProperties.SIZE; + private static final VoxelShape[] SHAPES; + + public StalactiteBlock(Block source) { + super(FabricBlockSettings.copy(source).noOcclusion()); + this.registerDefaultState(getStateDefinition().any().setValue(SIZE, 0).setValue(IS_FLOOR, true).setValue(WATERLOGGED, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(WATERLOGGED, IS_FLOOR, SIZE); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPES[state.getValue(SIZE)]; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelReader world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + boolean water = world.getFluidState(pos).getType() == Fluids.WATER; + + if (dir == Direction.DOWN) { + if (isThis(world, pos.above()) || canSupportCenter(world, pos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (isThis(world, pos.below()) || canSupportCenter(world, pos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { + return null; + } + } + else { + if (isThis(world, pos.below()) || canSupportCenter(world, pos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else if (isThis(world, pos.above()) || canSupportCenter(world, pos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else { + return null; + } + } + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + boolean hasUp = isThis(world, pos.above()); + boolean hasDown = isThis(world, pos.below()); + MutableBlockPos mut = new MutableBlockPos(); + if (hasUp && hasDown) { + boolean floor = state.getValue(IS_FLOOR); + BlockPos second = floor ? pos.above() : pos.below(); + BlockState bState = world.getBlockState(second); + world.setBlockAndUpdate(pos, state.setValue(SIZE, 1).setValue(IS_FLOOR, floor)); + world.setBlockAndUpdate(second, bState.setValue(SIZE, 1).setValue(IS_FLOOR, !floor)); + + bState = state; + int startSize = floor ? 1 : 2; + mut.set(pos.getX(), pos.getY() + 1, pos.getZ()); + for (int i = 0; i < 8 && isThis(bState); i++) { + world.setBlockAndUpdate(mut, bState.setValue(SIZE, startSize++).setValue(IS_FLOOR, false)); + mut.setY(mut.getY() + 1); + bState = world.getBlockState(mut); + } + + bState = state; + startSize = floor ? 2 : 1; + mut.set(pos.getX(), pos.getY() - 1, pos.getZ()); + for (int i = 0; i < 8 && isThis(bState); i++) { + world.setBlockAndUpdate(mut, bState.setValue(SIZE, startSize++).setValue(IS_FLOOR, true)); + mut.setY(mut.getY() - 1); + bState = world.getBlockState(mut); + } + } + else if (hasDown) { + mut.setX(pos.getX()); + mut.setZ(pos.getZ()); + for (int i = 1; i < 8; i++) { + mut.setY(pos.getY() - i); + if (isThis(world, mut)) { + BlockState state2 = world.getBlockState(mut); + int size = state2.getValue(SIZE); + if (size < i) { + world.setBlockAndUpdate(mut, state2.setValue(SIZE, i).setValue(IS_FLOOR, true)); + } + else { + break; + } + } + else { + break; + } + } + } + else if (hasUp) { + mut.setX(pos.getX()); + mut.setZ(pos.getZ()); + for (int i = 1; i < 8; i++) { + mut.setY(pos.getY() + i); + if (isThis(world, mut)) { + BlockState state2 = world.getBlockState(mut); + int size = state2.getValue(SIZE); + if (size < i) { + world.setBlockAndUpdate(mut, state2.setValue(SIZE, i).setValue(IS_FLOOR, false)); + } + else { + break; + } + } + else { + break; + } + } + } + } + + private boolean isThis(LevelReader world, BlockPos pos) { + return isThis(world.getBlockState(pos)); + } + + private boolean isThis(BlockState state) { + return state.getBlock() instanceof StalactiteBlock; + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + return state; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + int size = state.getValue(SIZE); + return checkUp(world, pos, size) || checkDown(world, pos, size); + } + + private boolean checkUp(BlockGetter world, BlockPos pos, int size) { + BlockPos p = pos.above(); + BlockState state = world.getBlockState(p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isCollisionShapeFullBlock(world, p); + } + + private boolean checkDown(BlockGetter world, BlockPos pos, int size) { + BlockPos p = pos.below(); + BlockState state = world.getBlockState(p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isCollisionShapeFullBlock(world, p); + } + + @Override + public String getModelPattern(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_CROSS_SHADED, block); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_STALACTITE; + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + static { + float end = 2F / 8F; + float start = 5F / 8F; + SHAPES = new VoxelShape[8]; + for (int i = 0; i < 8; i++) { + int side = Mth.floor(Mth.lerp(i / 7F, start, end) * 8F + 0.5F); + SHAPES[i] = Block.box(side, 0, side, 16 - side, 16, 16 - side); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java new file mode 100644 index 00000000..8488dca9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -0,0 +1,84 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.MHelper; + +public class StoneLanternBlock extends EndLanternBlock implements IColorProvider { + private static final VoxelShape SHAPE_CEIL = Block.box(3, 1, 3, 13, 16, 13); + private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); + private static final Vec3i[] COLORS = AuroraCrystalBlock.COLORS; + + public StoneLanternBlock(Block source) { + super(FabricBlockSettings.copyOf(source).luminance(15)); + } + + @Override + public BlockColor getProvider() { + return (state, world, pos, tintIndex) -> { + long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); + double delta = i * 0.1; + int index = MHelper.floor(delta); + int index2 = (index + 1) & 3; + delta -= index; + index &= 3; + + Vec3i color1 = COLORS[index]; + Vec3i color2 = COLORS[index2]; + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); + + return MHelper.color(r, g, b); + }; + } + + @Override + public ItemColor getItemProvider() { + return (stack, tintIndex) -> { + return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); + }; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_STONE_LANTERN; + } + + @Override + public String getModelPattern(String block) { + String texture = Registry.BLOCK.getKey(this).getPath(); + if (block.contains("ceil")) { + return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, texture, texture); + } + return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, texture, texture); + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createJson(data, block, block); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java new file mode 100644 index 00000000..d70f0d5f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java @@ -0,0 +1,41 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; + +public class StrippableBarkBlock extends BarkBlock { + private final Block striped; + + public StrippableBarkBlock(MaterialColor color, Block striped) { + super(FabricBlockSettings.copyOf(striped).materialColor(color)); + this.striped = striped; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (player.getMainHandItem().getItem().is(FabricToolTags.AXES)) { + world.playSound(player, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlock(pos, striped.defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)), 11); + if (player != null && !player.isCreative()) { + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); + } + } + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java new file mode 100644 index 00000000..e9f013d6 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -0,0 +1,124 @@ +package ru.betterend.blocks.basis; + +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.patterns.Patterns; + +public class TripleTerrainBlock extends EndTerrainBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + public TripleTerrainBlock(MaterialColor color) { + super(color); + this.registerDefaultState(this.defaultBlockState().setValue(SHAPE, TripleShape.BOTTOM)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getClickedFace(); + TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; + return this.defaultBlockState().setValue(SHAPE, shape); + } + + @Override + public String getModelPattern(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + if (block.endsWith("_middle")) { + return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); + } + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public ResourceLocation statePatternId() { + return Patterns.STATE_TRIPLE_ROTATED_TOP; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.BOTTOM) { + return super.use(state, world, pos, player, hand, hit); + } + return InteractionResult.FAIL; + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.BOTTOM) { + super.randomTick(state, world, pos, random); + return; + } + else if (random.nextInt(16) == 0) { + boolean bottom = canStayBottom(world, pos); + if (shape == TripleShape.TOP) { + if (!bottom) { + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); + } + } + else { + boolean top = canStay(state, world, pos) || isMiddle(world.getBlockState(pos.above())); + if (!top && !bottom) { + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); + } + else if (top && !bottom) { + world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.BOTTOM)); + } + else if (!top && bottom) { + world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.TOP)); + } + } + } + } + + protected boolean canStayBottom(LevelReader world, BlockPos pos) { + BlockPos blockPos = pos.below(); + BlockState blockState = world.getBlockState(blockPos); + if (isMiddle(blockState)) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + return !blockState.isFaceSturdy(world, blockPos, Direction.UP); + } + } + + protected boolean isMiddle(BlockState state) { + return state.is(this) && state.getValue(SHAPE) == TripleShape.MIDDLE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java new file mode 100644 index 00000000..39e94ec2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -0,0 +1,145 @@ +package ru.betterend.blocks.basis; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; + +public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock, LiquidBlockContainer { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + + public UnderwaterPlantBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); + } + + public UnderwaterPlantBlock(int light) { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.WET_GRASS) + .noCollission()); + } + + public UnderwaterPlantBlock(Properties settings) { + super(settings); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + state = world.getBlockState(pos); + return isTerrain(down) && state.getFluidState().getType().equals(Fluids.WATER.getSource()); + } + + protected boolean isTerrain(BlockState state) { + return state.is(EndTags.END_GROUND) || state.getBlock() == EndBlocks.ENDSTONE_DUST; + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + world.destroyBlock(pos, true); + return Blocks.WATER.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return true; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); + } + + @Override + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return Fluids.WATER.getSource(false); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java new file mode 100644 index 00000000..4ba46a39 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -0,0 +1,57 @@ +package ru.betterend.blocks.basis; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.BlockProperties; + +public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { + public static final IntegerProperty AGE = BlockProperties.AGE; + + public UnderwaterPlantWithAgeBlock() { + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .randomTicks() + .noCollission()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(AGE); + } + + public abstract void grow(WorldGenLevel world, Random random, BlockPos pos); + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + if (random.nextInt(4) == 0) { + int age = state.getValue(AGE); + if (age < 3) { + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); + } + else { + grow(world, random, pos); + } + } + } + + @Override + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state)) { + performBonemeal(world, random, pos, state); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java new file mode 100644 index 00000000..d53fbb34 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -0,0 +1,95 @@ +package ru.betterend.blocks.basis; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndTags; + +public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeable { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); + + public UpDownPlantBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.below()); + BlockState up = world.getBlockState(pos.above()); + return (isTerrain(down) || down.getBlock() == this) && (isSupport(up, world, pos) || up.getBlock() == this); + } + + protected boolean isTerrain(BlockState state) { + return state.is(EndTags.END_GROUND); + } + + protected boolean isSupport(BlockState state, LevelReader world, BlockPos pos) { + return canSupportCenter(world, pos.above(), Direction.UP); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + return state; + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { + super.playerDestroy(world, player, pos, state, blockEntity, stack); + world.neighborChanged(pos, Blocks.AIR, pos.below()); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/VineBlock.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java new file mode 100644 index 00000000..45875dff --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -0,0 +1,147 @@ +package ru.betterend.blocks.basis; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.util.BlocksHelper; + +public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final VoxelShape VOXEL_SHAPE = Block.box(2, 0, 2, 14, 16, 14); + + public VineBlock() { + this(0, false); + } + + public VineBlock(int light) { + this(light, false); + } + + public VineBlock(int light, boolean bottomOnly) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel((state) -> bottomOnly ? state.getValue(SHAPE) == TripleShape.BOTTOM ? light : 0 : light) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(SHAPE, TripleShape.BOTTOM)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return VOXEL_SHAPE.move(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; + } + + public boolean canGenerate(BlockState state, LevelReader world, BlockPos pos) { + return isSupport(state, world, pos); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return isSupport(state, world, pos); + } + + protected boolean isSupport(BlockState state, LevelReader world, BlockPos pos) { + BlockState up = world.getBlockState(pos.above()); + return up.is(this) || up.is(BlockTags.LEAVES) || canSupportCenter(world, pos.above(), Direction.DOWN); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + else { + if (world.getBlockState(pos.below()).getBlock() != this) + return state.setValue(SHAPE, TripleShape.BOTTOM); + else if (world.getBlockState(pos.above()).getBlock() != this) + return state.setValue(SHAPE, TripleShape.TOP); + return state.setValue(SHAPE, TripleShape.MIDDLE); + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + while (world.getBlockState(pos).getBlock() == this) { + pos = pos.below(); + } + return world.getBlockState(pos).isAir(); + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + while (world.getBlockState(pos).getBlock() == this) { + pos = pos.below(); + } + return world.isEmptyBlock(pos); + } + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + while (world.getBlockState(pos).getBlock() == this) { + pos = pos.below(); + } + world.setBlockAndUpdate(pos, defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, pos, defaultBlockState()); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java new file mode 100644 index 00000000..7e6a2ac4 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java @@ -0,0 +1,39 @@ +package ru.betterend.blocks.basis; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; + +public class WallMushroomBlock extends EndWallPlantBlock { + public WallMushroomBlock(int light) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.AXES) + .breakByHand(true) + .luminance(light) + .hardness(0.2F) + .sound(SoundType.GRASS) + .sound(SoundType.WOOD) + .noCollission()); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } + + @Override + public boolean isSupport(LevelReader world, BlockPos pos, BlockState blockState, Direction direction) { + return blockState.getMaterial().isSolid() && blockState.isFaceSturdy(world, pos, direction); + } +} diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 33955b27..22274872 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -6,33 +6,55 @@ import java.util.function.Function; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.item.DyeItem; -import net.minecraft.util.DyeColor; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; public class ColoredMaterial { - private final Map colors = Maps.newEnumMap(DyeColor.class); + private static final Map DYES = Maps.newHashMap(); + private static final Map COLORS = Maps.newHashMap(); + private final Map colors = Maps.newHashMap(); public ColoredMaterial(Function constructor, Block source, boolean craftEight) { - String id = Registry.BLOCK.getId(source).getPath(); - for (DyeColor color: DyeColor.values()) { - Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(color)); - String blockName = id + "_" + color.getName(); + this(constructor, source, COLORS, DYES, craftEight); + } + + public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { + String id = Registry.BLOCK.getKey(source).getPath(); + colors.forEach((color, name) -> { + String blockName = id + "_" + name; + Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { - GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', DyeItem.byColor(color)).build(); + GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); } else { - GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', DyeItem.byColor(color)).build(); + GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); } - colors.put(color, block); - } - } + this.colors.put(color, block); + BlocksHelper.addBlockColor(block, color); + }); + } public Block getByColor(DyeColor color) { + return colors.get(color.getMaterialColor().col); + } + + public Block getByColor(int color) { return colors.get(color); } + + static { + for (DyeColor color: DyeColor.values()) { + int colorRGB = color.getMaterialColor().col; + COLORS.put(colorRGB, color.getName()); + DYES.put(colorRGB, DyeItem.byColor(color)); + } + } } diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java new file mode 100644 index 00000000..352909ea --- /dev/null +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -0,0 +1,72 @@ +package ru.betterend.blocks.complex; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; +import ru.betterend.blocks.EndPedestal; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndWallBlock; +import ru.betterend.recipe.CraftingRecipes; +import ru.betterend.recipe.builders.GridRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.TagHelper; + +public class CrystalSubblocksMaterial { + public final Block polished; + public final Block tiles; + public final Block pillar; + public final Block stairs; + public final Block slab; + public final Block wall; + public final Block pedestal; + public final Block bricks; + public final Block brick_stairs; + public final Block brick_slab; + public final Block brick_wall; + + public CrystalSubblocksMaterial(String name, Block source) { + FabricBlockSettings material = FabricBlockSettings.copyOf(source); + polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new EndPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(source)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(source)); + wall = EndBlocks.registerBlock(name + "_wall", new EndWallBlock(source)); + pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(source)); + bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); + brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); + brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); + brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); + + // Recipes // + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); + + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); + + // Item Tags // + TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); + TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); + TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); + TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); + + // Block Tags // + TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); + TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); + TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java new file mode 100644 index 00000000..0b8f1df0 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -0,0 +1,206 @@ +package ru.betterend.blocks.complex; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.blocks.basis.EndChainBlock; +import ru.betterend.blocks.basis.EndDoorBlock; +import ru.betterend.blocks.basis.EndMetalPaneBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndTrapdoorBlock; +import ru.betterend.blocks.basis.EndWoodenPlateBlock; +import ru.betterend.item.EndArmorItem; +import ru.betterend.item.PatternedItem; +import ru.betterend.item.tool.EndAxeItem; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndHoeItem; +import ru.betterend.item.tool.EndPickaxeItem; +import ru.betterend.item.tool.EndShovelItem; +import ru.betterend.item.tool.EndSwordItem; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; +import ru.betterend.recipe.builders.FurnaceRecipe; +import ru.betterend.recipe.builders.GridRecipe; +import ru.betterend.recipe.builders.SmithingTableRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; +import ru.betterend.util.TagHelper; + +public class MetalMaterial { + public final Block ore; + public final Block block; + public final Block tile; + public final Block bars; + public final Block plate; + public final Block door; + public final Block trapdoor; + public final Block anvil; + public final Block chain; + public final Block stairs; + public final Block slab; + + public final Block chandelier; + public final Block bulb_lantern; + public final ColoredMaterial bulb_lantern_colored; + + public final Item nugget; + public final Item ingot; + + public final Item shovelHead; + public final Item pickaxeHead; + public final Item axeHead; + public final Item hoeHead; + public final Item swordBlade; + public final Item swordHandle; + + public final Item shovel; + public final Item sword; + public final Item pickaxe; + public final Item axe; + public final Item hoe; + public final Item hammer; + + public final Item helmet; + public final Item chestplate; + public final Item leggings; + public final Item boots; + + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + } + + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { + BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); + final int level = material.getLevel(); + + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; + block = EndBlocks.registerBlock(name + "_block", new BlockBase(settings)); + tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(settings)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); + door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); + anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.defaultMaterialColor(), level)); + bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); + chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.defaultMaterialColor())); + plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); + + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); + bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); + bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); + + nugget = EndItems.registerItem(name + "_nugget", new PatternedItem(itemSettings)); + ingot = EndItems.registerItem(name + "_ingot", new PatternedItem(itemSettings)); + + shovelHead = EndItems.registerItem(name + "_shovel_head"); + pickaxeHead = EndItems.registerItem(name + "_pickaxe_head"); + axeHead = EndItems.registerItem(name + "_axe_head"); + hoeHead = EndItems.registerItem(name + "_hoe_head"); + swordBlade = EndItems.registerItem(name + "_sword_blade"); + swordHandle = EndItems.registerItem(name + "_sword_handle"); + + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, itemSettings)); + sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, itemSettings)); + pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, itemSettings)); + axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, itemSettings)); + hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, itemSettings)); + hammer = EndItems.registerTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); + + helmet = EndItems.registerItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); + chestplate = EndItems.registerItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); + leggings = EndItems.registerItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); + boots = EndItems.registerItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); + + if (hasOre) { + FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").buildWithBlasting(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + } + + // Basic recipes + GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); + GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); + GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); + + // Block recipes + GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); + GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); + GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); + GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); + GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); + GridRecipe.make(name + "_bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); + + GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + + // Tools & armor into nuggets + FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_pickaxe_nugget", pickaxe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_sword_nugget", sword, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_hammer_nugget", hammer, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_helmet_nugget", helmet, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").buildWithBlasting(); + + // Tool parts from ingots + AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + + // Tools from parts + SmithingTableRecipe.create(name + "_hammer").setResult(hammer).setBase(block).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_axe").setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_hoe").setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); + SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); + + // Armor crafting + GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot).setGroup("end_metal_helmets").build(); + GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot).setGroup("end_metal_chestplates").build(); + GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot).setGroup("end_metal_leggings").build(); + GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); + + TagHelper.addTag(BlockTags.ANVIL, anvil); + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); + TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); + TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 77382814..8a06d206 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -1,24 +1,26 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.blocks.basis.BlockPillar; -import ru.betterend.blocks.basis.BlockSlab; -import ru.betterend.blocks.basis.BlockStairs; -import ru.betterend.blocks.basis.BlockStoneButton; -import ru.betterend.blocks.basis.BlockStoneLantern; -import ru.betterend.blocks.basis.BlockStonePressurePlate; -import ru.betterend.blocks.basis.BlockWall; +import ru.betterend.blocks.basis.EndFurnaceBlock; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndStoneButtonBlock; +import ru.betterend.blocks.basis.EndStonelateBlock; +import ru.betterend.blocks.basis.EndWallBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; public class StoneMaterial { @@ -39,6 +41,7 @@ public class StoneMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; + public final Block furnace; public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); @@ -46,19 +49,20 @@ public class StoneMaterial { stone = EndBlocks.registerBlock(name, new BlockBase(material)); polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); - pillar = EndBlocks.registerBlock(name + "_pillar", new BlockPillar(material)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BlockStairs(stone)); - slab = EndBlocks.registerBlock(name + "_slab", new BlockSlab(stone)); - wall = EndBlocks.registerBlock(name + "_wall", new BlockWall(stone)); - button = EndBlocks.registerBlock(name + "_button", new BlockStoneButton(stone)); - pressure_plate = EndBlocks.registerBlock(name + "_plate", new BlockStonePressurePlate(stone)); + pillar = EndBlocks.registerBlock(name + "_pillar", new EndPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(stone)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(stone)); + wall = EndBlocks.registerBlock(name + "_wall", new EndWallBlock(stone)); + button = EndBlocks.registerBlock(name + "_button", new EndStoneButtonBlock(stone)); + pressure_plate = EndBlocks.registerBlock(name + "_plate", new EndStonelateBlock(stone)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); - lantern = EndBlocks.registerBlock(name + "_lantern", new BlockStoneLantern(stone)); + lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); - brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BlockStairs(bricks)); - brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BlockSlab(bricks)); - brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BlockWall(bricks)); + brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); + brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); + brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); + furnace = EndBlocks.registerBlock(name + "_furnace", new EndFurnaceBlock(bricks)); // Recipes // GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); @@ -77,6 +81,7 @@ public class StoneMaterial { GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); @@ -85,11 +90,15 @@ public class StoneMaterial { TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); + TagHelper.addTag(EndTags.FURNACES, furnace); // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); + TagHelper.addTag(EndTags.END_STONES, stone); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, stone, stairs, slab, wall); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 3d9e8a8c..0dac5b08 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -1,35 +1,36 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; -import net.minecraft.tag.Tag; -import ru.betterend.blocks.basis.BlockBark; -import ru.betterend.blocks.basis.BlockBarkStripable; -import ru.betterend.blocks.basis.BlockBarrel; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.BarkBlock; import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.blocks.basis.BlockBookshelf; -import ru.betterend.blocks.basis.BlockChest; -import ru.betterend.blocks.basis.BlockComposter; -import ru.betterend.blocks.basis.BlockCraftingTable; -import ru.betterend.blocks.basis.BlockDoor; -import ru.betterend.blocks.basis.BlockFence; -import ru.betterend.blocks.basis.BlockGate; -import ru.betterend.blocks.basis.BlockLadder; -import ru.betterend.blocks.basis.BlockLogStripable; -import ru.betterend.blocks.basis.BlockPillar; -import ru.betterend.blocks.basis.BlockPressurePlate; -import ru.betterend.blocks.basis.BlockSign; -import ru.betterend.blocks.basis.BlockSlab; -import ru.betterend.blocks.basis.BlockStairs; -import ru.betterend.blocks.basis.BlockTrapdoor; -import ru.betterend.blocks.basis.BlockWoodenButton; +import ru.betterend.blocks.basis.EndBarrelBlock; +import ru.betterend.blocks.basis.EndBlockStripableLogLog; +import ru.betterend.blocks.basis.EndBookshelfBlock; +import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.EndComposterBlock; +import ru.betterend.blocks.basis.EndCraftingTableBlock; +import ru.betterend.blocks.basis.EndDoorBlock; +import ru.betterend.blocks.basis.EndFenceBlock; +import ru.betterend.blocks.basis.EndGateBlock; +import ru.betterend.blocks.basis.EndLadderBlock; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSignBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndTrapdoorBlock; +import ru.betterend.blocks.basis.EndWoodenButtonBlock; +import ru.betterend.blocks.basis.EndWoodenPlateBlock; +import ru.betterend.blocks.basis.StrippableBarkBlock; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -62,36 +63,36 @@ public class WoodenMaterial { public final Block shelf; public final Block composter; - public final Tag.Identified logBlockTag; - public final Tag.Identified logItemTag; + public final Tag.Named logBlockTag; + public final Tag.Named logItemTag; public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BlockPillar(materialPlanks)); - bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BlockBark(materialPlanks)); + log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new EndPillarBlock(materialPlanks)); + bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BarkBlock(materialPlanks)); - log = EndBlocks.registerBlock(name + "_log", new BlockLogStripable(woodColor, log_stripped)); - bark = EndBlocks.registerBlock(name + "_bark", new BlockBarkStripable(woodColor, bark_stripped)); + log = EndBlocks.registerBlock(name + "_log", new EndBlockStripableLogLog(woodColor, log_stripped)); + bark = EndBlocks.registerBlock(name + "_bark", new StrippableBarkBlock(woodColor, bark_stripped)); planks = EndBlocks.registerBlock(name + "_planks", new BlockBase(materialPlanks)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BlockStairs(planks)); - slab = EndBlocks.registerBlock(name + "_slab", new BlockSlab(planks)); - fence = EndBlocks.registerBlock(name + "_fence", new BlockFence(planks)); - gate = EndBlocks.registerBlock(name + "_gate", new BlockGate(planks)); - button = EndBlocks.registerBlock(name + "_button", new BlockWoodenButton(planks)); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new BlockPressurePlate(planks)); - trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BlockTrapdoor(planks)); - door = EndBlocks.registerBlock(name + "_door", new BlockDoor(planks)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(planks)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(planks)); + fence = EndBlocks.registerBlock(name + "_fence", new EndFenceBlock(planks)); + gate = EndBlocks.registerBlock(name + "_gate", new EndGateBlock(planks)); + button = EndBlocks.registerBlock(name + "_button", new EndWoodenButtonBlock(planks)); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(planks)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(planks)); + door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(planks)); - craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new BlockCraftingTable(planks)); - ladder = EndBlocks.registerBlock(name + "_ladder", new BlockLadder(planks)); - sign = EndBlocks.registerBlock(name + "_sign", new BlockSign(planks)); + craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new EndCraftingTableBlock(planks)); + ladder = EndBlocks.registerBlock(name + "_ladder", new EndLadderBlock(planks)); + sign = EndBlocks.registerBlock(name + "_sign", new EndSignBlock(planks)); - chest = EndBlocks.registerBlock(name + "_chest", new BlockChest(planks)); - barrel = EndBlocks.registerBlock(name + "_barrel", new BlockBarrel(planks)); - shelf = EndBlocks.registerBlock(name + "_bookshelf", new BlockBookshelf(planks)); - composter = EndBlocks.registerBlock(name + "_composter", new BlockComposter(planks)); + chest = EndBlocks.registerBlock(name + "_chest", new EndChestBlock(planks)); + barrel = EndBlocks.registerBlock(name + "_barrel", new EndBarrelBlock(planks)); + shelf = EndBlocks.registerBlock(name + "_bookshelf", new EndBookshelfBlock(planks)); + composter = EndBlocks.registerBlock(name + "_composter", new EndComposterBlock(planks)); // Recipes // GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); @@ -108,10 +109,11 @@ public class WoodenMaterial { GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); - GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.PAPER).setGroup("end_bookshelves").build(); + GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); GridRecipe.make(name + "_bark", bark).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); GridRecipe.make(name + "_log", log).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(name + "_composter", composter).setShape("# #", "# #", "###").addMaterial('#', slab).build(); + GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); @@ -125,6 +127,7 @@ public class WoodenMaterial { TagHelper.addTags(slab, ItemTags.WOODEN_SLABS, ItemTags.SLABS); TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); + TagHelper.addTag(EndTags.ITEM_CHEST, chest); // Block Tags // TagHelper.addTag(BlockTags.PLANKS, planks); @@ -139,11 +142,37 @@ public class WoodenMaterial { TagHelper.addTags(stairs, BlockTags.WOODEN_STAIRS, BlockTags.STAIRS); TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagHelper.addTag(EndTags.BOOKSHELVES, shelf); + TagHelper.addTag(EndTags.BLOCK_CHEST, chest); logBlockTag = EndTags.makeBlockTag(name + "_logs"); logItemTag = EndTags.makeItemTag(name + "_logs"); TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); + + FlammableBlockRegistry.getDefaultInstance().add(log, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(bark, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(log_stripped, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(bark_stripped, 5, 5); + + FlammableBlockRegistry.getDefaultInstance().add(planks, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(stairs, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(slab, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(fence, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(gate, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(button, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(pressurePlate, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(trapdoor, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(door, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(craftingTable, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(ladder, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(sign, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(chest, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(barrel, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(shelf, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(composter, 5, 20); } public boolean isTreeLog(Block block) { diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index 6508ad28..79f78183 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -1,32 +1,32 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.Tickable; -import ru.betterend.blocks.BlockHydrothermalVent; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; -public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable { +public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity { public BlockEntityHydrothermalVent() { super(EndBlockEntities.HYDROTHERMAL_VENT); } @Override public void tick() { - if (world.random.nextInt(20) == 0) { - double x = pos.getX() + world.random.nextDouble(); - double y = pos.getY() + 0.9 + world.random.nextDouble() * 0.3; - double z = pos.getZ() + world.random.nextDouble(); - BlockState state = getCachedState(); - if (state.isOf(EndBlocks.HYDROTHERMAL_VENT) && state.get(BlockHydrothermalVent.ACTIVATED)) { - if (state.get(BlockHydrothermalVent.WATERLOGGED)) { - world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); + if (level.random.nextInt(20) == 0) { + double x = worldPosition.getX() + level.random.nextDouble(); + double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; + double z = worldPosition.getZ() + level.random.nextDouble(); + BlockState state = getBlockState(); + if (state.is(EndBlocks.HYDROTHERMAL_VENT) && state.getValue(HydrothermalVentBlock.ACTIVATED)) { + if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { + level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); } else { - world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); + level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } } diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java index 6963f28c..1f349112 100644 --- a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -1,89 +1,89 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BarrelBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventories; -import net.minecraft.item.ItemStack; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3i; -import ru.betterend.blocks.basis.BlockBarrel; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.registry.EndBlockEntities; -public class EBarrelBlockEntity extends LootableContainerBlockEntity { - private DefaultedList inventory; +public class EBarrelBlockEntity extends RandomizableContainerBlockEntity { + private NonNullList inventory; private int viewerCount; private EBarrelBlockEntity(BlockEntityType type) { super(type); - this.inventory = DefaultedList.ofSize(27, ItemStack.EMPTY); + this.inventory = NonNullList.withSize(27, ItemStack.EMPTY); } public EBarrelBlockEntity() { this(EndBlockEntities.BARREL); } - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - if (!this.serializeLootTable(tag)) { - Inventories.toTag(tag, this.inventory); + public CompoundTag save(CompoundTag tag) { + super.save(tag); + if (!this.trySaveLootTable(tag)) { + ContainerHelper.saveAllItems(tag, this.inventory); } return tag; } - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); - if (!this.deserializeLootTable(tag)) { - Inventories.fromTag(tag, this.inventory); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); + this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + if (!this.tryLoadLootTable(tag)) { + ContainerHelper.loadAllItems(tag, this.inventory); } } - public int size() { + public int getContainerSize() { return 27; } - protected DefaultedList getInvStackList() { + protected NonNullList getItems() { return this.inventory; } - protected void setInvStackList(DefaultedList list) { + protected void setItems(NonNullList list) { this.inventory = list; } - protected Text getContainerName() { - return new TranslatableText("container.barrel"); + protected Component getDefaultName() { + return new TranslatableComponent("container.barrel"); } - protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { - return GenericContainerScreenHandler.createGeneric9x3(syncId, playerInventory, this); + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return ChestMenu.threeRows(syncId, playerInventory, this); } - public void onOpen(PlayerEntity player) { + public void startOpen(Player player) { if (!player.isSpectator()) { if (this.viewerCount < 0) { this.viewerCount = 0; } ++this.viewerCount; - BlockState blockState = this.getCachedState(); - boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + BlockState blockState = this.getBlockState(); + boolean bl = (Boolean) blockState.getValue(BarrelBlock.OPEN); if (!bl) { - this.playSound(blockState, SoundEvents.BLOCK_BARREL_OPEN); + this.playSound(blockState, SoundEvents.BARREL_OPEN); this.setOpen(blockState, true); } @@ -92,47 +92,47 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { } private void scheduleUpdate() { - this.world.getBlockTickScheduler().schedule(this.getPos(), this.getCachedState().getBlock(), 5); + this.level.getBlockTicks().scheduleTick(this.getBlockPos(), this.getBlockState().getBlock(), 5); } public void tick() { - int i = this.pos.getX(); - int j = this.pos.getY(); - int k = this.pos.getZ(); - this.viewerCount = ChestBlockEntity.countViewers(this.world, this, i, j, k); + int i = this.worldPosition.getX(); + int j = this.worldPosition.getY(); + int k = this.worldPosition.getZ(); + this.viewerCount = ChestBlockEntity.getOpenCount(this.level, this, i, j, k); if (this.viewerCount > 0) { this.scheduleUpdate(); } else { - BlockState blockState = this.getCachedState(); - if (!(blockState.getBlock() instanceof BlockBarrel)) { - this.markRemoved(); + BlockState blockState = this.getBlockState(); + if (!(blockState.getBlock() instanceof EndBarrelBlock)) { + this.setRemoved(); return; } - boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + boolean bl = (Boolean) blockState.getValue(BarrelBlock.OPEN); if (bl) { - this.playSound(blockState, SoundEvents.BLOCK_BARREL_CLOSE); + this.playSound(blockState, SoundEvents.BARREL_CLOSE); this.setOpen(blockState, false); } } } - public void onClose(PlayerEntity player) { + public void stopOpen(Player player) { if (!player.isSpectator()) { --this.viewerCount; } } private void setOpen(BlockState state, boolean open) { - this.world.setBlockState(this.getPos(), (BlockState) state.with(BarrelBlock.OPEN, open), 3); + this.level.setBlock(this.getBlockPos(), (BlockState) state.setValue(BarrelBlock.OPEN, open), 3); } private void playSound(BlockState blockState, SoundEvent soundEvent) { - Vec3i vec3i = ((Direction) blockState.get(BarrelBlock.FACING)).getVector(); - double d = (double) this.pos.getX() + 0.5D + (double) vec3i.getX() / 2.0D; - double e = (double) this.pos.getY() + 0.5D + (double) vec3i.getY() / 2.0D; - double f = (double) this.pos.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; - this.world.playSound((PlayerEntity) null, d, e, f, soundEvent, SoundCategory.BLOCKS, 0.5F, - this.world.random.nextFloat() * 0.1F + 0.9F); + Vec3i vec3i = ((Direction) blockState.getValue(BarrelBlock.FACING)).getNormal(); + double d = (double) this.worldPosition.getX() + 0.5D + (double) vec3i.getX() / 2.0D; + double e = (double) this.worldPosition.getY() + 0.5D + (double) vec3i.getY() / 2.0D; + double f = (double) this.worldPosition.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; + this.level.playSound((Player) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, + this.level.random.nextFloat() * 0.1F + 0.9F); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java index 25c5bdc8..48e906d1 100644 --- a/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java @@ -1,6 +1,6 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; import ru.betterend.registry.EndBlockEntities; public class EChestBlockEntity extends ChestBlockEntity { diff --git a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java new file mode 100644 index 00000000..de59525e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks.entities; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.FurnaceMenu; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import ru.betterend.registry.EndBlockEntities; + +public class EFurnaceBlockEntity extends AbstractFurnaceBlockEntity { + public EFurnaceBlockEntity() { + super(EndBlockEntities.FURNACE, RecipeType.SMELTING); + } + + protected Component getDefaultName() { + return new TranslatableComponent("container.furnace"); + } + + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new FurnaceMenu(syncId, playerInventory, this, this.dataAccess); + } +} diff --git a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java index 763b2122..0c2af7cc 100644 --- a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java @@ -1,168 +1,16 @@ package ru.betterend.blocks.entities; -import java.util.function.Function; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.server.command.CommandOutput; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.LiteralText; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.text.Texts; -import net.minecraft.util.DyeColor; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.SignBlockEntity; import ru.betterend.registry.EndBlockEntities; -public class ESignBlockEntity extends BlockEntity { - private final Text[] text; - private boolean editable; - private PlayerEntity editor; - private final OrderedText[] textBeingEdited; - private DyeColor textColor; - +public class ESignBlockEntity extends SignBlockEntity { public ESignBlockEntity() { - super(EndBlockEntities.SIGN); - this.text = new Text[] { LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY }; - this.editable = true; - this.textBeingEdited = new OrderedText[4]; - this.textColor = DyeColor.BLACK; + super(); } - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - - for (int i = 0; i < 4; ++i) { - String string = Text.Serializer.toJson(this.text[i]); - tag.putString("Text" + (i + 1), string); - } - - tag.putString("Color", this.textColor.getName()); - return tag; - } - - public void fromTag(BlockState state, CompoundTag tag) { - this.editable = false; - super.fromTag(state, tag); - this.textColor = DyeColor.byName(tag.getString("Color"), DyeColor.BLACK); - - for (int i = 0; i < 4; ++i) { - String string = tag.getString("Text" + (i + 1)); - Text text = Text.Serializer.fromJson(string.isEmpty() ? "\"\"" : string); - if (this.world instanceof ServerWorld) { - try { - this.text[i] = Texts.parse(this.getCommandSource((ServerPlayerEntity) null), text, (Entity) null, - 0); - } catch (CommandSyntaxException var7) { - this.text[i] = text; - } - } else { - this.text[i] = text; - } - - this.textBeingEdited[i] = null; - } - - } - - public void setTextOnRow(int row, Text text) { - this.text[row] = text; - this.textBeingEdited[row] = null; - } - - @Environment(EnvType.CLIENT) - public OrderedText getTextBeingEditedOnRow(int row, Function function) { - if (this.textBeingEdited[row] == null && this.text[row] != null) { - this.textBeingEdited[row] = (OrderedText) function.apply(this.text[row]); - } - - return this.textBeingEdited[row]; - } - - public BlockEntityUpdateS2CPacket toUpdatePacket() { - return new BlockEntityUpdateS2CPacket(this.pos, 9, this.toInitialChunkDataTag()); - } - - public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); - } - - public boolean copyItemDataRequiresOperator() { - return true; - } - - public boolean isEditable() { - return this.editable; - } - - @Environment(EnvType.CLIENT) - public void setEditable(boolean bl) { - this.editable = bl; - if (!bl) { - this.editor = null; - } - - } - - public void setEditor(PlayerEntity player) { - this.editor = player; - } - - public PlayerEntity getEditor() { - return this.editor; - } - - public boolean onActivate(PlayerEntity player) { - Text[] var2 = this.text; - int var3 = var2.length; - - for (int var4 = 0; var4 < var3; ++var4) { - Text text = var2[var4]; - Style style = text == null ? null : text.getStyle(); - if (style != null && style.getClickEvent() != null) { - ClickEvent clickEvent = style.getClickEvent(); - if (clickEvent.getAction() == ClickEvent.Action.RUN_COMMAND) { - player.getServer().getCommandManager().execute(this.getCommandSource((ServerPlayerEntity) player), - clickEvent.getValue()); - } - } - } - - return true; - } - - public ServerCommandSource getCommandSource(ServerPlayerEntity player) { - String string = player == null ? "Sign" : player.getName().getString(); - Text text = player == null ? new LiteralText("Sign") : player.getDisplayName(); - return new ServerCommandSource(CommandOutput.DUMMY, Vec3d.ofCenter(this.pos), Vec2f.ZERO, - (ServerWorld) this.world, 2, string, (Text) text, this.world.getServer(), player); - } - - public DyeColor getTextColor() { - return this.textColor; - } - - public boolean setTextColor(DyeColor value) { - if (value != this.getTextColor()) { - this.textColor = value; - this.markDirty(); - this.world.updateListeners(this.getPos(), this.getCachedState(), this.getCachedState(), 3); - return true; - } else { - return false; - } + @Override + public BlockEntityType getType() { + return EndBlockEntities.SIGN; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index e953933f..49516b35 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -9,54 +9,53 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.LockableContainerBlockEntity; -import net.minecraft.entity.ExperienceOrbEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventories; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.RecipeUnlocker; -import net.minecraft.screen.PropertyDelegate; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.tag.Tag; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; -import net.minecraft.util.Tickable; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.ExperienceOrb; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.StackedContents; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.RecipeHolder; +import net.minecraft.world.inventory.StackedContentsCompatible; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { +public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; - private static final int[] SIDE_SLOTS = new int[] { 3 }; - private static final Map availableFuels = Maps.newHashMap(); + private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; + private static final Map AVAILABLE_FUELS = Maps.newHashMap(); - private final Object2IntOpenHashMap recipesUsed; - protected DefaultedList inventory; - protected final PropertyDelegate propertyDelegate; + private final Object2IntOpenHashMap recipesUsed; + protected NonNullList inventory; + protected final ContainerData propertyDelegate; private Recipe lastRecipe; private int smeltTimeTotal; private int smeltTime; @@ -65,9 +64,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public EndStoneSmelterBlockEntity() { super(EndBlockEntities.END_STONE_SMELTER); - this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); - this.recipesUsed = new Object2IntOpenHashMap(); - this.propertyDelegate = new PropertyDelegate() { + this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); + this.recipesUsed = new Object2IntOpenHashMap<>(); + this.propertyDelegate = new ContainerData() { public int get(int index) { switch(index) { case 0: @@ -99,32 +98,24 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } } - public int size() { + public int getCount() { return 4; } }; - - this.registerFuels(); - } - - private void registerFuels() { - registerFuel(Items.LAVA_BUCKET, 16000); - registerFuel(Blocks.COAL_BLOCK, 12000); - registerFuel(Items.BLAZE_ROD, 2000); } private boolean isBurning() { - return this.burnTime > 0; + return burnTime > 0; } @Override - public int size() { - return this.inventory.size(); + public int getContainerSize() { + return inventory.size(); } @Override public boolean isEmpty() { - Iterator iterator = this.inventory.iterator(); + Iterator iterator = inventory.iterator(); ItemStack itemStack; do { if (!iterator.hasNext()) { @@ -137,164 +128,165 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } @Override - public ItemStack getStack(int slot) { - return this.inventory.get(slot); + public ItemStack getItem(int slot) { + return inventory.get(slot); } @Override - public ItemStack removeStack(int slot, int amount) { - return Inventories.splitStack(this.inventory, slot, amount); + public ItemStack removeItem(int slot, int amount) { + return ContainerHelper.removeItem(inventory, slot, amount); } @Override - public ItemStack removeStack(int slot) { - return Inventories.removeStack(this.inventory, slot); + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(inventory, slot); } @Override - public void setStack(int slot, ItemStack stack) { - ItemStack itemStack = this.inventory.get(slot); - boolean stackValid = !stack.isEmpty() && stack.isItemEqualIgnoreDamage(itemStack) && ItemStack.areTagsEqual(stack, itemStack); - this.inventory.set(slot, stack); - if (stack.getCount() > getMaxCountPerStack()) { - stack.setCount(getMaxCountPerStack()); + public void setItem(int slot, ItemStack stack) { + ItemStack itemStack = inventory.get(slot); + boolean stackValid = !stack.isEmpty() && stack.sameItem(itemStack) && ItemStack.tagMatches(stack, itemStack); + inventory.set(slot, stack); + if (stack.getCount() > getMaxStackSize()) { + stack.setCount(getMaxStackSize()); } if ((slot == 0 || slot == 1) && !stackValid) { - this.smeltTimeTotal = this.getSmeltTime(); - this.smeltTime = 0; - this.markDirty(); + smeltTimeTotal = getSmeltTime(); + smeltTime = 0; + setChanged(); } } protected int getSmeltTime() { - int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) + if (level == null) return 200; + int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { - smeltTime = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world) - .map(BlastingRecipe::getCookTime).orElse(200); + smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) + .map(BlastingRecipe::getCookingTime).orElse(200); smeltTime /= 1.5; } return smeltTime; } - public void dropExperience(PlayerEntity player) { + public void dropExperience(Player player) { + if (level == null) return; List> list = Lists.newArrayList(); - ObjectIterator> usedRecipes = this.recipesUsed.object2IntEntrySet().iterator(); - while(usedRecipes.hasNext()) { - Entry entry = usedRecipes.next(); - world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { + for (Entry entry : recipesUsed.object2IntEntrySet()) { + level.getRecipeManager().byKey(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { AlloyingRecipe alloying = (AlloyingRecipe) recipe; - this.dropExperience(player.world, player.getPos(), entry.getIntValue(), alloying.getExperience()); + dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); } else { BlastingRecipe blasting = (BlastingRecipe) recipe; - this.dropExperience(player.world, player.getPos(), entry.getIntValue(), blasting.getExperience()); + dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); } }); } - player.unlockRecipes(list); - this.recipesUsed.clear(); + player.awardRecipes(list); + recipesUsed.clear(); } - private void dropExperience(World world, Vec3d vec3d, int i, float f) { - int j = MathHelper.floor(i * f); - float g = MathHelper.fractionalPart(i * f); + private void dropExperience(Level world, Vec3 vec3d, int count, float amount) { + int expTotal = Mth.floor(count * amount); + float g = Mth.frac(count * amount); if (g != 0.0F && Math.random() < g) { - j++; + expTotal++; } - while(j > 0) { - int k = ExperienceOrbEntity.roundToOrbSize(j); - j -= k; - world.spawnEntity(new ExperienceOrbEntity(world, vec3d.x, vec3d.y, vec3d.z, k)); + while(expTotal > 0) { + int expVal = ExperienceOrb.getExperienceValue(expTotal); + expTotal -= expVal; + world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, expVal)); } } @Override - public boolean canPlayerUse(PlayerEntity player) { - if (this.world.getBlockEntity(this.pos) != this) { + public boolean stillValid(Player player) { + if (level != null && level.getBlockEntity(worldPosition) != this) { return false; - } else { - return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D; } + return player.distanceToSqr(worldPosition.getX() + 0.5D, worldPosition.getY() + 0.5D, worldPosition.getZ() + 0.5D) <= 64.0D; } @Override - public void clear() { - this.inventory.clear(); + public void clearContent() { + inventory.clear(); } @Override - protected Text getContainerName() { - return new TranslatableText(String.format("block.%s.%s", BetterEnd.MOD_ID, EndStoneSmelter.ID)); + protected Component getDefaultName() { + return new TranslatableComponent(String.format("block.%s.%s", BetterEnd.MOD_ID, EndStoneSmelter.ID)); } @Override - protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate); } @Override public void tick() { - boolean initialBurning = this.isBurning(); + if (level == null) return; + + boolean initialBurning = isBurning(); if (initialBurning) { - this.burnTime--; + burnTime--; } - boolean burning = this.isBurning(); - if (!this.world.isClient) { - ItemStack fuel = this.inventory.get(2); + boolean burning = initialBurning; + if (!level.isClientSide) { + ItemStack fuel = inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (!burning && smeltTime > 0) { - this.smeltTime = MathHelper.clamp(smeltTime - 2, 0, smeltTimeTotal); + if (smeltTime > 0) { + smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { - Recipe recipe = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world).orElse(null); + Recipe recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); if (recipe == null) { - recipe = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world).orElse(null); + recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); } boolean accepted = this.canAcceptRecipeOutput(recipe); if (!burning && accepted) { - this.burnTime = this.getFuelTime(fuel); - this.fuelTime = this.burnTime; - burning = this.isBurning(); + burnTime = getFuelTime(fuel); + fuelTime = burnTime; + burning = isBurning(); if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); - fuel.decrement(1); + fuel.shrink(1); if (fuel.isEmpty()) { - Item remainFuel = item.getRecipeRemainder(); - this.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + Item remainFuel = item.getCraftingRemainingItem(); + inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); } } - this.markDirty(); + setChanged(); } } if (burning && accepted) { this.smeltTime++; if (smeltTime == smeltTimeTotal) { - this.smeltTime = 0; - this.smeltTimeTotal = this.getSmeltTime(); - this.craftRecipe(recipe); - this.markDirty(); + smeltTime = 0; + smeltTimeTotal = getSmeltTime(); + craftRecipe(recipe); + setChanged(); } } else { - this.smeltTime = 0; + smeltTime = 0; } } if (initialBurning != burning) { - this.world.setBlockState(pos, world.getBlockState(pos).with(EndStoneSmelter.LIT, burning), 3); - this.markDirty(); + level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); + setChanged(); } } } protected boolean canAcceptRecipeOutput(Recipe recipe) { if (recipe == null) return false; - boolean validInput = false; + boolean validInput; if (recipe instanceof AlloyingRecipe) { validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); @@ -303,98 +295,93 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp !inventory.get(1).isEmpty(); } if (validInput) { - ItemStack result = recipe.getOutput(); + ItemStack result = recipe.getResultItem(); if (result.isEmpty()) { return false; - } else { - ItemStack output = this.inventory.get(3); - int outCount = output.getCount(); - int total = outCount + result.getCount(); - if (output.isEmpty()) { - return true; - } else if (!output.isItemEqualIgnoreDamage(result)) { - return false; - } else if (outCount < this.getMaxCountPerStack() && outCount < output.getMaxCount()) { - return this.getMaxCountPerStack() >= total; - } else { - return output.getCount() < result.getMaxCount(); - } } + ItemStack output = this.inventory.get(3); + int outCount = output.getCount(); + int total = outCount + result.getCount(); + if (output.isEmpty()) { + return true; + } + if (!output.sameItem(result)) { + return false; + } + if (outCount < getMaxStackSize() && outCount < output.getMaxStackSize()) { + return getMaxStackSize() >= total; + } + return output.getCount() < result.getMaxStackSize(); } - return false; } private void craftRecipe(Recipe recipe) { if (recipe == null || !canAcceptRecipeOutput(recipe)) return; - ItemStack result = recipe.getOutput(); - ItemStack output = this.inventory.get(3); + ItemStack result = recipe.getResultItem(); + ItemStack output = inventory.get(3); if (output.isEmpty()) { - this.inventory.set(3, result.copy()); + inventory.set(3, result.copy()); } else if (output.getItem() == result.getItem()) { - output.increment(result.getCount()); + output.grow(result.getCount()); } - if (!this.world.isClient) { - this.setLastRecipe(recipe); + assert this.level != null; + if (!this.level.isClientSide) { + setRecipeUsed(recipe); } if (recipe instanceof AlloyingRecipe) { - this.inventory.get(0).decrement(1); - this.inventory.get(1).decrement(1); + inventory.get(0).shrink(1); + inventory.get(1).shrink(1); } else { - if (!this.inventory.get(0).isEmpty()) { - this.inventory.get(0).decrement(1); + if (!inventory.get(0).isEmpty()) { + inventory.get(0).shrink(1); } else { - this.inventory.get(1).decrement(1); + inventory.get(1).shrink(1); } } } @Override - public void provideRecipeInputs(RecipeFinder finder) { - Iterator inventory = this.inventory.iterator(); - while(inventory.hasNext()) { - ItemStack itemStack = inventory.next(); - finder.addItem(itemStack); + public void fillStackedContents(StackedContents finder) { + for (ItemStack itemStack : this.inventory) { + finder.accountStack(itemStack); } } @Override - public void setLastRecipe(Recipe recipe) { + public void setRecipeUsed(Recipe recipe) { if (recipe != null) { - Identifier recipeId = recipe.getId(); - this.recipesUsed.addTo(recipeId, 1); - this.lastRecipe = recipe; + ResourceLocation recipeId = recipe.getId(); + recipesUsed.addTo(recipeId, 1); + lastRecipe = recipe; } } @Override - public Recipe getLastRecipe() { + public Recipe getRecipeUsed() { return this.lastRecipe; } @Override - public int[] getAvailableSlots(Direction side) { + public int[] getSlotsForFace(Direction side) { if (side == Direction.DOWN) { return BOTTOM_SLOTS; - } else { - return side == Direction.UP ? TOP_SLOTS : SIDE_SLOTS; } + return side == Direction.UP ? TOP_SLOTS : SIDE_SLOTS; } @Override - public boolean canInsert(int slot, ItemStack stack, Direction dir) { - return this.isValid(slot, stack); + public boolean canPlaceItemThroughFace(int slot, ItemStack stack, Direction dir) { + return this.canPlaceItem(slot, stack); } @Override - public boolean canExtract(int slot, ItemStack stack, Direction dir) { + public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { if (dir == Direction.DOWN && slot == 2) { - if (stack.getItem() != Items.BUCKET) { - return false; - } + return stack.getItem() == Items.BUCKET; } return true; } @@ -402,75 +389,73 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp protected int getFuelTime(ItemStack fuel) { if (fuel.isEmpty()) { return 0; - } else { - Item item = fuel.getItem(); - return availableFuels.getOrDefault(item, 0); } + Item item = fuel.getItem(); + return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - this.inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY); - Inventories.fromTag(tag, inventory); - this.burnTime = tag.getShort("BurnTime"); - this.fuelTime = tag.getShort("FuelTime"); - this.smeltTime = tag.getShort("SmeltTime"); - this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); + inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, inventory); + burnTime = tag.getShort("BurnTime"); + fuelTime = tag.getShort("FuelTime"); + smeltTime = tag.getShort("SmeltTime"); + smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); - Iterator recipes = compoundTag.getKeys().iterator(); - while(recipes.hasNext()) { - String id = recipes.next(); - this.recipesUsed.put(new Identifier(id), compoundTag.getInt(id)); + for (String id : compoundTag.getAllKeys()) { + recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); } } @Override - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); + public CompoundTag save(CompoundTag tag) { + super.save(tag); tag.putShort("BurnTime", (short) burnTime); tag.putShort("FuelTime", (short) fuelTime); tag.putShort("SmeltTime", (short) smeltTime); tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); - Inventories.toTag(tag, inventory); + ContainerHelper.saveAllItems(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); - this.recipesUsed.forEach((identifier, integer) -> { - usedRecipes.putInt(identifier.toString(), integer); - }); + recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); return tag; } - public boolean isValid(int slot, ItemStack stack) { + public boolean canPlaceItem(int slot, ItemStack stack) { if (slot == 3) { return false; - } else if (slot != 0 || slot != 1) { + } else if (slot != 2) { return true; - } else { - ItemStack itemStack = this.inventory.get(2); - return canUseAsFuel(stack) || stack.getItem() == Items.BUCKET && itemStack.getItem() != Items.BUCKET; } + ItemStack itemStack = this.inventory.get(2); + return canUseAsFuel(stack) || stack.getItem() == Items.BUCKET && itemStack.getItem() != Items.BUCKET; } public static boolean canUseAsFuel(ItemStack stack) { - return availableFuels.containsKey(stack.getItem()); + return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } - - public static void registerFuel(ItemConvertible fuel, int time) { - if (availableFuels.containsKey(fuel)) { - availableFuels.replace(fuel.asItem(), time); - } else { - availableFuels.put(fuel.asItem(), time); - } - } - - public static void registerFuel(Tag tag, int time) { - Iterator tagItems = tag.values().iterator(); - tagItems.forEachRemaining(item -> registerFuel(item, time)); + + public static void registerFuel(ItemLike fuel, int time) { + AVAILABLE_FUELS.put(fuel.asItem(), time); } public static Map availableFuels() { - return availableFuels; + return AVAILABLE_FUELS; + } + + private static int getFabricFuel(ItemStack stack) { + Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); + return ticks == null ? 0 : ticks; + } + + static { + AbstractFurnaceBlockEntity.getFuel().forEach((item, time) -> { + if (time >= 2000) { + registerFuel(item, time); + } + }); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index a17ca46e..d4da8a18 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -1,9 +1,8 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; @@ -15,7 +14,7 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } public boolean hasRitual() { - return this.linkedRitual != null; + return linkedRitual != null; } public void linkRitual(EternalRitual ritual) { @@ -23,31 +22,31 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } public EternalRitual getRitual() { - return this.linkedRitual; + return linkedRitual; } @Override - public void setLocation(World world, BlockPos pos) { - super.setLocation(world, pos); + public void setLevelAndPosition(Level world, BlockPos pos) { + super.setLevelAndPosition(world, pos); if (hasRitual()) { - this.linkedRitual.setWorld(world); - } - } - - @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - if (tag.contains("ritual")) { - this.linkedRitual = new EternalRitual(world); - this.linkedRitual.fromTag(tag.getCompound("ritual")); + linkedRitual.setWorld(world); } } @Override - public CompoundTag toTag(CompoundTag tag) { - if (this.hasRitual()) { + public CompoundTag save(CompoundTag tag) { + if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.toTag(tag); + return super.save(tag); + } + + @Override + protected void fromTag(CompoundTag tag) { + super.fromTag(tag); + if (tag.contains("ritual")) { + linkedRitual = new EternalRitual(level); + linkedRitual.fromTag(tag.getCompound("ritual")); + } } } diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index ee85a5bc..51e1aac7 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -1,9 +1,8 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; @@ -16,53 +15,47 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } @Override - public void setLocation(World world, BlockPos pos) { - super.setLocation(world, pos); + public void setLevelAndPosition(Level world, BlockPos pos) { + super.setLevelAndPosition(world, pos); if (hasRitual()) { - this.linkedRitual.setLocation(world, pos); + linkedRitual.setLocation(world, pos); } } public void linkRitual(InfusionRitual ritual) { - this.linkedRitual = ritual; + linkedRitual = ritual; } public InfusionRitual getRitual() { - return this.linkedRitual; + return linkedRitual; } public boolean hasRitual() { - return this.linkedRitual != null; + return linkedRitual != null; } @Override public void tick() { if (hasRitual()) { - this.linkedRitual.tick(); + linkedRitual.tick(); } super.tick(); } - - @Override - public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); - } - - @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - if (tag.contains("ritual")) { - this.linkedRitual = new InfusionRitual(world, pos); - this.linkedRitual.fromTag(tag.getCompound("ritual")); - } - } @Override - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); + public CompoundTag save(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return tag; + return super.save(tag); + } + + @Override + protected void fromTag(CompoundTag tag) { + super.fromTag(tag); + if (tag.contains("ritual")) { + linkedRitual = new InfusionRitual(level, worldPosition); + linkedRitual.fromTag(tag.getCompound("ritual")); + } } } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index ead5d5b3..f9e475be 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,20 +1,19 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.util.Tickable; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPedestal; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Inventory, Tickable { +public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; private final int maxAge = 314; @@ -29,118 +28,115 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } public int getAge() { - return this.age; + return age; } public int getMaxAge() { - return this.maxAge; + return maxAge; } @Override - public void clear() { - this.activeItem = ItemStack.EMPTY; - this.markDirty(); - } - - @Override - public int size() { + public int getContainerSize() { return 1; } @Override public boolean isEmpty() { - return this.activeItem.isEmpty(); + return activeItem.isEmpty(); } @Override - public ItemStack getStack(int slot) { - return this.activeItem; + public ItemStack getItem(int slot) { + return activeItem; } @Override - public ItemStack removeStack(int slot, int amount) { - return this.removeStack(slot); + public ItemStack removeItem(int slot, int amount) { + return removeItemNoUpdate(slot); } @Override - public boolean isValid(int slot, ItemStack stack) { - return this.isEmpty(); + public boolean canPlaceItem(int slot, ItemStack stack) { + return isEmpty(); } @Override - public ItemStack removeStack(int slot) { - ItemStack stored = this.activeItem; - this.activeItem = ItemStack.EMPTY; - this.markDirty(); + public void clearContent() { + activeItem = ItemStack.EMPTY; + setChanged(); + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + ItemStack stored = activeItem; + clearContent(); return stored; } - - public void removeStack(World world, BlockState state) { - world.setBlockState(pos, state.with(BlockPedestal.HAS_ITEM, false) - .with(BlockPedestal.HAS_LIGHT, false)); - this.removeStack(0); - } @Override - public void setStack(int slot, ItemStack stack) { - this.activeItem = stack; - this.markDirty(); + public void setItem(int slot, ItemStack stack) { + activeItem = stack; + setChanged(); } @Override - public void markDirty() { - if (world != null && !world.isClient) { - BlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof BlockPedestal) { - state = state.with(BlockPedestal.HAS_ITEM, !isEmpty()); + public void setChanged() { + if (level != null && !level.isClientSide) { + BlockState state = level.getBlockState(worldPosition); + if (state.getBlock() instanceof PedestalBlock) { + BlockState trueState = state.setValue(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { - state = state.with(BlockPedestal.HAS_LIGHT, true); + trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, true); } else { - state = state.with(BlockPedestal.HAS_LIGHT, false); + trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, false); } - world.setBlockState(pos, state); + level.setBlockAndUpdate(worldPosition, trueState); } } - super.markDirty(); + super.setChanged(); } + @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean stillValid(Player player) { return true; } @Override - public BlockEntityUpdateS2CPacket toUpdatePacket() { - return new BlockEntityUpdateS2CPacket(pos, 32, this.toInitialChunkDataTag()); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); + fromTag(tag); } @Override - public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); + public CompoundTag save(CompoundTag tag) { + tag.put("active_item", activeItem.save(new CompoundTag())); + return super.save(tag); } - + @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); + public void fromClientTag(CompoundTag tag) { + fromTag(tag); + } + + @Override + public CompoundTag toClientTag(CompoundTag tag) { + return save(tag); + } + + protected void fromTag(CompoundTag tag) { if (tag.contains("active_item")) { CompoundTag itemTag = tag.getCompound("active_item"); - this.activeItem = ItemStack.fromTag(itemTag); + activeItem = ItemStack.of(itemTag); } } - @Override - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - tag.put("active_item", activeItem.toTag(new CompoundTag())); - return tag; - } - @Override public void tick() { if (!isEmpty()) { - this.age++; + age++; if (age > maxAge) { - this.age = 0; + age = 0; } } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index 3b230002..b06c2316 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -3,41 +3,41 @@ package ru.betterend.blocks.entities.render; import java.util.HashMap; import com.google.common.collect.Maps; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; import it.unimi.dsi.fastutil.floats.Float2FloatFunction; import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import net.minecraft.block.AbstractChestBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.DoubleBlockProperties; -import net.minecraft.block.DoubleBlockProperties.PropertySource; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.enums.ChestType; -import net.minecraft.client.block.ChestAnimationProgress; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BrightnessCombiner; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractChestBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.DoubleBlockCombiner; +import net.minecraft.world.level.block.DoubleBlockCombiner.NeighborCombineResult; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ChestType; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockChest; +import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.entities.EChestBlockEntity; import ru.betterend.registry.EndItems; public class EndChestBlockEntityRenderer extends BlockEntityRenderer { - private static final HashMap LAYERS = Maps.newHashMap(); - private static RenderLayer[] defaultLayer; + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderType[] defaultLayer; private static final int ID_NORMAL = 0; private static final int ID_LEFT = 1; @@ -57,62 +57,62 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer abstractChestBlock = (AbstractChestBlock) block; boolean isDouble = chestType != ChestType.SINGLE; - float f = ((Direction) blockState.get(ChestBlock.FACING)).asRotation(); - PropertySource propertySource; + float f = ((Direction) blockState.getValue(ChestBlock.FACING)).toYRot(); + NeighborCombineResult propertySource; - matrices.push(); + matrices.pushPose(); matrices.translate(0.5D, 0.5D, 0.5D); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-f)); + matrices.mulPose(Vector3f.YP.rotationDegrees(-f)); matrices.translate(-0.5D, -0.5D, -0.5D); if (worldExists) { - propertySource = abstractChestBlock.getBlockEntitySource(blockState, world, entity.getPos(), true); + propertySource = abstractChestBlock.combine(blockState, world, entity.getBlockPos(), true); } else { - propertySource = DoubleBlockProperties.PropertyRetriever::getFallback; + propertySource = DoubleBlockCombiner.Combiner::acceptNone; } - float pitch = ((Float2FloatFunction) propertySource.apply(ChestBlock.getAnimationProgressRetriever((ChestAnimationProgress) entity))).get(tickDelta); + float pitch = ((Float2FloatFunction) propertySource.apply(ChestBlock.opennessCombiner((LidBlockEntity) entity))).get(tickDelta); pitch = 1.0F - pitch; pitch = 1.0F - pitch * pitch * pitch; @SuppressWarnings({ "unchecked", "rawtypes" }) - int blockLight = ((Int2IntFunction) propertySource.apply(new LightmapCoordinatesRetriever())).applyAsInt(light); + int blockLight = ((Int2IntFunction) propertySource.apply(new BrightnessCombiner())).applyAsInt(light); VertexConsumer vertexConsumer = getConsumer(vertexConsumers, block, chestType); @@ -126,19 +126,19 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockChest) { - String name = Registry.BLOCK.getId(block).getPath(); - LAYERS.put(block, new RenderLayer[] { - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) + if (block instanceof EndChestBlock) { + String name = Registry.BLOCK.getKey(block).getPath(); + LAYERS.put(block, new RenderType[] { + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) }); } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 00b96787..53b3a0fa 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -4,114 +4,114 @@ import java.util.HashMap; import java.util.List; import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; -import net.minecraft.block.AbstractSignBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SignBlock; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.TexturedRenderLayers; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; -import net.minecraft.text.OrderedText; -import net.minecraft.util.Identifier; -import net.minecraft.util.SignType; -import net.minecraft.util.registry.Registry; +import net.minecraft.client.gui.Font; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.SignRenderer; +import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SignBlock; +import net.minecraft.world.level.block.StandingSignBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WoodType; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.registry.EndItems; public class EndSignBlockEntityRenderer extends BlockEntityRenderer { - private static final HashMap LAYERS = Maps.newHashMap(); - private static RenderLayer defaultLayer; - private final SignModel model = new SignBlockEntityRenderer.SignModel(); + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderType defaultLayer; + private final SignModel model = new SignRenderer.SignModel(); public EndSignBlockEntityRenderer(BlockEntityRenderDispatcher dispatcher) { super(dispatcher); } - public void render(ESignBlockEntity signBlockEntity, float tickDelta, MatrixStack matrixStack, - VertexConsumerProvider provider, int light, int overlay) { - BlockState state = signBlockEntity.getCachedState(); - matrixStack.push(); + public void render(ESignBlockEntity signBlockEntity, float tickDelta, PoseStack matrixStack, + MultiBufferSource provider, int light, int overlay) { + BlockState state = signBlockEntity.getBlockState(); + matrixStack.pushPose(); matrixStack.translate(0.5D, 0.5D, 0.5D); - float angle = -((float) ((Integer) state.get(SignBlock.ROTATION) * 360) / 16.0F); + float angle = -((float) ((Integer) state.getValue(StandingSignBlock.ROTATION) * 360) / 16.0F); - BlockState blockState = signBlockEntity.getCachedState(); - if (blockState.get(BlockSign.FLOOR)) { - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle)); - this.model.foot.visible = true; + BlockState blockState = signBlockEntity.getBlockState(); + if (blockState.getValue(EndSignBlock.FLOOR)) { + matrixStack.mulPose(Vector3f.YP.rotationDegrees(angle)); + this.model.stick.visible = true; } else { - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle + 180)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(angle + 180)); matrixStack.translate(0.0D, -0.3125D, -0.4375D); - this.model.foot.visible = false; + this.model.stick.visible = false; } - matrixStack.push(); + matrixStack.pushPose(); matrixStack.scale(0.6666667F, -0.6666667F, -0.6666667F); VertexConsumer vertexConsumer = getConsumer(provider, state.getBlock()); - model.field.render(matrixStack, vertexConsumer, light, overlay); - model.foot.render(matrixStack, vertexConsumer, light, overlay); - matrixStack.pop(); - TextRenderer textRenderer = dispatcher.getTextRenderer(); + model.sign.render(matrixStack, vertexConsumer, light, overlay); + model.stick.render(matrixStack, vertexConsumer, light, overlay); + matrixStack.popPose(); + Font textRenderer = renderer.getFont(); matrixStack.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); matrixStack.scale(0.010416667F, -0.010416667F, 0.010416667F); - int m = signBlockEntity.getTextColor().getSignColor(); - int n = (int) (NativeImage.getRed(m) * 0.4D); - int o = (int) (NativeImage.getGreen(m) * 0.4D); - int p = (int) (NativeImage.getBlue(m) * 0.4D); - int q = NativeImage.getAbgrColor(0, p, o, n); + int m = signBlockEntity.getColor().getTextColor(); + int n = (int) (NativeImage.getR(m) * 0.4D); + int o = (int) (NativeImage.getG(m) * 0.4D); + int p = (int) (NativeImage.getB(m) * 0.4D); + int q = NativeImage.combine(0, p, o, n); for (int s = 0; s < 4; ++s) { - OrderedText orderedText = signBlockEntity.getTextBeingEditedOnRow(s, (text) -> { - List list = textRenderer.wrapLines(text, 90); - return list.isEmpty() ? OrderedText.EMPTY : (OrderedText) list.get(0); + FormattedCharSequence orderedText = signBlockEntity.getRenderMessage(s, (text) -> { + List list = textRenderer.split(text, 90); + return list.isEmpty() ? FormattedCharSequence.EMPTY : (FormattedCharSequence) list.get(0); }); if (orderedText != null) { - float t = (float) (-textRenderer.getWidth(orderedText) / 2); - textRenderer.draw((OrderedText) orderedText, t, (float) (s * 10 - 20), q, false, matrixStack.peek().getModel(), provider, false, 0, light); + float t = (float) (-textRenderer.width(orderedText) / 2); + textRenderer.drawInBatch((FormattedCharSequence) orderedText, t, (float) (s * 10 - 20), q, false, matrixStack.last().pose(), provider, false, 0, light); } } - matrixStack.pop(); + matrixStack.popPose(); } - public static SpriteIdentifier getModelTexture(Block block) { - SignType signType2; - if (block instanceof AbstractSignBlock) { - signType2 = ((AbstractSignBlock) block).getSignType(); + public static Material getModelTexture(Block block) { + WoodType signType2; + if (block instanceof SignBlock) { + signType2 = ((SignBlock) block).type(); } else { - signType2 = SignType.OAK; + signType2 = WoodType.OAK; } - return TexturedRenderLayers.getSignTextureId(signType2); + return Sheets.signTexture(signType2); } - public static VertexConsumer getConsumer(VertexConsumerProvider provider, Block block) { + public static VertexConsumer getConsumer(MultiBufferSource provider, Block block) { return provider.getBuffer(LAYERS.getOrDefault(block, defaultLayer)); } static { - defaultLayer = RenderLayer.getEntitySolid(new Identifier("textures/entity/sign/oak.png")); + defaultLayer = RenderType.entitySolid(new ResourceLocation("textures/entity/sign/oak.png")); EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockSign) { - String name = Registry.BLOCK.getId(block).getPath(); - RenderLayer layer = RenderLayer.getEntitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); + if (block instanceof EndSignBlock) { + String name = Registry.BLOCK.getKey(block).getPath(); + RenderType layer = RenderType.entitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); LAYERS.put(block, layer); } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index e65761ca..1bb01cec 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -1,22 +1,24 @@ package ru.betterend.blocks.entities.render; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.util.Mth; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.EternalPedestal; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.render.BeamRenderer; import ru.betterend.client.render.EndCrystalRenderer; @@ -32,21 +34,23 @@ public class PedestalItemRenderer extends BlockEn } @Override - public void render(T blockEntity, float tickDelta, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, int overlay) { + public void render(T blockEntity, float tickDelta, PoseStack matrices, + MultiBufferSource vertexConsumers, int light, int overlay) { + + Level world = blockEntity.getLevel(); + if (world == null || blockEntity.isEmpty()) return; + + BlockState state = world.getBlockState(blockEntity.getBlockPos()); + if (!(state.getBlock() instanceof PedestalBlock)) return; - if (blockEntity.isEmpty()) return; - - BlockState state = blockEntity.getWorld().getBlockState(blockEntity.getPos()); - if (!(state.getBlock() instanceof BlockPedestal)) return; - - ItemStack activeItem = blockEntity.getStack(0); - matrices.push(); - MinecraftClient minecraft = MinecraftClient.getInstance(); - BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, blockEntity.getWorld(), null); - Vector3f translate = model.getTransformation().ground.translation; - BlockPedestal pedestal = (BlockPedestal) state.getBlock(); - matrices.translate(translate.getX(), translate.getY(), translate.getZ()); + ItemStack activeItem = blockEntity.getItem(0); + + matrices.pushPose(); + Minecraft minecraft = Minecraft.getInstance(); + BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null); + Vector3f translate = model.getTransforms().ground.translation; + PedestalBlock pedestal = (PedestalBlock) state.getBlock(); + matrices.translate(translate.x(), translate.y(), translate.z()); matrices.translate(0.5, pedestal.getHeight(state), 0.5); if (activeItem.getItem() instanceof BlockItem) { matrices.scale(1.5F, 1.5F, 1.5F); @@ -54,12 +58,12 @@ public class PedestalItemRenderer extends BlockEn matrices.scale(1.25F, 1.25F, 1.25F); } int age = blockEntity.getAge(); - if (state.isOf(EndBlocks.ETERNAL_PEDESTAL) && state.get(EternalPedestal.ACTIVATED)) { + if (state.is(EndBlocks.ETERNAL_PEDESTAL) && state.getValue(EternalPedestal.ACTIVATED)) { float[] colors = EternalCrystalRenderer.colors(age); - int y = blockEntity.getPos().getY(); + int y = blockEntity.getBlockPos().getY(); BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, 0.16F); - float altitude = MathHelper.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; + float altitude = Mth.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; matrices.translate(0.0D, altitude, 0.0D); } if (activeItem.getItem() == Items.END_CRYSTAL) { @@ -68,9 +72,9 @@ public class PedestalItemRenderer extends BlockEn EternalCrystalRenderer.render(age, tickDelta, matrices, vertexConsumers, light); } else { float rotation = (age + tickDelta) / 25.0F + 6.0F; - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); - minecraft.getItemRenderer().renderItem(activeItem, ModelTransformation.Mode.GROUND, false, matrices, vertexConsumers, light, overlay, model); + matrices.mulPose(Vector3f.YP.rotation(rotation)); + minecraft.getItemRenderer().render(activeItem, ItemTransforms.TransformType.GROUND, false, matrices, vertexConsumers, light, overlay, model); } - matrices.pop(); + matrices.popPose(); } } diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index a7956ef6..b9ba6104 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -2,8 +2,8 @@ package ru.betterend.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.util.registry.Registry; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -23,6 +23,7 @@ public class BetterEndClient implements ClientModInitializer { EndParticles.register(); EndEntitiesRenders.register(); EndModelProviders.register(); + ClientOptions.init(); if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); @@ -30,8 +31,8 @@ public class BetterEndClient implements ClientModInitializer { } private void registerRenderLayers() { - RenderLayer cutout = RenderLayer.getCutout(); - RenderLayer translucent = RenderLayer.getTranslucent(); + RenderType cutout = RenderType.cutout(); + RenderType translucent = RenderType.translucent(); Registry.BLOCK.forEach(block -> { if (block instanceof IRenderTypeable) { ERenderLayer layer = ((IRenderTypeable) block).getRenderLayer(); diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java new file mode 100644 index 00000000..d80f950c --- /dev/null +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -0,0 +1,50 @@ +package ru.betterend.client; + +import ru.betterend.config.Configs; + +public class ClientOptions { + private static boolean customSky; + private static boolean useFogDensity; + private static boolean blendBiomeMusic; + private static boolean sulfurWaterColor; + + public static void init() { + customSky = Configs.CLENT_CONFIG.getBooleanRoot("customSky", true); + useFogDensity = Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true); + blendBiomeMusic = Configs.CLENT_CONFIG.getBooleanRoot("blendBiomeMusic", true); + sulfurWaterColor = Configs.CLENT_CONFIG.getBooleanRoot("sulfurWaterColor", true); + Configs.CLENT_CONFIG.saveChanges(); + } + + public static boolean isCustomSky() { + return customSky; + } + + public static void setCustomSky(boolean customSky) { + ClientOptions.customSky = customSky; + } + + public static boolean useFogDensity() { + return useFogDensity; + } + + public static void setUseFogDensity(boolean useFogDensity) { + ClientOptions.useFogDensity = useFogDensity; + } + + public static boolean blendBiomeMusic() { + return blendBiomeMusic; + } + + public static void setBlendBiomeMusic(boolean blendBiomeMusic) { + ClientOptions.blendBiomeMusic = blendBiomeMusic; + } + + public static boolean useSulfurWaterColor() { + return sulfurWaterColor; + } + + public static void setSulfurWaterColor(boolean sulfurWaterColor) { + ClientOptions.sulfurWaterColor = sulfurWaterColor; + } +} diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index ff5b36d9..fea3c140 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -3,33 +3,33 @@ package ru.betterend.client.gui; import java.util.Arrays; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ScreenTexts; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.DiffuseLighting; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; -import net.minecraft.client.util.SelectionManager; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Util; -import net.minecraft.util.math.Matrix4f; -import ru.betterend.blocks.basis.BlockSign; +import net.minecraft.Util; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.font.TextFieldHelper; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.render.EndSignBlockEntityRenderer; @@ -39,39 +39,39 @@ public class BlockSignEditScreen extends Screen { private final ESignBlockEntity sign; private int ticksSinceOpened; private int currentRow; - private SelectionManager selectionManager; + private TextFieldHelper selectionManager; private final String[] text = (String[]) Util.make(new String[4], (strings) -> { Arrays.fill(strings, ""); }); public BlockSignEditScreen(ESignBlockEntity sign) { - super(new TranslatableText("sign.edit")); + super(new TranslatableComponent("sign.edit")); this.sign = sign; } protected void init() { - this.client.keyboard.setRepeatEvents(true); - this.addButton(new ButtonWidget(this.width / 2 - 100, this.height / 4 + 120, 200, 20, ScreenTexts.DONE, + this.minecraft.keyboardHandler.setSendRepeatsToGui(true); + this.addButton(new Button(this.width / 2 - 100, this.height / 4 + 120, 200, 20, CommonComponents.GUI_DONE, (buttonWidget) -> { this.finishEditing(); })); this.sign.setEditable(false); - this.selectionManager = new SelectionManager(() -> { + this.selectionManager = new TextFieldHelper(() -> { return this.text[this.currentRow]; }, (string) -> { this.text[this.currentRow] = string; - this.sign.setTextOnRow(this.currentRow, new LiteralText(string)); - }, SelectionManager.makeClipboardGetter(this.client), SelectionManager.makeClipboardSetter(this.client), + this.sign.setMessage(this.currentRow, new TextComponent(string)); + }, TextFieldHelper.createClipboardGetter(this.minecraft), TextFieldHelper.createClipboardSetter(this.minecraft), (string) -> { - return this.client.textRenderer.getWidth(string) <= 90; + return this.minecraft.font.width(string) <= 90; }); } public void removed() { - this.client.keyboard.setRepeatEvents(false); - ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler(); + this.minecraft.keyboardHandler.setSendRepeatsToGui(false); + ClientPacketListener clientPlayNetworkHandler = this.minecraft.getConnection(); if (clientPlayNetworkHandler != null) { - clientPlayNetworkHandler.sendPacket(new UpdateSignC2SPacket(this.sign.getPos(), this.text[0], this.text[1], + clientPlayNetworkHandler.send(new ServerboundSignUpdatePacket(this.sign.getBlockPos(), this.text[0], this.text[1], this.text[2], this.text[3])); } @@ -80,19 +80,18 @@ public class BlockSignEditScreen extends Screen { public void tick() { ++this.ticksSinceOpened; - if (!this.sign.getType().supports(this.sign.getCachedState().getBlock())) { + if (!this.sign.getType().isValid(this.sign.getBlockState().getBlock())) { this.finishEditing(); - System.out.println(this.sign.getType()); } } private void finishEditing() { - this.sign.markDirty(); - this.client.openScreen((Screen) null); + this.sign.setChanged(); + this.minecraft.setScreen((Screen) null); } public boolean charTyped(char chr, int keyCode) { - this.selectionManager.insert(chr); + this.selectionManager.charTyped(chr); return true; } @@ -103,29 +102,29 @@ public class BlockSignEditScreen extends Screen { public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == 265) { this.currentRow = this.currentRow - 1 & 3; - this.selectionManager.moveCaretToEnd(); + this.selectionManager.setCursorToEnd(); return true; } else if (keyCode != 264 && keyCode != 257 && keyCode != 335) { - return this.selectionManager.handleSpecialKey(keyCode) ? true + return this.selectionManager.keyPressed(keyCode) ? true : super.keyPressed(keyCode, scanCode, modifiers); } else { this.currentRow = this.currentRow + 1 & 3; - this.selectionManager.moveCaretToEnd(); + this.selectionManager.setCursorToEnd(); return true; } } - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - DiffuseLighting.disableGuiDepthLighting(); + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + Lighting.setupForFlatItems(); this.renderBackground(matrices); - DrawableHelper.drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 40, 16777215); - matrices.push(); + GuiComponent.drawCenteredString(matrices, this.font, this.title, this.width / 2, 40, 16777215); + matrices.pushPose(); matrices.translate((double) (this.width / 2), 0.0D, 50.0D); matrices.scale(93.75F, -93.75F, 93.75F); matrices.translate(0.0D, -1.3125D, 0.0D); - BlockState blockState = this.sign.getCachedState(); - boolean bl = blockState.get(BlockSign.FLOOR); + BlockState blockState = this.sign.getBlockState(); + boolean bl = blockState.getValue(EndSignBlock.FLOOR); if (!bl) { matrices.translate(0.0D, -0.3125D, 0.0D); @@ -133,25 +132,25 @@ public class BlockSignEditScreen extends Screen { boolean bl2 = this.ticksSinceOpened / 6 % 2 == 0; - matrices.push(); + matrices.pushPose(); matrices.scale(0.6666667F, -0.6666667F, -0.6666667F); - VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers(); + MultiBufferSource.BufferSource immediate = this.minecraft.renderBuffers().bufferSource(); VertexConsumer vertexConsumer = EndSignBlockEntityRenderer.getConsumer(immediate, blockState.getBlock()); - this.model.field.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + this.model.sign.render(matrices, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY); if (bl) { - this.model.foot.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + this.model.stick.render(matrices, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY); } - matrices.pop(); + matrices.popPose(); matrices.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); matrices.scale(0.010416667F, -0.010416667F, 0.010416667F); - int i = this.sign.getTextColor().getSignColor(); - int j = this.selectionManager.getSelectionStart(); - int k = this.selectionManager.getSelectionEnd(); + int i = this.sign.getColor().getTextColor(); + int j = this.selectionManager.getCursorPos(); + int k = this.selectionManager.getSelectionPos(); int l = this.currentRow * 10 - this.text.length * 5; - Matrix4f matrix4f = matrices.peek().getModel(); + Matrix4f matrix4f = matrices.last().pose(); int m; String string2; @@ -160,73 +159,73 @@ public class BlockSignEditScreen extends Screen { for (m = 0; m < this.text.length; ++m) { string2 = this.text[m]; if (string2 != null) { - if (this.textRenderer.isRightToLeft()) { - string2 = this.textRenderer.mirror(string2); + if (this.font.isBidirectional()) { + string2 = this.font.bidirectionalShaping(string2); } - float n = (float) (-this.client.textRenderer.getWidth(string2) / 2); - this.client.textRenderer.draw(string2, n, (float) (m * 10 - this.text.length * 5), i, false, matrix4f, + float n = (float) (-this.minecraft.font.width(string2) / 2); + this.minecraft.font.drawInBatch(string2, n, (float) (m * 10 - this.text.length * 5), i, false, matrix4f, immediate, false, 0, 15728880, false); if (m == this.currentRow && j >= 0 && bl2) { - s = this.client.textRenderer - .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); - t = s - this.client.textRenderer.getWidth(string2) / 2; + s = this.minecraft.font + .width(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + t = s - this.minecraft.font.width(string2) / 2; if (j >= string2.length()) { - this.client.textRenderer.draw("_", (float) t, (float) l, i, false, matrix4f, immediate, false, + this.minecraft.font.drawInBatch("_", (float) t, (float) l, i, false, matrix4f, immediate, false, 0, 15728880, false); } } } } - immediate.draw(); + immediate.endBatch(); for (m = 0; m < this.text.length; ++m) { string2 = this.text[m]; if (string2 != null && m == this.currentRow && j >= 0) { - int r = this.client.textRenderer - .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); - s = r - this.client.textRenderer.getWidth(string2) / 2; + int r = this.minecraft.font + .width(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + s = r - this.minecraft.font.width(string2) / 2; if (bl2 && j < string2.length()) { int var31 = l - 1; int var10003 = s + 1; - this.client.textRenderer.getClass(); + this.minecraft.font.getClass(); fill(matrices, s, var31, var10003, l + 9, -16777216 | i); } if (k != j) { t = Math.min(j, k); int u = Math.max(j, k); - int v = this.client.textRenderer.getWidth(string2.substring(0, t)) - - this.client.textRenderer.getWidth(string2) / 2; - int w = this.client.textRenderer.getWidth(string2.substring(0, u)) - - this.client.textRenderer.getWidth(string2) / 2; + int v = this.minecraft.font.width(string2.substring(0, t)) + - this.minecraft.font.width(string2) / 2; + int w = this.minecraft.font.width(string2.substring(0, u)) + - this.minecraft.font.width(string2) / 2; int x = Math.min(v, w); int y = Math.max(v, w); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferBuilder = tessellator.getBuffer(); + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuilder(); RenderSystem.disableTexture(); RenderSystem.enableColorLogicOp(); RenderSystem.logicOp(GlStateManager.LogicOp.OR_REVERSE); - bufferBuilder.begin(7, VertexFormats.POSITION_COLOR); + bufferBuilder.begin(7, DefaultVertexFormat.POSITION_COLOR); float var32 = (float) x; - this.client.textRenderer.getClass(); - bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); + this.minecraft.font.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).endVertex(); var32 = (float) y; - this.client.textRenderer.getClass(); - bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); - bufferBuilder.vertex(matrix4f, (float) y, (float) l, 0.0F).color(0, 0, 255, 255).next(); - bufferBuilder.vertex(matrix4f, (float) x, (float) l, 0.0F).color(0, 0, 255, 255).next(); + this.minecraft.font.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).endVertex(); + bufferBuilder.vertex(matrix4f, (float) y, (float) l, 0.0F).color(0, 0, 255, 255).endVertex(); + bufferBuilder.vertex(matrix4f, (float) x, (float) l, 0.0F).color(0, 0, 255, 255).endVertex(); bufferBuilder.end(); - BufferRenderer.draw(bufferBuilder); + BufferUploader.end(bufferBuilder); RenderSystem.disableColorLogicOp(); RenderSystem.enableTexture(); } } } - matrices.pop(); - DiffuseLighting.enableGuiDepthLighting(); + matrices.popPose(); + Lighting.setupFor3DItems(); super.render(matrices, mouseX, mouseY, delta); } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 3339920f..1ed760f5 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -5,23 +5,23 @@ import java.util.List; import java.util.Set; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.screen.slot.Slot; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.recipebook.BlastingRecipeBookComponent; +import net.minecraft.core.NonNullList; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @Environment(EnvType.CLIENT) -public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScreen { +public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent { private Iterator fuelIterator; private Set fuels; private Slot fuelSlot; @@ -29,25 +29,25 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree private float frameTime; @Override - protected Set getAllowedFuels() { + protected Set getFuelItems() { return EndStoneSmelterBlockEntity.availableFuels().keySet(); } @Override public void slotClicked(Slot slot) { super.slotClicked(slot); - if (slot != null && slot.id < this.craftingScreenHandler.getCraftingSlotCount()) { + if (slot != null && slot.index < this.menu.getSize()) { this.fuelSlot = null; } } @Override - public void showGhostRecipe(Recipe recipe, List slots) { - this.ghostSlots.reset(); - ItemStack result = recipe.getOutput(); - this.ghostSlots.setRecipe(recipe); - this.ghostSlots.addSlot(Ingredient.ofStacks(result), (slots.get(3)).x, (slots.get(3)).y); - DefaultedList inputs = recipe.getPreviewInputs(); + public void setupGhostRecipe(Recipe recipe, List slots) { + this.ghostRecipe.clear(); + ItemStack result = recipe.getResultItem(); + this.ghostRecipe.setRecipe(recipe); + this.ghostRecipe.addIngredient(Ingredient.of(result), (slots.get(3)).x, (slots.get(3)).y); + NonNullList inputs = recipe.getIngredients(); Iterator iterator = inputs.iterator(); for(int i = 0; i < 2; i++) { if (!iterator.hasNext()) { @@ -56,12 +56,12 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree Ingredient ingredient = iterator.next(); if (!ingredient.isEmpty()) { Slot slot = slots.get(i); - this.ghostSlots.addSlot(ingredient, slot.x, slot.y); + this.ghostRecipe.addIngredient(ingredient, slot.x, slot.y); } } this.fuelSlot = slots.get(2); if (this.fuels == null) { - this.fuels = this.getAllowedFuels(); + this.fuels = this.getFuelItems(); } this.fuelIterator = this.fuels.iterator(); @@ -69,8 +69,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree } @Override - public void drawGhostSlots(MatrixStack matrices, int x, int y, boolean bl, float f) { - this.ghostSlots.draw(matrices, client, x, y, bl, f); + public void renderGhostRecipe(PoseStack matrices, int x, int y, boolean bl, float f) { + this.ghostRecipe.render(matrices, minecraft, x, y, bl, f); if (fuelSlot != null) { if (!Screen.hasControlDown()) { this.frameTime += f; @@ -78,20 +78,20 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; - DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.client.getItemRenderer().renderInGuiWithOverrides(client.player, this.getItem().getDefaultStack(), slotX, slotY); + GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); + this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY); RenderSystem.depthFunc(516); - DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); + GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); } } - private Item getItem() { + private Item getFuel() { if (this.currentItem == null || this.frameTime > 30.0F) { this.frameTime = 0.0F; if (this.fuelIterator == null || !this.fuelIterator.hasNext()) { if (this.fuels == null) { - this.fuels = this.getAllowedFuels(); + this.fuels = this.getFuelItems(); } this.fuelIterator = this.fuels.iterator(); } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 8c81c7ff..c030ed9f 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -1,70 +1,68 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.client.gui.widget.TexturedButtonWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.StringVisitable; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.components.ImageButton; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) -public class EndStoneSmelterScreen extends HandledScreen implements RecipeBookProvider { +public class EndStoneSmelterScreen extends AbstractContainerScreen implements RecipeUpdateListener { - private final static Identifier RECIPE_BUTTON_TEXTURE = new Identifier("textures/gui/recipe_button.png"); - private final static Identifier BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); + private final static ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation("textures/gui/recipe_button.png"); + private final static ResourceLocation BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); public final EndStoneSmelterRecipeBookScreen recipeBook; private boolean narrow; - public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, PlayerInventory inventory, Text title) { + public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, Inventory inventory, Component title) { super(handler, inventory, title); - this.recipeBook = new EndStoneSmelterRecipeBookScreen(); + recipeBook = new EndStoneSmelterRecipeBookScreen(); } public void init() { super.init(); - this.narrow = this.width < 379; - this.recipeBook.initialize(width, height, client, narrow, handler); - this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - this.addButton(new TexturedButtonWidget(x + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { - this.recipeBook.reset(narrow); - this.recipeBook.toggleOpen(); - this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - ((TexturedButtonWidget) buttonWidget).setPos(this.x + 20, height / 2 - 49); + narrow = width < 379; + recipeBook.init(width, height, minecraft, narrow, menu); + leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + addButton(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + recipeBook.initVisuals(narrow); + recipeBook.toggleVisibility(); + leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); })); - this.titleX = (this.backgroundWidth - this.textRenderer.getWidth((StringVisitable)this.title)) / 2; + titleLabelX = (imageWidth - font.width(title)) / 2; } @Override public void tick() { super.tick(); - this.recipeBook.update(); + recipeBook.tick(); } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - this.renderBackground(matrices); - if (this.recipeBook.isOpen() && this.narrow) { - this.drawBackground(matrices, delta, mouseX, mouseY); - this.recipeBook.render(matrices, mouseX, mouseY, delta); + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + renderBackground(matrices); + if (recipeBook.isVisible() && narrow) { + renderBg(matrices, delta, mouseX, mouseY); + recipeBook.render(matrices, mouseX, mouseY, delta); } else { - this.recipeBook.render(matrices, mouseX, mouseY, delta); + recipeBook.render(matrices, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta); - this.recipeBook.drawGhostSlots(matrices, x, y, true, delta); + recipeBook.renderGhostRecipe(matrices, leftPos, topPos, true, delta); } - - this.drawMouseoverTooltip(matrices, mouseX, mouseY); - this.recipeBook.drawTooltip(matrices, x, y, mouseX, mouseY); + renderTooltip(matrices, mouseX, mouseY); + recipeBook.renderTooltip(matrices, leftPos, topPos, mouseX, mouseY); } @Override @@ -72,59 +70,60 @@ public class EndStoneSmelterScreen extends HandledScreen= (left + backgroundWidth) || mouseY >= (top + backgroundHeight); - return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, x, y, backgroundWidth, backgroundHeight, button) && isMouseOut; + protected boolean hasClickedOutside(double mouseX, double mouseY, int left, int top, int button) { + boolean isMouseOut = mouseX < left || mouseY < top || mouseX >= (left + imageWidth) || mouseY >= (top + imageHeight); + return this.recipeBook.hasClickedOutside(mouseX, mouseY, leftPos, topPos, imageWidth, imageHeight, button) && isMouseOut; } @Override public boolean charTyped(char chr, int keyCode) { - return this.recipeBook.charTyped(chr, keyCode) ? true : super.charTyped(chr, keyCode); + return recipeBook.charTyped(chr, keyCode) || super.charTyped(chr, keyCode); } @Override - public void refreshRecipeBook() { - this.recipeBook.refresh(); + public void recipesUpdated() { + recipeBook.recipesUpdated(); } @Override - public RecipeBookWidget getRecipeBookWidget() { - return this.recipeBook; + public RecipeBookComponent getRecipeBookComponent() { + return recipeBook; } @Override - protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) { + protected void renderBg(PoseStack matrices, float delta, int mouseX, int mouseY) { + if (minecraft == null) return; RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - this.client.getTextureManager().bindTexture(BACKGROUND_TEXTURE); - this.drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight); - int p; - if (handler.isBurning()) { - p = handler.getFuelProgress(); - this.drawTexture(matrices, x + 56, y + 36 + 12 - p, 176, 12 - p, 14, p + 1); + minecraft.getTextureManager().bind(BACKGROUND_TEXTURE); + blit(matrices, leftPos, topPos, 0, 0, imageWidth, imageHeight); + int progress; + if (menu.isBurning()) { + progress = menu.getFuelProgress(); + blit(matrices, leftPos + 56, topPos + 36 + 12 - progress, 176, 12 - progress, 14, progress + 1); } - p = handler.getSmeltProgress(); - this.drawTexture(matrices, x + 92, y + 34, 176, 14, p + 1, 16); + progress = menu.getSmeltProgress(); + blit(matrices, leftPos + 92, topPos + 34, 176, 14, progress + 1, 16); } @Override public void removed() { - this.recipeBook.close(); + recipeBook.removed(); super.removed(); } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index d6eb2249..e2c98053 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -3,21 +3,21 @@ package ru.betterend.client.gui; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.book.RecipeBookCategory; -import net.minecraft.screen.AbstractRecipeScreenHandler; -import net.minecraft.screen.ArrayPropertyDelegate; -import net.minecraft.screen.PropertyDelegate; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.screen.slot.Slot; -import net.minecraft.world.World; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.StackedContents; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.RecipeBookMenu; +import net.minecraft.world.inventory.RecipeBookType; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.StackedContentsCompatible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @@ -25,95 +25,95 @@ import ru.betterend.client.gui.slot.SmelterFuelSlot; import ru.betterend.client.gui.slot.SmelterOutputSlot; import ru.betterend.recipe.builders.AlloyingRecipe; -public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler { +public class EndStoneSmelterScreenHandler extends RecipeBookMenu { - public final static ScreenHandlerType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( + public final static MenuType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); - private final Inventory inventory; - private final PropertyDelegate propertyDelegate; - protected final World world; + private final Container inventory; + private final ContainerData propertyDelegate; + protected final Level world; - public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory) { - this(syncId, playerInventory, new SimpleInventory(4), new ArrayPropertyDelegate(4)); + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory) { + this(syncId, playerInventory, new SimpleContainer(4), new SimpleContainerData(4)); } - public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, PropertyDelegate propertyDelegate) { + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory, Container inventory, ContainerData propertyDelegate) { super(HANDLER_TYPE, syncId); this.inventory = inventory; this.propertyDelegate = propertyDelegate; - this.world = playerInventory.player.world; + this.world = playerInventory.player.level; - this.addProperties(propertyDelegate); - this.addSlot(new Slot(inventory, 0, 45, 17)); - this.addSlot(new Slot(inventory, 1, 67, 17)); - this.addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); - this.addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); + addDataSlots(propertyDelegate); + addSlot(new Slot(inventory, 0, 45, 17)); + addSlot(new Slot(inventory, 1, 67, 17)); + addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); + addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); for(int i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { - this.addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for(int i = 0; i < 9; ++i) { - this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); + addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } @Override - public ScreenHandlerType getType() { + public MenuType getType() { return HANDLER_TYPE; } @Override - public void populateRecipeFinder(RecipeFinder finder) { - if (inventory instanceof RecipeInputProvider) { - ((RecipeInputProvider) inventory).provideRecipeInputs(finder); + public void fillCraftSlotsStackedContents(StackedContents finder) { + if (inventory instanceof StackedContentsCompatible) { + ((StackedContentsCompatible) inventory).fillStackedContents(finder); } } @Override - public void clearCraftingSlots() { - this.inventory.clear(); + public void clearCraftingContent() { + inventory.clearContent(); } @Override - public boolean matches(Recipe recipe) { - return recipe.matches(this.inventory, this.world); + public boolean recipeMatches(Recipe recipe) { + return recipe.matches(inventory, world); } @Override - public int getCraftingResultSlotIndex() { + public int getResultSlotIndex() { return 3; } @Override - public int getCraftingWidth() { + public int getGridWidth() { return 2; } @Override - public int getCraftingHeight() { + public int getGridHeight() { return 1; } @Override - public int getCraftingSlotCount() { + public int getSize() { return 4; } @Override - public RecipeBookCategory getCategory() { - return RecipeBookCategory.BLAST_FURNACE; + public RecipeBookType getRecipeBookType() { + return RecipeBookType.BLAST_FURNACE; } @Override - public boolean canUse(PlayerEntity player) { - return this.inventory.canPlayerUse(player); + public boolean stillValid(Player player) { + return inventory.stillValid(player); } protected boolean isSmeltable(ItemStack itemStack) { - return this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, new SimpleInventory(new ItemStack[]{itemStack}), this.world).isPresent(); + return world.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), world).isPresent(); } public boolean isFuel(ItemStack itemStack) { @@ -121,71 +121,70 @@ public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler= 4 && index < 31) { - if (!insertItem(itemStack2, 31, 40, false)) { - return ItemStack.EMPTY; - } - } else if (index >= 31 && index < 40 && !insertItem(itemStack2, 4, 31, false)) { - return ItemStack.EMPTY; - } - } else if (!insertItem(itemStack2, 4, 40, false)) { + public ItemStack quickMoveStack(Player player, int index) { + Slot slot = slots.get(index); + if (slot == null || !slot.hasItem()) return ItemStack.EMPTY; + + ItemStack slotStack = slot.getItem(); + ItemStack itemStack = slotStack.copy(); + if (index == 3) { + if (!moveItemStackTo(slotStack, 4, 40, true)) { return ItemStack.EMPTY; } - - if (itemStack2.isEmpty()) { - slot.setStack(ItemStack.EMPTY); - } else { - slot.markDirty(); - } - - if (itemStack2.getCount() == itemStack.getCount()) { + slot.onQuickCraft(slotStack, itemStack); + } else if (index != 2 && index != 1 && index != 0) { + if (isSmeltable(slotStack)) { + if (!moveItemStackTo(slotStack, 0, 2, false)) { + return ItemStack.EMPTY; + } + } else if (isFuel(slotStack)) { + if (!moveItemStackTo(slotStack, 2, 3, false)) { + return ItemStack.EMPTY; + } + } else if (index < 31) { + if (!moveItemStackTo(slotStack, 31, 40, false)) { + return ItemStack.EMPTY; + } + } else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { return ItemStack.EMPTY; } - - slot.onTakeItem(player, itemStack2); + } else if (!moveItemStackTo(slotStack, 4, 40, false)) { + return ItemStack.EMPTY; } + if (slotStack.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (slotStack.getCount() == itemStack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(player, slotStack); + return itemStack; } @Environment(EnvType.CLIENT) public int getSmeltProgress() { - int time = this.propertyDelegate.get(2); - int timeTotal = this.propertyDelegate.get(3); + int time = propertyDelegate.get(2); + int timeTotal = propertyDelegate.get(3); return timeTotal != 0 && time != 0 ? time * 24 / timeTotal : 0; } @Environment(EnvType.CLIENT) public int getFuelProgress() { - int fuelTime = this.propertyDelegate.get(1); + int fuelTime = propertyDelegate.get(1); if (fuelTime == 0) { fuelTime = 200; } - return this.propertyDelegate.get(0) * 13 / fuelTime; + return propertyDelegate.get(0) * 13 / fuelTime; } @Environment(EnvType.CLIENT) public boolean isBurning() { - return this.propertyDelegate.get(0) > 0; + return propertyDelegate.get(0) > 0; } } diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java index e0381d87..06ec70a5 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java @@ -1,25 +1,25 @@ package ru.betterend.client.gui.slot; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.FurnaceFuelSlot; -import net.minecraft.screen.slot.Slot; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.FurnaceFuelSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; public class SmelterFuelSlot extends Slot { private final EndStoneSmelterScreenHandler handler; - public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Inventory inventory, int index, int x, int y) { + public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.handler = handler; } - public boolean canInsert(ItemStack stack) { + public boolean mayPlace(ItemStack stack) { return this.handler.isFuel(stack) || FurnaceFuelSlot.isBucket(stack); } - public int getMaxItemCount(ItemStack stack) { - return FurnaceFuelSlot.isBucket(stack) ? 1 : super.getMaxItemCount(stack); + public int getMaxStackSize(ItemStack stack) { + return FurnaceFuelSlot.isBucket(stack) ? 1 : super.getMaxStackSize(stack); } } diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java index dfe85893..212eb179 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java @@ -1,48 +1,48 @@ package ru.betterend.client.gui.slot; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; public class SmelterOutputSlot extends Slot { - private PlayerEntity player; + private Player player; private int amount; - public SmelterOutputSlot(PlayerEntity player, Inventory inventory, int index, int x, int y) { + public SmelterOutputSlot(Player player, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.player = player; } - public boolean canInsert(ItemStack stack) { + public boolean mayPlace(ItemStack stack) { return false; } - public ItemStack takeStack(int amount) { - if (this.hasStack()) { - this.amount += Math.min(amount, this.getStack().getCount()); + public ItemStack remove(int amount) { + if (this.hasItem()) { + this.amount += Math.min(amount, this.getItem().getCount()); } - return super.takeStack(amount); + return super.remove(amount); } - public ItemStack onTakeItem(PlayerEntity player, ItemStack stack) { - this.onCrafted(stack); - super.onTakeItem(player, stack); + public ItemStack onTake(Player player, ItemStack stack) { + this.checkTakeAchievements(stack); + super.onTake(player, stack); return stack; } - protected void onCrafted(ItemStack stack, int amount) { + protected void onQuickCraft(ItemStack stack, int amount) { this.amount += amount; - this.onCrafted(stack); + this.checkTakeAchievements(stack); } - protected void onCrafted(ItemStack stack) { - stack.onCraft(this.player.world, this.player, this.amount); - if (!this.player.world.isClient && this.inventory instanceof EndStoneSmelterBlockEntity) { - ((EndStoneSmelterBlockEntity) this.inventory).dropExperience(player); + protected void checkTakeAchievements(ItemStack stack) { + stack.onCraftedBy(this.player.level, this.player, this.amount); + if (!this.player.level.isClientSide && this.container instanceof EndStoneSmelterBlockEntity) { + ((EndStoneSmelterBlockEntity) this.container).dropExperience(player); } this.amount = 0; } diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java new file mode 100644 index 00000000..ed1fc9e8 --- /dev/null +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -0,0 +1,51 @@ +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.ElytraLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.PlayerModelPart; +import net.minecraft.world.item.ItemStack; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.item.model.ArmoredElytraModel; + +public class ArmoredElytraLayer> extends ElytraLayer { + private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); + + public ArmoredElytraLayer(RenderLayerParent renderLayerParent) { + super(renderLayerParent); + } + + public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { + ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra) { + ResourceLocation wingsTexture = ((ArmoredElytra) itemStack.getItem()).getWingTexture(); + if (livingEntity instanceof AbstractClientPlayer) { + AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; + if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) { + wingsTexture = abstractClientPlayer.getElytraTextureLocation(); + } else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer.isModelPartShown(PlayerModelPart.CAPE)) { + wingsTexture = abstractClientPlayer.getCloakTextureLocation(); + } + } + + poseStack.pushPose(); + poseStack.translate(0.0D, 0.0D, 0.125D); + getParentModel().copyPropertiesTo(elytraModel); + elytraModel.setupAnim(livingEntity, f, g, j, k, l); + VertexConsumer vertexConsumer = ItemRenderer.getArmorFoilBuffer(multiBufferSource, RenderType.armorCutoutNoCull(wingsTexture), false, itemStack.hasFoil()); + elytraModel.renderToBuffer(poseStack, vertexConsumer, i, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + poseStack.popPose(); + } + } +} diff --git a/src/main/java/ru/betterend/client/render/BeamRenderer.java b/src/main/java/ru/betterend/client/render/BeamRenderer.java index f8fa4047..88de8add 100644 --- a/src/main/java/ru/betterend/client/render/BeamRenderer.java +++ b/src/main/java/ru/betterend/client/render/BeamRenderer.java @@ -1,48 +1,49 @@ package ru.betterend.client.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Matrix3f; -import net.minecraft.util.math.Matrix4f; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; public class BeamRenderer { - private static final Identifier BEAM_TEXTURE = new Identifier("textures/entity/end_gateway_beam.png"); + private static final ResourceLocation BEAM_TEXTURE = new ResourceLocation("textures/entity/end_gateway_beam.png"); - public static void renderLightBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int age, float tick, int minY, int maxY, float[] colors, float alpha, float beamIn, float beamOut) { + public static void renderLightBeam(PoseStack matrices, MultiBufferSource vertexConsumers, int age, float tick, int minY, int maxY, float[] colors, float alpha, float beamIn, float beamOut) { float red = colors[0]; float green = colors[1]; float blue = colors[2]; int maxBY = minY + maxY; float delta = maxY < 0 ? tick : -tick; - float fractDelta = MathHelper.fractionalPart(delta * 0.2F - (float) MathHelper.floor(delta * 0.1F)); + float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); float xIn = -beamIn; - float minV = MathHelper.clamp(fractDelta - 1.0F, 0.0F, 1.0F); + float minV = Mth.clamp(fractDelta - 1.0F, 0.0F, 1.0F); float maxV = (float) maxY * (0.5F / beamIn) + minV; float rotation = (age + tick) / 25.0F + 6.0F; - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getBeaconBeam(BEAM_TEXTURE, true)); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.beaconBeam(BEAM_TEXTURE, true)); - matrices.push(); - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(-rotation)); + matrices.pushPose(); + matrices.mulPose(Vector3f.YP.rotation(-rotation)); renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, beamIn, 0.0F, 0.0F, beamIn, 0.0F, xIn, xIn, 0.0F, 0.0F, 1.0F, minV, maxV); float xOut = -beamOut; maxV = (float) maxY + minV; renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, xOut, xOut, beamOut, xOut, xOut, beamOut, beamOut, beamOut, 0.0F, 1.0F, minV, maxV); - matrices.pop(); + matrices.popPose(); } - private static void renderBeam(MatrixStack matrices, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, float x4, float d4, float minU, float maxU, float minV, float maxV) { - MatrixStack.Entry entry = matrices.peek(); - Matrix4f matrix4f = entry.getModel(); - Matrix3f matrix3f = entry.getNormal(); + private static void renderBeam(PoseStack matrices, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, float x4, float d4, float minU, float maxU, float minV, float maxV) { + PoseStack.Pose entry = matrices.last(); + Matrix4f matrix4f = entry.pose(); + Matrix3f matrix3f = entry.normal(); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x1, d1, x2, d2, minU, maxU, minV, maxV); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x4, d4, x3, d3, minU, maxU, minV, maxV); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x2, d2, x4, d4, minU, maxU, minV, maxV); @@ -57,6 +58,6 @@ public class BeamRenderer { } private static void addVertex(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, float x, float y, float d, float u, float v) { - vertexConsumer.vertex(matrix4f, x, y, d).color(red, green, blue, alpha).texture(u, v).overlay(OverlayTexture.DEFAULT_UV).light(15728880).normal(matrix3f, 0.0F, 1.0F, 0.0F).next(); + vertexConsumer.vertex(matrix4f, x, y, d).color(red, green, blue, alpha).uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); } } diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index 6b4f994e..54a1d540 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -1,94 +1,95 @@ -package ru.betterend.client.render; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Matrix3f; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Quaternion; - -public class EndCrystalRenderer { - private static final Identifier CRYSTAL_TEXTURE = new Identifier("textures/entity/end_crystal/end_crystal.png"); - private static final Identifier CRYSTAL_BEAM_TEXTURE = new Identifier("textures/entity/end_crystal/end_crystal_beam.png"); - private static final RenderLayer CRYSTAL_BEAM_LAYER; - private static final RenderLayer END_CRYSTAL; - private static final ModelPart CORE; - private static final ModelPart FRAME; - private static final int AGE_CYCLE = 240; - private static final float SINE_45_DEGREES; - - public static void render(int age, int maxAge, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light) { - float k = (float) AGE_CYCLE / maxAge; - float rotation = (age * k + tickDelta) * 3.0F; - VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(END_CRYSTAL); - matrices.push(); - matrices.scale(0.8F, 0.8F, 0.8F); - matrices.translate(0.0D, -0.5D, 0.0D); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); - matrices.translate(0.0D, 0.8F, 0.0D); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); - matrices.scale(0.875F, 0.875F, 0.875F); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); - matrices.scale(0.875F, 0.875F, 0.875F); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); - matrices.pop(); - } - - public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { - float dx = start.getX() - end.getX() + 1.0F; - float dy = start.getY() - end.getY() + 1.0F; - float dz = start.getZ() - end.getZ() + 1.0F; - float f = MathHelper.sqrt(dx * dx + dz * dz); - float g = MathHelper.sqrt(dx * dx + dy * dy + dz * dz); - matrices.push(); - matrices.translate(0.0D, 2.0D, 0.0D); - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); - matrices.multiply(Vector3f.POSITIVE_X.getRadialQuaternion((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F)); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER); - float h = 0.0F - ((float) age + tickDelta) * 0.01F; - float i = MathHelper.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F; - float k = 0.0F; - float l = 0.75F; - float m = 0.0F; - MatrixStack.Entry entry = matrices.peek(); - Matrix4f matrix4f = entry.getModel(); - Matrix3f matrix3f = entry.getNormal(); - - for(int n = 1; n <= 8; ++n) { - float o = MathHelper.sin((float) n * 6.2831855F / 8.0F) * 0.75F; - float p = MathHelper.cos((float) n * 6.2831855F / 8.0F) * 0.75F; - float q = (float) n / 8.0F; - vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).texture(m, h).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).texture(m, i).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).texture(q, i).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).texture(q, h).overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - k = o; - l = p; - m = q; - } - - matrices.pop(); - } - - static { - END_CRYSTAL = RenderLayer.getEntityCutoutNoCull(CRYSTAL_TEXTURE); - CRYSTAL_BEAM_LAYER = RenderLayer.getEntitySmoothCutout(CRYSTAL_BEAM_TEXTURE); - SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); - FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addCuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - CORE = new ModelPart(64, 32, 32, 0); - CORE.addCuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - } -} +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class EndCrystalRenderer { + private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal.png"); + private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal_beam.png"); + private static final RenderType CRYSTAL_BEAM_LAYER; + private static final RenderType END_CRYSTAL; + private static final ModelPart CORE; + private static final ModelPart FRAME; + private static final int AGE_CYCLE = 240; + private static final float SINE_45_DEGREES; + + public static void render(int age, int maxAge, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { + float k = (float) AGE_CYCLE / maxAge; + float rotation = (age * k + tickDelta) * 3.0F; + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(END_CRYSTAL); + matrices.pushPose(); + matrices.scale(0.8F, 0.8F, 0.8F); + matrices.translate(0.0D, -0.5D, 0.0D); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + matrices.translate(0.0D, 0.8F, 0.0D); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.scale(0.875F, 0.875F, 0.875F); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.scale(0.875F, 0.875F, 0.875F); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.popPose(); + } + + public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { + float dx = start.getX() - end.getX() + 1.0F; + float dy = start.getY() - end.getY() + 1.0F; + float dz = start.getZ() - end.getZ() + 1.0F; + float f = Mth.sqrt(dx * dx + dz * dz); + float g = Mth.sqrt(dx * dx + dy * dy + dz * dz); + matrices.pushPose(); + matrices.translate(0.0D, 2.0D, 0.0D); + matrices.mulPose(Vector3f.YP.rotation((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); + matrices.mulPose(Vector3f.XP.rotation((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F)); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER); + float h = 0.0F - ((float) age + tickDelta) * 0.01F; + float i = Mth.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F; + float k = 0.0F; + float l = 0.75F; + float m = 0.0F; + PoseStack.Pose entry = matrices.last(); + Matrix4f matrix4f = entry.pose(); + Matrix3f matrix3f = entry.normal(); + + for(int n = 1; n <= 8; ++n) { + float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F; + float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F; + float q = (float) n / 8.0F; + vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).uv(m, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).uv(m, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).uv(q, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).uv(q, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + k = o; + l = p; + m = q; + } + + matrices.popPose(); + } + + static { + END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); + CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); + SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); + FRAME = new ModelPart(64, 32, 0, 0); + FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + CORE = new ModelPart(64, 32, 32, 0); + CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + } +} diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 348d778c..8df56267 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -1,63 +1,70 @@ -package ru.betterend.client.render; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.util.ColorUtil; -import ru.betterend.util.MHelper; - -public class EternalCrystalRenderer { - private static final Identifier CRYSTAL_TEXTURE = BetterEnd.makeID("textures/entity/eternal_crystal.png"); - private static final RenderLayer RENDER_LAYER; - private static final ModelPart SHARDS; - private static final ModelPart CORE; - - public static void render(int age, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light) { - VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); - float[] colors = colors(age); - float rotation = (age + tickDelta) / 25.0F + 6.0F; - matrices.push(); - matrices.scale(0.6F, 0.6F, 0.6F); - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], colors[3]); - SHARDS.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], colors[3]); - matrices.pop(); - } - - public static float[] colors(int age) { - double delta = age * 0.01; - int index = MHelper.floor(delta); - int index2 = (index + 1) & 3; - delta -= index; - index &= 3; - - Vec3i color1 = AuroraCrystalBlock.COLORS[index]; - Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; - - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); - - return ColorUtil.toFloatArray(MHelper.color(r, g, b)); - } - - static { - RENDER_LAYER = RenderLayer.getBeaconBeam(CRYSTAL_TEXTURE, true); - SHARDS = new ModelPart(16, 16, 2, 4); - SHARDS.addCuboid(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS.addCuboid(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS.addCuboid(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS.addCuboid(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - CORE = new ModelPart(16, 16, 0, 0); - CORE.addCuboid(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); - } -} +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.util.ColorUtil; +import ru.betterend.util.MHelper; + +public class EternalCrystalRenderer { + private static final RenderType RENDER_LAYER; + private static final ModelPart[] SHARDS; + private static final ModelPart CORE; + + public static void render(int age, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); + float[] colors = colors(age); + float rotation = (age + tickDelta) / 25.0F + 6.0F; + matrices.pushPose(); + matrices.scale(0.6F, 0.6F, 0.6F); + matrices.mulPose(Vector3f.YP.rotation(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + + for (int i = 0; i < 4; i++) { + matrices.pushPose(); + float offset = Mth.sin(rotation * 2 + i) * 0.15F; + matrices.translate(0, offset, 0); + SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + matrices.popPose(); + } + + matrices.popPose(); + } + + public static float[] colors(int age) { + double delta = age * 0.01; + int index = MHelper.floor(delta); + int index2 = (index + 1) & 3; + delta -= index; + index &= 3; + + Vec3i color1 = AuroraCrystalBlock.COLORS[index]; + Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); + + return ColorUtil.toFloatArray(MHelper.color(r, g, b)); + } + + static { + RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); + SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + CORE = new ModelPart(16, 16, 0, 0); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + } +} diff --git a/src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java deleted file mode 100644 index 82172fc7..00000000 --- a/src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java +++ /dev/null @@ -1,84 +0,0 @@ -package ru.betterend.compat.rei; - -import java.util.Collections; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.block.Blocks; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; -import ru.betterend.util.LangUtil; - -public class REIAnvilCategory implements TransferRecipeCategory { - - @Override - public @NotNull Identifier getIdentifier() { - return REIPlugin.SMITHING; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getTranslationKey()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.ANVIL; - } - - @Override - public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - int x = startPoint.x + 10; - int y = startPoint.y; - widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 4))); - List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createArrow(new Point(x + 24, y + 3))); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + bounds.height - 12), - new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 1, y + 3)).entries(inputEntries.get(1)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 4)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); - return widgets; - } - - @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, - IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.push(); - matrices.translate(0, 0, 400); - if (redSlots.contains(0)) { - DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); - DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); - } - matrices.pop(); - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); - } - - @Override - public int getDisplayHeight() { - return 49; - } - -} diff --git a/src/main/java/ru/betterend/compat/rei/REIPlugin.java b/src/main/java/ru/betterend/compat/rei/REIPlugin.java deleted file mode 100644 index d4b2365d..00000000 --- a/src/main/java/ru/betterend/compat/rei/REIPlugin.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.betterend.compat.rei; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeHelper; -import me.shedaniel.rei.api.plugins.REIPluginV0; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.Blocks; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; -import ru.betterend.recipe.builders.InfusionRecipe; -import ru.betterend.registry.EndBlocks; - -@Environment(EnvType.CLIENT) -public class REIPlugin implements REIPluginV0 { - - public final static Identifier PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static Identifier ALLOYING = AlloyingRecipe.ID; - public final static Identifier SMITHING = AnvilSmithingRecipe.ID; - public final static Identifier INFUSION = InfusionRecipe.ID; - - public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); - public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); - public final static EntryStack ANVIL = EntryStack.create(Blocks.ANVIL); - - @Override - public Identifier getPluginIdentifier() { - return PLUGIN_ID; - } - - @Override - public void registerRecipeDisplays(RecipeHelper recipeHelper) { - recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(SMITHING, AnvilSmithingRecipe.class, REIAnvilDisplay::new); - recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); - } - - @Override - public void registerOthers(RecipeHelper recipeHelper) { - recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVIL); - recipeHelper.removeAutoCraftButton(SMITHING); - } - - @Override - public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories(new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory()); - } -} diff --git a/src/main/java/ru/betterend/config/CategoryConfig.java b/src/main/java/ru/betterend/config/CategoryConfig.java new file mode 100644 index 00000000..97833379 --- /dev/null +++ b/src/main/java/ru/betterend/config/CategoryConfig.java @@ -0,0 +1,10 @@ +package ru.betterend.config; + +public class CategoryConfig extends IdConfig { + + public CategoryConfig(String group) { + super(group, (id, category) -> { + return new ConfigKey(id.getPath(), id.getNamespace(), category); + }); + } +} diff --git a/src/main/java/ru/betterend/config/Config.java b/src/main/java/ru/betterend/config/Config.java index 42a37be1..1e8f3d3f 100644 --- a/src/main/java/ru/betterend/config/Config.java +++ b/src/main/java/ru/betterend/config/Config.java @@ -2,8 +2,6 @@ package ru.betterend.config; import org.jetbrains.annotations.Nullable; -import com.google.gson.JsonObject; - import ru.betterend.BetterEnd; import ru.betterend.config.ConfigKeeper.BooleanEntry; import ru.betterend.config.ConfigKeeper.Entry; @@ -15,20 +13,16 @@ import ru.betterend.config.ConfigKeeper.StringEntry; public abstract class Config { protected final ConfigKeeper keeper; - protected final ConfigWriter writer; protected abstract void registerEntries(); public Config(String group) { - this.writer = new ConfigWriter(group); - JsonObject settings = writer.load(); - this.keeper = new ConfigKeeper(settings); + this.keeper = new ConfigKeeper(group); this.registerEntries(); - this.writer.save(); } public void saveChanges() { - this.writer.save(); + this.keeper.save(); } @Nullable @@ -112,7 +106,7 @@ public abstract class Config { FloatEntry entry = keeper.registerEntry(key, new FloatEntry(defaultValue)); return entry.getValue(); } - return val != null ? val : defaultValue; + return val; } protected float getFloat(ConfigKey key) { @@ -138,7 +132,7 @@ public abstract class Config { BooleanEntry entry = keeper.registerEntry(key, new BooleanEntry(defaultValue)); return entry.getValue(); } - return val != null ? val : defaultValue; + return val; } protected boolean getBoolean(ConfigKey key) { diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 20b110c4..ffd6ee5b 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -12,66 +12,67 @@ import com.google.common.reflect.TypeToken; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import net.minecraft.util.JsonHelper; +import net.minecraft.util.GsonHelper; import ru.betterend.util.JsonFactory; public final class ConfigKeeper { - private Map> configEntries = Maps.newHashMap(); + private final Map> configEntries = Maps.newHashMap(); private final JsonObject configObject; + private final ConfigWriter writer; - public ConfigKeeper(JsonObject config) { - this.configObject = config; + private boolean changed = false; + + public ConfigKeeper(String group) { + this.writer = new ConfigWriter(group); + this.configObject = writer.load(); } - private > void storeValue(ConfigKey key, E entry, T value) { - if (configObject == null) return; - - String group = key.getOwner(); - JsonObject jsonGroup; - if (configObject.has(group)) { - jsonGroup = JsonHelper.getObject(configObject, group); - } else { - jsonGroup = new JsonObject(); - configObject.add(group, jsonGroup); - } - String category = key.getCategory(); - JsonObject jsonCategory; - if (jsonGroup.has(category)) { - jsonCategory = JsonHelper.getObject(jsonGroup, category); - } else { - jsonCategory = new JsonObject(); - jsonGroup.add(category, jsonCategory); - } - String paramKey = key.getEntry(); - paramKey += " [default: " + entry.getDefault() + "]"; - entry.toJson(jsonCategory, paramKey, value); + public void save() { + if (!changed) return; + this.writer.save(); + this.changed = false; } - private > T getValue(ConfigKey key, E entry) { + private > void initializeEntry(ConfigKey key, E entry) { if (configObject == null) { - return entry.getDefault(); + return; + } + String[] path = key.getPath(); + JsonObject obj = configObject; + + if (!key.isRoot()) { + for (String group: path) { + JsonElement element = obj.get(group); + if (element == null || !element.isJsonObject()) { + element = new JsonObject(); + obj.add(group, element); + } + obj = element.getAsJsonObject(); + } } - String group = key.getOwner(); - if (!configObject.has(group)) { - return entry.getDefault(); - } - - JsonObject jsonGroup = JsonHelper.getObject(configObject, group); - String category = key.getCategory(); - if (!jsonGroup.has(category)) { - return entry.getDefault(); - } - - JsonObject jsonCategory = JsonHelper.getObject(jsonGroup, category); String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - if (!jsonCategory.has(paramKey)) { + + this.changed |= entry.setLocation(obj, paramKey); + } + + private > void storeValue(E entry, T value) { + if (configObject == null) { + return; + } + T val = entry.getValue(); + if (value.equals(val)) return; + entry.toJson(value); + this.changed = true; + } + + private > T getValue(E entry) { + if (!entry.hasLocation()) { return entry.getDefault(); } - - return entry.fromJson(jsonCategory.get(paramKey)); + return entry.fromJson(); } @Nullable @@ -93,9 +94,9 @@ public final class ConfigKeeper { } public > E registerEntry(ConfigKey key, E entry) { - entry.setWriter(value -> this.storeValue(key, entry, value)); - entry.setReader(() -> { return this.getValue(key, entry); }); - this.storeValue(key, entry, entry.getValue()); + entry.setWriter(value -> this.storeValue(entry, value)); + entry.setReader(() -> { return this.getValue(entry); }); + this.initializeEntry(key, entry); this.configEntries.put(key, entry); return entry; } @@ -107,13 +108,13 @@ public final class ConfigKeeper { } @Override - public Boolean fromJson(JsonElement json) { - return json.getAsBoolean(); + public Boolean fromJson() { + return GsonHelper.getAsBoolean(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Boolean value) { - json.addProperty(key, value); + public void toJson(Boolean value) { + this.location.addProperty(key, value); } } @@ -124,13 +125,13 @@ public final class ConfigKeeper { } @Override - public Float fromJson(JsonElement json) { - return json.getAsFloat(); + public Float fromJson() { + return GsonHelper.getAsFloat(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Float value) { - json.addProperty(key, value); + public void toJson(Float value) { + this.location.addProperty(key, value); } } @@ -141,13 +142,13 @@ public final class ConfigKeeper { } @Override - public Float fromJson(JsonElement json) { - return json.getAsFloat(); + public Float fromJson() { + return GsonHelper.getAsFloat(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Float value) { - json.addProperty(key, value); + public void toJson(Float value) { + this.location.addProperty(key, value); } } @@ -163,13 +164,13 @@ public final class ConfigKeeper { } @Override - public Integer fromJson(JsonElement json) { - return json.getAsInt(); + public Integer fromJson() { + return GsonHelper.getAsInt(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Integer value) { - json.addProperty(key, value); + public void toJson(Integer value) { + this.location.addProperty(key, value); } } @@ -180,13 +181,13 @@ public final class ConfigKeeper { } @Override - public Integer fromJson(JsonElement json) { - return json.getAsInt(); + public Integer fromJson() { + return GsonHelper.getAsInt(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Integer value) { - json.addProperty(key, value); + public void toJson(Integer value) { + this.location.addProperty(key, value); } } @@ -197,13 +198,13 @@ public final class ConfigKeeper { } @Override - public String fromJson(JsonElement json) { - return json.getAsString(); + public String fromJson() { + return GsonHelper.getAsString(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, String value) { - json.addProperty(key, value); + public void toJson(String value) { + this.location.addProperty(key, value); } } @@ -226,13 +227,13 @@ public final class ConfigKeeper { } @Override - public T fromJson(JsonElement json) { - return JsonFactory.GSON.fromJson(json, type); + public T fromJson() { + return JsonFactory.GSON.fromJson(location.get(key), type); } @Override - public void toJson(JsonObject json, String key, T value) { - json.addProperty(key, JsonFactory.GSON.toJson(json, type)); + public void toJson(T value) { + location.addProperty(key, JsonFactory.GSON.toJson(value, type)); } } @@ -265,9 +266,11 @@ public final class ConfigKeeper { protected final T defaultValue; protected Consumer writer; protected Supplier reader; + protected JsonObject location; + protected String key; - public abstract T fromJson(JsonElement json); - public abstract void toJson(JsonObject json, String key, T value); + public abstract T fromJson(); + public abstract void toJson(T value); public Entry (T defaultValue) { this.defaultValue = defaultValue; @@ -281,6 +284,21 @@ public final class ConfigKeeper { this.reader = reader; } + protected boolean setLocation(JsonObject location, String key) { + this.location = location; + this.key = key; + if (!location.has(key)) { + this.toJson(defaultValue); + return true; + } + return false; + } + + protected boolean hasLocation() { + return this.location != null && + this.key != null; + } + public T getValue() { return this.reader.get(); } diff --git a/src/main/java/ru/betterend/config/ConfigKey.java b/src/main/java/ru/betterend/config/ConfigKey.java index 5c7ed7bc..de970d51 100644 --- a/src/main/java/ru/betterend/config/ConfigKey.java +++ b/src/main/java/ru/betterend/config/ConfigKey.java @@ -1,38 +1,41 @@ package ru.betterend.config; -import org.jetbrains.annotations.NotNull; +import net.minecraft.resources.ResourceLocation; public class ConfigKey { - private final String owner; - private final String category; + private final String path[]; private final String entry; + private final boolean root; - public ConfigKey(@NotNull String owner, @NotNull String category, @NotNull String entry) { - this.validate(owner, category, entry); - this.owner = owner; - this.category = category; + public ConfigKey(String entry, String... path) { + this.validate(entry); + this.path = path; this.entry = entry; + this.root = path.length == 0 || (path.length == 1 && path[0].isEmpty()); + } + + public ConfigKey(String entry, ResourceLocation path) { + this(entry, path.getNamespace(), path.getPath()); } - public String getOwner() { - return owner; - } - - public String getCategory() { - return category; + public String[] getPath() { + return path; } public String getEntry() { return entry; } + + public boolean isRoot() { + return root; + } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + category.hashCode(); + result = prime * result + path.hashCode(); result = prime * result + entry.hashCode(); - result = prime * result + owner.hashCode(); return result; } @@ -45,25 +48,15 @@ public class ConfigKey { return false; } ConfigKey other = (ConfigKey) obj; - if (category == null) { - if (other.category != null) { - return false; - } - } else if (!category.equals(other.category)) { + if (other.path.length != path.length) { return false; } - if (entry == null) { - if (other.entry != null) { + for (int i = 0; i < path.length; i++) { + if (!path[i].equals(other.path[i])) { return false; } - } else if (!entry.equals(other.entry)) { - return false; } - if (owner == null) { - if (other.owner != null) { - return false; - } - } else if (!owner.equals(other.owner)) { + if (!entry.equals(other.entry)) { return false; } return true; @@ -71,18 +64,22 @@ public class ConfigKey { @Override public String toString() { - return String.format("%s:%s:%s", owner, category, entry); + if (root) { + return String.format("[root]:%s", entry); + } + String p = path[0]; + for (int i = 1; i < path.length; i++) { + p += "." + path[i]; + } + return String.format("%s:%s", p, entry); } - - private void validate(String owner, String category, String entry) { - if (owner == null) { - throw new NullPointerException("Failed to create ConfigKey: 'owner' can't be null."); - } - if (category == null) { - throw new NullPointerException("Failed to create ConfigKey: 'category' can't be null."); - } + + private void validate(String entry) { if (entry == null) { - throw new NullPointerException("Failed to create ConfigKey: 'entry' can't be null."); + throw new NullPointerException("Config key must be not null!"); + } + if (entry.isEmpty()) { + throw new IndexOutOfBoundsException("Config key must be not empty!"); } } } diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 09fcca40..f1bc46e5 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,19 +1,30 @@ -package ru.betterend.config; - -public class Configs { - public static final IdConfig ITEM_CONFIG = new IdConfig("items", (item, category) -> { - return new ConfigKey(item.getNamespace(), category, item.getPath()); - }); - public static final IdConfig BLOCK_CONFIG = new IdConfig("blocks", (block, category) -> { - return new ConfigKey(block.getNamespace(), category, block.getPath()); - }); - public static final IdConfig BIOME_CONFIG = new IdConfig("biomes", (biome, entry) -> { - return new ConfigKey(biome.getNamespace(), biome.getPath(), entry); - }); - - public static void saveConfigs() { - ITEM_CONFIG.saveChanges(); - BLOCK_CONFIG.saveChanges(); - BIOME_CONFIG.saveChanges(); - } -} +package ru.betterend.config; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import ru.betterend.BetterEnd; + +public class Configs { + public static final PathConfig ENTITY_CONFIG = new PathConfig("entities"); + public static final PathConfig BLOCK_CONFIG = new PathConfig("blocks"); + public static final PathConfig ITEM_CONFIG = new PathConfig("items"); + public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); + public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); + public static final PathConfig RECIPE_CONFIG = new PathConfig("recipes"); + + @Environment(value = EnvType.CLIENT) + public static final PathConfig CLENT_CONFIG = new PathConfig("client"); + + public static void saveConfigs() { + ENTITY_CONFIG.saveChanges(); + BLOCK_CONFIG.saveChanges(); + BIOME_CONFIG.saveChanges(); + ITEM_CONFIG.saveChanges(); + GENERATOR_CONFIG.saveChanges(); + RECIPE_CONFIG.saveChanges(); + + if (BetterEnd.isClient()) { + CLENT_CONFIG.saveChanges(); + } + } +} diff --git a/src/main/java/ru/betterend/config/EntryConfig.java b/src/main/java/ru/betterend/config/EntryConfig.java new file mode 100644 index 00000000..44ed19a2 --- /dev/null +++ b/src/main/java/ru/betterend/config/EntryConfig.java @@ -0,0 +1,10 @@ +package ru.betterend.config; + +public class EntryConfig extends IdConfig { + + public EntryConfig(String group) { + super(group, (id, entry) -> { + return new ConfigKey(entry, id); + }); + } +} diff --git a/src/main/java/ru/betterend/config/IdConfig.java b/src/main/java/ru/betterend/config/IdConfig.java index 1248b5f8..9bef635e 100644 --- a/src/main/java/ru/betterend/config/IdConfig.java +++ b/src/main/java/ru/betterend/config/IdConfig.java @@ -1,93 +1,93 @@ -package ru.betterend.config; - -import java.util.function.BiFunction; - -import org.jetbrains.annotations.Nullable; - -import net.minecraft.util.Identifier; -import ru.betterend.config.ConfigKeeper.Entry; -import ru.betterend.config.ConfigKeeper.FloatRange; -import ru.betterend.config.ConfigKeeper.IntegerRange; - -public class IdConfig extends Config { - - private final BiFunction keyFactory; - - public IdConfig(String group, BiFunction keyFactory) { - super(group); - this.keyFactory = keyFactory; - } - - @Override - protected void registerEntries() {} - - private ConfigKey createKey(Identifier id, String key) { - return this.keyFactory.apply(id, key); - } - - @Nullable - public > E getEntry(Identifier id, String key, Class type) { - return this.getEntry(createKey(id, key), type); - } - - @Nullable - public > T getDefault(Identifier id, String key, Class type) { - return this.getDefault(createKey(id, key), type); - } - - public String getString(Identifier id, String key, String defaultValue) { - return this.getString(createKey(id, key), defaultValue); - } - - public String getString(Identifier id, String key) { - return this.getString(createKey(id, key)); - } - - public boolean setString(Identifier id, String key, String value) { - return this.setString(createKey(id, key), value); - } - - public int getInt(Identifier id, String key, int defaultValue) { - return this.getInt(createKey(id, key), defaultValue); - } - - public int getInt(Identifier id, String key) { - return this.getInt(createKey(id, key)); - } - - public boolean setInt(Identifier id, String key, int value) { - return this.setInt(createKey(id, key), value); - } - - public boolean setRangedInt(Identifier id, String key, int value) { - return this.setRanged(createKey(id, key), value, IntegerRange.class); - } - - public boolean setRangedFloat(Identifier id, String key, float value) { - return this.setRanged(createKey(id, key), value, FloatRange.class); - } - - public float getFloat(Identifier id, String key, float defaultValue) { - return this.getFloat(createKey(id, key), defaultValue); - } - - public float getFloat(Identifier id, String key) { - return this.getFloat(createKey(id, key)); - } - - public boolean setFloat(Identifier id, String key, float value) { - return this.setFloat(createKey(id, key), value); - } - - public boolean getBoolean(Identifier id, String key, boolean defaultValue) { - return this.getBoolean(createKey(id, key), defaultValue); - } - - public boolean getBoolean(Identifier id, String key) { - return this.getBoolean(createKey(id, key)); - } - - public boolean setBoolean(Identifier id, String key, boolean value) { - return this.setBoolean(createKey(id, key), value); - } -} +package ru.betterend.config; + +import java.util.function.BiFunction; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.resources.ResourceLocation; +import ru.betterend.config.ConfigKeeper.Entry; +import ru.betterend.config.ConfigKeeper.FloatRange; +import ru.betterend.config.ConfigKeeper.IntegerRange; + +public class IdConfig extends Config { + + protected final BiFunction keyFactory; + + public IdConfig(String group, BiFunction keyFactory) { + super(group); + this.keyFactory = keyFactory; + } + + @Override + protected void registerEntries() {} + + protected ConfigKey createKey(ResourceLocation id, String key) { + return this.keyFactory.apply(id, key); + } + + @Nullable + public > E getEntry(ResourceLocation id, String key, Class type) { + return this.getEntry(createKey(id, key), type); + } + + @Nullable + public > T getDefault(ResourceLocation id, String key, Class type) { + return this.getDefault(createKey(id, key), type); + } + + public String getString(ResourceLocation id, String key, String defaultValue) { + return this.getString(createKey(id, key), defaultValue); + } + + public String getString(ResourceLocation id, String key) { + return this.getString(createKey(id, key)); + } + + public boolean setString(ResourceLocation id, String key, String value) { + return this.setString(createKey(id, key), value); + } + + public int getInt(ResourceLocation id, String key, int defaultValue) { + return this.getInt(createKey(id, key), defaultValue); + } + + public int getInt(ResourceLocation id, String key) { + return this.getInt(createKey(id, key)); + } + + public boolean setInt(ResourceLocation id, String key, int value) { + return this.setInt(createKey(id, key), value); + } + + public boolean setRangedInt(ResourceLocation id, String key, int value) { + return this.setRanged(createKey(id, key), value, IntegerRange.class); + } + + public boolean setRangedFloat(ResourceLocation id, String key, float value) { + return this.setRanged(createKey(id, key), value, FloatRange.class); + } + + public float getFloat(ResourceLocation id, String key, float defaultValue) { + return this.getFloat(createKey(id, key), defaultValue); + } + + public float getFloat(ResourceLocation id, String key) { + return this.getFloat(createKey(id, key)); + } + + public boolean setFloat(ResourceLocation id, String key, float value) { + return this.setFloat(createKey(id, key), value); + } + + public boolean getBoolean(ResourceLocation id, String key, boolean defaultValue) { + return this.getBoolean(createKey(id, key), defaultValue); + } + + public boolean getBoolean(ResourceLocation id, String key) { + return this.getBoolean(createKey(id, key)); + } + + public boolean setBoolean(ResourceLocation id, String key, boolean value) { + return this.setBoolean(createKey(id, key), value); + } +} diff --git a/src/main/java/ru/betterend/config/PathConfig.java b/src/main/java/ru/betterend/config/PathConfig.java new file mode 100644 index 00000000..dc3db652 --- /dev/null +++ b/src/main/java/ru/betterend/config/PathConfig.java @@ -0,0 +1,149 @@ +package ru.betterend.config; + +import org.jetbrains.annotations.Nullable; + +import ru.betterend.config.ConfigKeeper.Entry; +import ru.betterend.config.ConfigKeeper.FloatRange; +import ru.betterend.config.ConfigKeeper.IntegerRange; + +public class PathConfig extends Config { + + public PathConfig(String group) { + super(group); + } + + @Override + protected void registerEntries() {} + + protected ConfigKey createKey(String category, String key) { + return new ConfigKey(key, category.split("\\.")); + } + + protected ConfigKey createKey(String key) { + return createKey("", key); + } + + @Nullable + public > E getEntry(String category, String key, Class type) { + return this.getEntry(createKey(category, key), type); + } + + @Nullable + public > T getDefault(String category, String key, Class type) { + return this.getDefault(createKey(category, key), type); + } + + public String getString(String category, String key, String defaultValue) { + return this.getString(createKey(category, key), defaultValue); + } + + public String getString(String category, String key) { + return this.getString(createKey(category, key)); + } + + public boolean setString(String category, String key, String value) { + return this.setString(createKey(category, key), value); + } + + public int getInt(String category, String key, int defaultValue) { + return this.getInt(createKey(category, key), defaultValue); + } + + public int getInt(String category, String key) { + return this.getInt(createKey(category, key)); + } + + public boolean setInt(String category, String key, int value) { + return this.setInt(createKey(category, key), value); + } + + public boolean setRangedInt(String category, String key, int value) { + return this.setRanged(createKey(category, key), value, IntegerRange.class); + } + + public boolean setRangedFloat(String category, String key, float value) { + return this.setRanged(createKey(category, key), value, FloatRange.class); + } + + public float getFloat(String category, String key, float defaultValue) { + return this.getFloat(createKey(category, key), defaultValue); + } + + public float getFloat(String category, String key) { + return this.getFloat(createKey(category, key)); + } + + public boolean setFloat(String category, String key, float value) { + return this.setFloat(createKey(category, key), value); + } + + public boolean getBoolean(String category, String key, boolean defaultValue) { + return this.getBoolean(createKey(category, key), defaultValue); + } + + public boolean getBoolean(String category, String key) { + return this.getBoolean(createKey(category, key)); + } + + public boolean setBoolean(String category, String key, boolean value) { + return this.setBoolean(createKey(category, key), value); + } + + // From Root + + public String getStringRoot(String key, String defaultValue) { + return this.getString(createKey(key), defaultValue); + } + + public String getStringRoot(String key) { + return this.getString(createKey(key)); + } + + public boolean setStringRoot(String key, String value) { + return this.setString(createKey(key), value); + } + + public int getIntRoot(String key, int defaultValue) { + return this.getInt(createKey(key), defaultValue); + } + + public int getIntRoot(String key) { + return this.getInt(createKey(key)); + } + + public boolean setIntRoot(String key, int value) { + return this.setInt(createKey(key), value); + } + + public boolean setRangedIntRoot(String key, int value) { + return this.setRanged(createKey(key), value, IntegerRange.class); + } + + public boolean setRangedFloatRoot(String key, float value) { + return this.setRanged(createKey(key), value, FloatRange.class); + } + + public float getFloatRoot(String key, float defaultValue) { + return this.getFloat(createKey(key), defaultValue); + } + + public float getFloatRoot(String key) { + return this.getFloat(createKey(key)); + } + + public boolean setFloatRoot(String key, float value) { + return this.setFloat(createKey(key), value); + } + + public boolean getBooleanRoot(String key, boolean defaultValue) { + return this.getBoolean(createKey(key), defaultValue); + } + + public boolean getBooleanRoot(String key) { + return this.getBoolean(createKey(key)); + } + + public boolean setBooleanRoot(String key, boolean value) { + return this.setBoolean(createKey(key), value); + } +} diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/effects/EndEnchantments.java index 08474c88..6755a3de 100644 --- a/src/main/java/ru/betterend/effects/EndEnchantments.java +++ b/src/main/java/ru/betterend/effects/EndEnchantments.java @@ -1,7 +1,7 @@ package ru.betterend.effects; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.item.enchantment.Enchantment; import ru.betterend.BetterEnd; import ru.betterend.effects.enchantment.EndVeilEnchantment; diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index 521ff92a..64608d37 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -1,13 +1,13 @@ package ru.betterend.effects; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.item.Items; -import net.minecraft.potion.Potion; -import net.minecraft.potion.Potions; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.Potions; import ru.betterend.BetterEnd; -import ru.betterend.mixin.common.BrewingAccessor; +import ru.betterend.mixin.common.PotionBrewingAccessor; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -15,8 +15,8 @@ public class EndPotions { public final static Potion END_VEIL = registerPotion("end_veil", EndStatusEffects.END_VEIL, 3600); public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600); - public static Potion registerPotion(String name, StatusEffect effect, int duration) { - return registerPotion(name, new Potion(name, new StatusEffectInstance[]{ new StatusEffectInstance(effect, duration) })); + public static Potion registerPotion(String name, MobEffect effect, int duration) { + return registerPotion(name, new Potion(name, new MobEffectInstance[]{ new MobEffectInstance(effect, duration) })); } public static Potion registerPotion(String name, Potion potion) { @@ -24,8 +24,8 @@ public class EndPotions { } public static void register() { - BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); - BrewingAccessor.callRegisterPotionRecipe(END_VEIL, Items.REDSTONE, LONG_END_VEIL); - BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); + PotionBrewingAccessor.callAddMix(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); + PotionBrewingAccessor.callAddMix(END_VEIL, Items.REDSTONE, LONG_END_VEIL); + PotionBrewingAccessor.callAddMix(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); } } diff --git a/src/main/java/ru/betterend/effects/EndStatusEffects.java b/src/main/java/ru/betterend/effects/EndStatusEffects.java index 50e049ff..b5176126 100644 --- a/src/main/java/ru/betterend/effects/EndStatusEffects.java +++ b/src/main/java/ru/betterend/effects/EndStatusEffects.java @@ -1,15 +1,15 @@ package ru.betterend.effects; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.effect.MobEffect; import ru.betterend.BetterEnd; import ru.betterend.effects.status.EndVeilEffect; public class EndStatusEffects { - public final static StatusEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); + public final static MobEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); - public static StatusEffect registerEffect(String name, E effect) { - return Registry.register(Registry.STATUS_EFFECT, BetterEnd.makeID(name), effect); + public static MobEffect registerEffect(String name, E effect) { + return Registry.register(Registry.MOB_EFFECT, BetterEnd.makeID(name), effect); } } diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java index bdf29bb4..57d040e9 100644 --- a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -1,17 +1,17 @@ package ru.betterend.effects.enchantment; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentTarget; -import net.minecraft.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; public class EndVeilEnchantment extends Enchantment { public EndVeilEnchantment() { - super(Enchantment.Rarity.VERY_RARE, EnchantmentTarget.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); + super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); } @Override - public boolean isAvailableForRandomSelection() { + public boolean isDiscoverable() { return false; } } diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index 98e2d8ee..eff6cbb3 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -1,16 +1,16 @@ package ru.betterend.effects.status; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectType; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; -public class EndVeilEffect extends StatusEffect { +public class EndVeilEffect extends MobEffect { public EndVeilEffect() { - super(StatusEffectType.BENEFICIAL, 0x0D554A); + super(MobEffectCategory.BENEFICIAL, 0x0D554A); } @Override - public boolean canApplyUpdateEffect(int duration, int amplifier) { + public boolean isDurationEffectTick(int duration, int amplifier) { return false; } } diff --git a/src/main/java/ru/betterend/entity/BlockBenchModel.java b/src/main/java/ru/betterend/entity/BlockBenchModel.java deleted file mode 100644 index 0c3ad64b..00000000 --- a/src/main/java/ru/betterend/entity/BlockBenchModel.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.entity; - -import java.util.function.Function; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - -public abstract class BlockBenchModel extends EntityModel { - public BlockBenchModel() { - super(); - } - - public BlockBenchModel(Function function) { - super(function); - } - - protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { - modelRenderer.pitch = x; - modelRenderer.yaw = y; - modelRenderer.roll = z; - } -} diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java new file mode 100644 index 00000000..7b2e0cae --- /dev/null +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -0,0 +1,194 @@ +package ru.betterend.entity; + +import java.util.List; +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundGameEventPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.animal.AbstractSchoolingFish; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndItems; + +public class CubozoaEntity extends AbstractSchoolingFish { + public static final int VARIANTS = 2; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); + + public CubozoaEntity(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + this.entityData.set(VARIANT, (byte) 1); + } + + if (entityTag != null) { + if (entityTag.contains("Variant")) { + this.entityData.set(VARIANT, entityTag.getByte("Variant")); + } + if (entityTag.contains("Scale")) { + this.entityData.set(SCALE, entityTag.getByte("Scale")); + } + } + + this.refreshDimensions(); + return data; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) 0); + this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putByte("Variant", (byte) getVariant()); + tag.putByte("Scale", getByteScale()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("Variant")) { + this.entityData.set(VARIANT, tag.getByte("Variant")); + } + if (tag.contains("Scale")) { + this.entityData.set(SCALE, tag.getByte("Scale")); + } + } + + @Override + protected ItemStack getBucketItemStack() { + ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("Variant", entityData.get(VARIANT)); + tag.putByte("Scale", entityData.get(SCALE)); + return bucket; + } + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.5); + } + + public int getVariant() { + return (int) this.entityData.get(VARIANT); + } + + public byte getByteScale() { + return this.entityData.get(SCALE); + } + + public float getScale() { + return getByteScale() / 32F + 0.75F; + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + AABB box = new AABB(pos).inflate(16); + List list = world.getEntitiesOfClass(CubozoaEntity.class, box, (entity) -> { + return true; + }); + return list.size() < 9; + } + + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + return dimensions.height * 0.5F; + } + + @Override + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { + int count = random.nextInt(3); + if (count > 0) { + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.GELATINE, count)); + this.level.addFreshEntity(drop); + } + } + + @Override + protected SoundEvent getFlopSound() { + return SoundEvents.SALMON_FLOP; + } + + @Override + public void playerTouch(Player player) { + if (player instanceof ServerPlayer && player.hurt(DamageSource.mobAttack(this), 0.5F)) { + if (!this.isSilent()) { + ((ServerPlayer) player).connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.PUFFER_FISH_STING, 0.0F)); + } + if (random.nextBoolean()) { + player.addEffect(new MobEffectInstance(MobEffects.POISON, 20, 0)); + } + } + } + + static class CubozoaMoveControl extends MoveControl { + CubozoaMoveControl(CubozoaEntity owner) { + super(owner); + } + + public void tick() { + if (this.mob.isEyeInFluid(FluidTags.WATER)) { + this.mob.setDeltaMovement(this.mob.getDeltaMovement().add(0.0D, 0.005D, 0.0D)); + } + + if (this.operation == MoveControl.Operation.MOVE_TO && !this.mob.getNavigation().isDone()) { + float f = (float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.mob.setSpeed(Mth.lerp(0.125F, this.mob.getSpeed(), f)); + double d = this.wantedX - this.mob.getX(); + double e = this.wantedY - this.mob.getY(); + double g = this.wantedZ - this.mob.getZ(); + if (e != 0.0D) { + double h = (double) Mth.sqrt(d * d + e * e + g * g); + this.mob.setDeltaMovement(this.mob.getDeltaMovement().add(0.0D, (double) this.mob.getSpeed() * (e / h) * 0.1D, 0.0D)); + } + + if (d != 0.0D || g != 0.0D) { + float i = (float) (Mth.atan2(g, d) * 57.2957763671875D) - 90.0F; + this.mob.yRot = this.rotlerp(this.mob.yRot, i, 90.0F); + this.mob.yBodyRot = this.mob.yRot; + } + + } + else { + this.mob.setSpeed(0.0F); + } + } + } +} diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java new file mode 100644 index 00000000..b5e7a5b3 --- /dev/null +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -0,0 +1,205 @@ +package ru.betterend.entity; + +import java.util.EnumSet; +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.control.LookControl; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.phys.Vec3; +import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndSounds; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class DragonflyEntity extends Animal implements FlyingAnimal { + public DragonflyEntity(EntityType entityType, Level world) { + super(entityType, world); + this.moveControl = new FlyingMoveControl(this, 20, true); + this.lookControl = new DragonflyLookControl(this); + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); + this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); + this.xpReward = 1; + } + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 8.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 1.0D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); + } + + @Override + public Entity getLeashHolder() { + return null; + } + + @Override + protected PathNavigation createNavigation(Level world) { + FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { + public boolean isStableDestination(BlockPos pos) { + BlockState state = this.level.getBlockState(pos); + return state.isAir() || !state.getMaterial().blocksMotion(); + } + + public void tick() { + super.tick(); + } + }; + birdNavigation.setCanOpenDoors(false); + birdNavigation.setCanFloat(false); + birdNavigation.setCanPassDoors(true); + return birdNavigation; + } + + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader world) { + return world.getBlockState(pos).isAir() ? 10.0F : 0.0F; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new FollowParentGoal(this, 1.0D)); + this.goalSelector.addGoal(4, new WanderAroundGoal()); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + protected boolean makeFlySound() { + return true; + } + + @Override + public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + return false; + } + + @Override + public boolean isMovementNoisy() { + return false; + } + + @Override + public boolean isNoGravity() { + return true; + } + + @Override + public SoundEvent getAmbientSound() { + return EndSounds.ENTITY_DRAGONFLY; + } + + @Override + protected float getSoundVolume() { + return MHelper.randRange(0.25F, 0.5F, random); + } + + class DragonflyLookControl extends LookControl { + DragonflyLookControl(Mob entity) { + super(entity); + } + + protected boolean resetXRotOnTick() { + return true; + } + } + + class WanderAroundGoal extends Goal { + WanderAroundGoal() { + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + public boolean canUse() { + return DragonflyEntity.this.navigation.isDone() && DragonflyEntity.this.random.nextInt(10) == 0; + } + + public boolean canContinueToUse() { + return DragonflyEntity.this.navigation.isInProgress(); + } + + public void start() { + Vec3 vec3d = this.getRandomLocation(); + if (vec3d != null) { + BlockPos pos = new BlockPos(vec3d); + try { + Path path = DragonflyEntity.this.navigation.createPath(pos, 1); + if (path != null) { + DragonflyEntity.this.navigation.moveTo(path, 1.0D); + } + } + catch (Exception e) {} + } + super.start(); + } + + private Vec3 getRandomLocation() { + int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16); + Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F); + Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); + if (airPos != null) { + if (isInVoid(airPos)) { + for (int i = 0; i < 8; i++) { + airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); + if (airPos != null && !isInVoid(airPos)) { + return airPos; + } + } + return null; + } + if (h > 5 && airPos.y() >= DragonflyEntity.this.blockPosition().getY()) { + airPos = new Vec3(airPos.x, airPos.y - h * 0.5, airPos.z); + } + return airPos; + } + return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); + } + + private boolean isInVoid(Vec3 pos) { + int h = BlocksHelper.downRay(DragonflyEntity.this.level, new BlockPos(pos), 128); + return h > 100; + } + } + + @Override + public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + return EndEntities.DRAGONFLY.create(world); + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + return y > 0 && pos.getY() >= y; + } +} diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java new file mode 100644 index 00000000..ce9a04d9 --- /dev/null +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -0,0 +1,159 @@ +package ru.betterend.entity; + +import java.util.List; +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.AbstractSchoolingFish; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndItems; + +public class EndFishEntity extends AbstractSchoolingFish { + public static final int VARIANTS_NORMAL = 5; + public static final int VARIANTS_SULPHUR = 3; + public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); + + public EndFishEntity(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + this.entityData.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); + } + + if (entityTag != null) { + if (entityTag.contains("Variant")) { + this.entityData.set(VARIANT, entityTag.getByte("variant")); + } + if (entityTag.contains("Scale")) { + this.entityData.set(SCALE, entityTag.getByte("scale")); + } + } + + this.refreshDimensions(); + return data; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); + this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putByte("Variant", (byte) getVariant()); + tag.putByte("Scale", getByteScale()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("Variant")) { + this.entityData.set(VARIANT, tag.getByte("Variant")); + } + if (tag.contains("Scale")) { + this.entityData.set(SCALE, tag.getByte("Scale")); + } + } + + @Override + protected ItemStack getBucketItemStack() { + ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("variant", entityData.get(VARIANT)); + tag.putByte("scale", entityData.get(SCALE)); + return bucket; + } + + @Override + protected SoundEvent getFlopSound() { + return SoundEvents.TROPICAL_FISH_FLOP; + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.SALMON_AMBIENT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.SALMON_DEATH; + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return SoundEvents.SALMON_HURT; + } + + @Override + public void tick() { + super.tick(); + if (random.nextInt(8) == 0 && getFeetBlockState().is(Blocks.WATER)) { + double x = getX() + random.nextGaussian() * 0.2; + double y = getY() + random.nextGaussian() * 0.2; + double z = getZ() + random.nextGaussian() * 0.2; + level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); + } + } + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.75); + } + + public int getVariant() { + return (int) this.entityData.get(VARIANT); + } + + public byte getByteScale() { + return this.entityData.get(SCALE); + } + + public float getScale() { + return getByteScale() / 32F + 0.75F; + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + AABB box = new AABB(pos).inflate(16); + List list = world.getEntitiesOfClass(EndFishEntity.class, box, (entity) -> { return true; }); + return list.size() < 9; + } + + @Override + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); + this.level.addFreshEntity(drop); + } +} diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java new file mode 100644 index 00000000..beaea327 --- /dev/null +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -0,0 +1,415 @@ +package ru.betterend.entity; + +import java.util.EnumSet; +import java.util.List; +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.IronGolem; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import ru.betterend.interfaces.ISlime; +import ru.betterend.registry.EndBiomes; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndBiome; + +public class EndSlimeEntity extends Slime { + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndSlimeEntity.class, EntityDataSerializers.BYTE); + private static final MutableBlockPos POS = new MutableBlockPos(); + + public EndSlimeEntity(EntityType entityType, Level world) { + super(entityType, world); + this.moveControl = new EndSlimeMoveControl(this); + } + + protected void registerGoals() { + this.goalSelector.addGoal(1, new SwimmingGoal()); + this.goalSelector.addGoal(2, new FaceTowardTargetGoal()); + this.goalSelector.addGoal(3, new RandomLookGoal()); + this.goalSelector.addGoal(5, new MoveGoal()); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { + return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; + })); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, IronGolem.class, true)); + } + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.MOVEMENT_SPEED, 0.15D); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + EndBiome biome = EndBiomes.getFromBiome(world.getBiome(blockPosition())); + if (biome == EndBiomes.FOGGY_MUSHROOMLAND) { + this.setMossy(); + } + else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { + this.setLake(); + } + else if (biome == EndBiomes.AMBER_LAND) { + this.setAmber(true); + } + this.refreshDimensions(); + return data; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) 0); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putByte("Variant", (byte) getSlimeType()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("Variant")) { + this.entityData.set(VARIANT, tag.getByte("Variant")); + } + } + + @Override + protected ParticleOptions getParticleType() { + return ParticleTypes.PORTAL; + } + + @Override + public void remove() { + int i = this.getSize(); + if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { + Component text = this.getCustomName(); + boolean bl = this.isNoAi(); + float f = (float) i / 4.0F; + int j = i / 2; + int k = 2 + this.random.nextInt(3); + int type = this.getSlimeType(); + + for (int l = 0; l < k; ++l) { + float g = ((float) (l % 2) - 0.5F) * f; + float h = ((float) (l / 2) - 0.5F) * f; + EndSlimeEntity slimeEntity = (EndSlimeEntity) this.getType().create(this.level); + if (this.isPersistenceRequired()) { + slimeEntity.setPersistenceRequired(); + } + + slimeEntity.setSlimeType(type); + slimeEntity.setCustomName(text); + slimeEntity.setNoAi(bl); + slimeEntity.setInvulnerable(this.isInvulnerable()); + ((ISlime) slimeEntity).be_setSlimeSize(j, true); + slimeEntity.refreshDimensions(); + slimeEntity.moveTo(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); + this.level.addFreshEntity(slimeEntity); + } + } + this.removed = true; + } + + @Override + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { + int maxCount = this.getSize(); + int minCount = maxCount >> 1; + if (minCount < 1) { + minCount = 1; + } + if (causedByPlayer && this.lastHurtByPlayer != null) { + int looting = EnchantmentHelper.getMobLooting(this.lastHurtByPlayer); + minCount += looting; + } + int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); + this.level.addFreshEntity(drop); + } + + public int getSlimeType() { + return this.entityData.get(VARIANT).intValue(); + } + + public void setSlimeType(int value) { + this.entityData.set(VARIANT, (byte) value); + } + + protected void setMossy() { + setSlimeType(1); + } + + public boolean isMossy() { + return getSlimeType() == 1; + } + + protected void setLake() { + setSlimeType(2); + } + + public boolean isLake() { + return getSlimeType() == 2; + } + + protected void setAmber(boolean mossy) { + this.entityData.set(VARIANT, (byte) 3); + } + + public boolean isAmber() { + return this.entityData.get(VARIANT) == 3; + } + + public boolean isChorus() { + return this.entityData.get(VARIANT) == 0; + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + } + + private static boolean isPermanentBiome(ServerLevelAccessor world, BlockPos pos) { + Biome biome = world.getBiome(pos); + return EndBiomes.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; + } + + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { + AABB box = new AABB(pos).inflate(radius); + List list = world.getEntitiesOfClass(EndSlimeEntity.class, box, (entity) -> { return true; }); + return list.size() <= maxCount; + } + + private static boolean isWaterNear(ServerLevelAccessor world, BlockPos pos, int radius, int radius2) { + for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { + POS.setX(x); + for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; z++) { + POS.setZ(z); + for (int y = pos.getY() - radius2; y <= pos.getY() + radius2; y++) { + POS.setY(y); + if (world.getBlockState(POS).getBlock() == Blocks.WATER) { + return true; + } + } + } + } + return false; + } + + class MoveGoal extends Goal { + public MoveGoal() { + this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); + } + + public boolean canUse() { + if (EndSlimeEntity.this.isPassenger()) { + return false; + } + + float yaw = EndSlimeEntity.this.getYHeadRot(); + float speed = EndSlimeEntity.this.getSpeed(); + if (speed > 0.1) { + float dx = Mth.sin(-yaw * 0.017453292F); + float dz = Mth.cos(-yaw * 0.017453292F); + BlockPos pos = EndSlimeEntity.this.blockPosition().offset(dx * speed * 4, 0, dz * speed * 4); + int down = BlocksHelper.downRay(EndSlimeEntity.this.level, pos, 16); + return down < 5; + } + + return true; + } + + public void tick() { + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.0D); + } + } + + class SwimmingGoal extends Goal { + public SwimmingGoal() { + this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); + EndSlimeEntity.this.getNavigation().setCanFloat(true); + } + + public boolean canUse() { + return (EndSlimeEntity.this.isInWater() + || EndSlimeEntity.this.isInLava()) + && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + } + + public void tick() { + if (EndSlimeEntity.this.getRandom().nextFloat() < 0.8F) { + EndSlimeEntity.this.getJumpControl().jump(); + } + + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.2D); + } + } + + class RandomLookGoal extends Goal { + private float targetYaw; + private int timer; + + public RandomLookGoal() { + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); + } + + public boolean canUse() { + return EndSlimeEntity.this.getTarget() == null + && (EndSlimeEntity.this.onGround + || EndSlimeEntity.this.isInWater() + || EndSlimeEntity.this.isInLava() + || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) + && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + } + + public void tick() { + if (--this.timer <= 0) { + this.timer = 40 + EndSlimeEntity.this.getRandom().nextInt(60); + this.targetYaw = (float) EndSlimeEntity.this.getRandom().nextInt(360); + } + + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(this.targetYaw, false); + } + } + + class FaceTowardTargetGoal extends Goal { + private int ticksLeft; + + public FaceTowardTargetGoal() { + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); + } + + public boolean canUse() { + LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); + if (livingEntity == null) { + return false; + } + else if (!livingEntity.isAlive()) { + return false; + } + else { + return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + } + } + + public void start() { + this.ticksLeft = 300; + super.start(); + } + + public boolean canContinueToUse() { + LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); + if (livingEntity == null) { + return false; + } + else if (!livingEntity.isAlive()) { + return false; + } + else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { + return false; + } + else { + return --this.ticksLeft > 0; + } + } + + public void tick() { + EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage()); + } + } + + class EndSlimeMoveControl extends MoveControl { + private float targetYaw; + private int ticksUntilJump; + private boolean jumpOften; + + public EndSlimeMoveControl(EndSlimeEntity slime) { + super(slime); + this.targetYaw = 180.0F * slime.yRot / 3.1415927F; + } + + public void look(float targetYaw, boolean jumpOften) { + this.targetYaw = targetYaw; + this.jumpOften = jumpOften; + } + + public void move(double speed) { + this.speedModifier = speed; + this.operation = MoveControl.Operation.MOVE_TO; + } + + public void tick() { + this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F); + this.mob.yHeadRot = this.mob.yRot; + this.mob.yBodyRot = this.mob.yRot; + if (this.operation != MoveControl.Operation.MOVE_TO) { + this.mob.setZza(0.0F); + } + else { + this.operation = MoveControl.Operation.WAIT; + if (this.mob.isOnGround()) { + this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); + if (this.ticksUntilJump-- <= 0) { + this.ticksUntilJump = EndSlimeEntity.this.getJumpDelay(); + if (this.jumpOften) { + this.ticksUntilJump /= 3; + } + + EndSlimeEntity.this.getJumpControl().jump(); + if (EndSlimeEntity.this.doPlayJumpSound()) { + EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); + } + } + else { + EndSlimeEntity.this.xxa = 0.0F; + EndSlimeEntity.this.zza = 0.0F; + this.mob.setSpeed(0.0F); + } + } + else { + this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); + } + + } + } + + private float getJumpSoundPitch() { + float f = EndSlimeEntity.this.isTiny() ? 1.4F : 0.8F; + return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) * f; + } + } +} diff --git a/src/main/java/ru/betterend/entity/EntityCubozoa.java b/src/main/java/ru/betterend/entity/EntityCubozoa.java deleted file mode 100644 index e2cf0812..00000000 --- a/src/main/java/ru/betterend/entity/EntityCubozoa.java +++ /dev/null @@ -1,177 +0,0 @@ -package ru.betterend.entity; - -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.control.MoveControl; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.passive.SchoolingFishEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndItems; - -public class EntityCubozoa extends SchoolingFishEntity { - public static final int VARIANTS = 2; - private static final TrackedData VARIANT = DataTracker.registerData(EntityCubozoa.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EntityCubozoa.class, TrackedDataHandlerRegistry.BYTE); - - public EntityCubozoa(EntityType entityType, World world) { - super(entityType, world); - //this.moveControl = new CubozoaMoveControl(this); - } - - @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { - this.dataTracker.set(VARIANT, (byte) 1); - } - this.calculateDimensions(); - return data; - } - - @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(VARIANT, (byte) 0); - this.dataTracker.startTracking(SCALE, (byte) this.getRandom().nextInt(16)); - } - - @Override - public void writeCustomDataToTag(CompoundTag tag) { - super.writeCustomDataToTag(tag); - tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); - } - - @Override - public void readCustomDataFromTag(CompoundTag tag) { - super.readCustomDataFromTag(tag); - if (tag.contains("Variant")) { - this.dataTracker.set(VARIANT, tag.getByte("Variant")); - } - if (tag.contains("Scale")) { - this.dataTracker.set(SCALE, tag.getByte("Scale")); - } - } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.5); - } - - public int getVariant() { - return (int) this.dataTracker.get(VARIANT); - } - - public float getScale() { - return this.dataTracker.get(SCALE) / 32F + 0.75F; - } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EntityCubozoa.class, box, (entity) -> { - return true; - }); - return list.size() < 9; - } - - protected float getActiveEyeHeight(EntityPose pose, EntityDimensions dimensions) { - return dimensions.height * 0.5F; - } - - @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { - int count = random.nextInt(3); - if (count > 0) { - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.GELATINE, count)); - this.world.spawnEntity(drop); - } - } - - @Override - protected ItemStack getFishBucketItem() { - return new ItemStack(Items.WATER_BUCKET); - } - - @Override - protected SoundEvent getFlopSound() { - return SoundEvents.ENTITY_SALMON_FLOP; - } - - @Override - public void onPlayerCollision(PlayerEntity player) { - if (player instanceof ServerPlayerEntity && player.damage(DamageSource.mob(this), 0.5F)) { - if (!this.isSilent()) { - ((ServerPlayerEntity) player).networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.PUFFERFISH_STING, 0.0F)); - } - if (random.nextBoolean()) { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 20, 0)); - } - } - } - - static class CubozoaMoveControl extends MoveControl { - CubozoaMoveControl(EntityCubozoa owner) { - super(owner); - } - - public void tick() { - if (this.entity.isSubmergedIn(FluidTags.WATER)) { - this.entity.setVelocity(this.entity.getVelocity().add(0.0D, 0.005D, 0.0D)); - } - - if (this.state == MoveControl.State.MOVE_TO && !this.entity.getNavigation().isIdle()) { - float f = (float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)); - this.entity.setMovementSpeed(MathHelper.lerp(0.125F, this.entity.getMovementSpeed(), f)); - double d = this.targetX - this.entity.getX(); - double e = this.targetY - this.entity.getY(); - double g = this.targetZ - this.entity.getZ(); - if (e != 0.0D) { - double h = (double) MathHelper.sqrt(d * d + e * e + g * g); - this.entity.setVelocity(this.entity.getVelocity().add(0.0D, (double) this.entity.getMovementSpeed() * (e / h) * 0.1D, 0.0D)); - } - - if (d != 0.0D || g != 0.0D) { - float i = (float) (MathHelper.atan2(g, d) * 57.2957763671875D) - 90.0F; - this.entity.yaw = this.changeAngle(this.entity.yaw, i, 90.0F); - this.entity.bodyYaw = this.entity.yaw; - } - - } - else { - this.entity.setMovementSpeed(0.0F); - } - } - } -} diff --git a/src/main/java/ru/betterend/entity/EntityDragonfly.java b/src/main/java/ru/betterend/entity/EntityDragonfly.java deleted file mode 100644 index 7ab75ce0..00000000 --- a/src/main/java/ru/betterend/entity/EntityDragonfly.java +++ /dev/null @@ -1,190 +0,0 @@ -package ru.betterend.entity; - -import java.util.EnumSet; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.Flutterer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.TargetFinder; -import net.minecraft.entity.ai.control.FlightMoveControl; -import net.minecraft.entity.ai.control.LookControl; -import net.minecraft.entity.ai.goal.AnimalMateGoal; -import net.minecraft.entity.ai.goal.FollowParentGoal; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.SwimGoal; -import net.minecraft.entity.ai.pathing.BirdNavigation; -import net.minecraft.entity.ai.pathing.EntityNavigation; -import net.minecraft.entity.ai.pathing.Path; -import net.minecraft.entity.ai.pathing.PathNodeType; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; -import ru.betterend.registry.EndEntities; -import ru.betterend.registry.EndSounds; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class EntityDragonfly extends AnimalEntity implements Flutterer { - public EntityDragonfly(EntityType entityType, World world) { - super(entityType, world); - this.moveControl = new FlightMoveControl(this, 20, true); - this.lookControl = new DragonflyLookControl(this); - this.setPathfindingPenalty(PathNodeType.WATER, -1.0F); - this.setPathfindingPenalty(PathNodeType.DANGER_FIRE, -1.0F); - this.experiencePoints = 1; - } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 8.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) - .add(EntityAttributes.GENERIC_FLYING_SPEED, 1.0D) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); - } - - @Override - protected EntityNavigation createNavigation(World world) { - BirdNavigation birdNavigation = new BirdNavigation(this, world) { - public boolean isValidPosition(BlockPos pos) { - BlockState state = this.world.getBlockState(pos); - return state.isAir() || !state.getMaterial().blocksMovement(); - } - - public void tick() { - super.tick(); - } - }; - birdNavigation.setCanPathThroughDoors(false); - birdNavigation.setCanSwim(false); - birdNavigation.setCanEnterOpenDoors(true); - return birdNavigation; - } - - @Override - public float getPathfindingFavor(BlockPos pos, WorldView world) { - return world.getBlockState(pos).isAir() ? 10.0F : 0.0F; - } - - @Override - protected void initGoals() { - this.goalSelector.add(1, new SwimGoal(this)); - this.goalSelector.add(2, new AnimalMateGoal(this, 1.0D)); - this.goalSelector.add(3, new FollowParentGoal(this, 1.0D)); - this.goalSelector.add(4, new WanderAroundGoal()); - } - - @Override - public boolean isPushable() { - return false; - } - - @Override - protected boolean hasWings() { - return true; - } - - @Override - public boolean handleFallDamage(float fallDistance, float damageMultiplier) { - return false; - } - - @Override - public boolean canClimb() { - return false; - } - - @Override - public boolean hasNoGravity() { - return true; - } - - @Override - public SoundEvent getAmbientSound() { - return EndSounds.ENTITY_DRAGONFLY; - } - - @Override - protected float getSoundVolume() { - return MHelper.randRange(0.25F, 0.5F, random); - } - - class DragonflyLookControl extends LookControl { - DragonflyLookControl(MobEntity entity) { - super(entity); - } - - protected boolean shouldStayHorizontal() { - return true; - } - } - - class WanderAroundGoal extends Goal { - WanderAroundGoal() { - this.setControls(EnumSet.of(Goal.Control.MOVE)); - } - - public boolean canStart() { - return EntityDragonfly.this.navigation.isIdle() && EntityDragonfly.this.random.nextInt(10) == 0; - } - - public boolean shouldContinue() { - return EntityDragonfly.this.navigation.isFollowingPath(); - } - - public void start() { - Vec3d vec3d = this.getRandomLocation(); - if (vec3d != null) { - BlockPos pos = new BlockPos(vec3d); - try { - Path path = EntityDragonfly.this.navigation.findPathTo(pos, 1); - if (path != null) { - EntityDragonfly.this.navigation.startMovingAlong(path, 1.0D); - } - } - catch (Exception e) {} - } - super.start(); - } - - private Vec3d getRandomLocation() { - int h = BlocksHelper.downRay(EntityDragonfly.this.world, EntityDragonfly.this.getBlockPos(), 16); - Vec3d rotation = EntityDragonfly.this.getRotationVec(0.0F); - Vec3d airPos = TargetFinder.findAirTarget(EntityDragonfly.this, 8, 7, rotation, 1.5707964F, 2, 1); - if (airPos != null) { - if (isInVoid(airPos)) { - for (int i = 0; i < 8; i++) { - airPos = TargetFinder.findAirTarget(EntityDragonfly.this, 16, 7, rotation, MHelper.PI2, 2, 1); - if (airPos != null && !isInVoid(airPos)) { - return airPos; - } - } - return null; - } - if (h > 5 && airPos.getY() >= EntityDragonfly.this.getBlockPos().getY()) { - airPos = new Vec3d(airPos.x, airPos.y - h * 0.5, airPos.z); - } - return airPos; - } - return TargetFinder.findGroundTarget(EntityDragonfly.this, 8, 4, -2, rotation, 1.5707963705062866D); - } - - private boolean isInVoid(Vec3d pos) { - int h = BlocksHelper.downRay(EntityDragonfly.this.world, new BlockPos(pos), 128); - return h > 100; - } - } - - @Override - public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { - return EndEntities.DRAGONFLY.create(world); - } -} diff --git a/src/main/java/ru/betterend/entity/EntityEndFish.java b/src/main/java/ru/betterend/entity/EntityEndFish.java deleted file mode 100644 index 27f74725..00000000 --- a/src/main/java/ru/betterend/entity/EntityEndFish.java +++ /dev/null @@ -1,140 +0,0 @@ -package ru.betterend.entity; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.passive.SchoolingFishEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndItems; - -public class EntityEndFish extends SchoolingFishEntity { - public static final int VARIANTS_NORMAL = 5; - public static final int VARIANTS_SULPHUR = 3; - public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; - private static final TrackedData VARIANT = DataTracker.registerData(EntityEndFish.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EntityEndFish.class, TrackedDataHandlerRegistry.BYTE); - - public EntityEndFish(EntityType entityType, World world) { - super(entityType, world); - } - - @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { - this.dataTracker.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); - } - this.calculateDimensions(); - return data; - } - - @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); - this.dataTracker.startTracking(SCALE, (byte) this.getRandom().nextInt(16)); - } - - @Override - public void writeCustomDataToTag(CompoundTag tag) { - super.writeCustomDataToTag(tag); - tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); - } - - @Override - public void readCustomDataFromTag(CompoundTag tag) { - super.readCustomDataFromTag(tag); - if (tag.contains("Variant")) { - this.dataTracker.set(VARIANT, tag.getByte("Variant")); - } - if (tag.contains("Scale")) { - this.dataTracker.set(SCALE, tag.getByte("Scale")); - } - } - - @Override - protected ItemStack getFishBucketItem() { - return new ItemStack(EndItems.BUCKET_END_FISH); - } - - @Override - protected SoundEvent getFlopSound() { - return SoundEvents.ENTITY_TROPICAL_FISH_FLOP; - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_SALMON_AMBIENT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_SALMON_DEATH; - } - - @Override - protected SoundEvent getHurtSound(DamageSource source) { - return SoundEvents.ENTITY_SALMON_HURT; - } - - @Override - public void tick() { - super.tick(); - if (random.nextInt(8) == 0 && getBlockState().isOf(Blocks.WATER)) { - double x = getX() + random.nextGaussian() * 0.2; - double y = getY() + random.nextGaussian() * 0.2; - double z = getZ() + random.nextGaussian() * 0.2; - world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); - } - } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.75); - } - - public int getVariant() { - return (int) this.dataTracker.get(VARIANT); - } - - public float getScale() { - return this.dataTracker.get(SCALE) / 32F + 0.75F; - } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EntityEndFish.class, box, (entity) -> { return true; }); - return list.size() < 9; - } - - @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); - this.world.spawnEntity(drop); - } -} diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java deleted file mode 100644 index 077981e7..00000000 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ /dev/null @@ -1,365 +0,0 @@ -package ru.betterend.entity; - -import java.util.EnumSet; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.control.MoveControl; -import net.minecraft.entity.ai.goal.FollowTargetGoal; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.entity.passive.IronGolemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import ru.betterend.interfaces.ISlime; -import ru.betterend.registry.EndBiomes; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class EntityEndSlime extends SlimeEntity { - private static final TrackedData MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final Mutable POS = new Mutable(); - - public EntityEndSlime(EntityType entityType, World world) { - super(entityType, world); - this.moveControl = new EndSlimeMoveControl(this); - } - - protected void initGoals() { - this.goalSelector.add(1, new SwimmingGoal()); - this.goalSelector.add(2, new FaceTowardTargetGoal()); - this.goalSelector.add(3, new RandomLookGoal()); - this.goalSelector.add(5, new MoveGoal()); - this.targetSelector.add(1, new FollowTargetGoal(this, PlayerEntity.class, 10, true, false, (livingEntity) -> { - return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; - })); - this.targetSelector.add(3, new FollowTargetGoal(this, IronGolemEntity.class, true)); - } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 1.0D) - .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15D); - } - - @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.FOGGY_MUSHROOMLAND) { - this.setMossy(true); - } - this.calculateDimensions(); - return data; - } - - @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(MOSSY, false); - } - - @Override - protected ParticleEffect getParticles() { - return ParticleTypes.PORTAL; - } - - @Override - public void remove() { - int i = this.getSize(); - if (!this.world.isClient && i > 1 && this.isDead()) { - Text text = this.getCustomName(); - boolean bl = this.isAiDisabled(); - float f = (float) i / 4.0F; - int j = i / 2; - int k = 2 + this.random.nextInt(3); - boolean mossy = this.isMossy(); - - for (int l = 0; l < k; ++l) { - float g = ((float) (l % 2) - 0.5F) * f; - float h = ((float) (l / 2) - 0.5F) * f; - EntityEndSlime slimeEntity = (EntityEndSlime) this.getType().create(this.world); - if (this.isPersistent()) { - slimeEntity.setPersistent(); - } - - slimeEntity.setMossy(mossy); - slimeEntity.setCustomName(text); - slimeEntity.setAiDisabled(bl); - slimeEntity.setInvulnerable(this.isInvulnerable()); - ((ISlime) slimeEntity).setSlimeSize(j, true); - slimeEntity.calculateDimensions(); - slimeEntity.refreshPositionAndAngles(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); - this.world.spawnEntity(slimeEntity); - } - } - this.removed = true; - } - - @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { - int maxCount = this.getSize(); - int minCount = maxCount >> 1; - if (minCount < 1) { - minCount = 1; - } - if (causedByPlayer && this.attackingPlayer != null) { - int looting = EnchantmentHelper.getLooting(this.attackingPlayer); - minCount += looting; - } - int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); - this.world.spawnEntity(drop); - } - - protected void setMossy(boolean mossy) { - this.dataTracker.set(MOSSY, mossy); - } - - public boolean isMossy() { - return this.dataTracker.get(MOSSY); - } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - return isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); - } - - private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { - Biome biome = world.getBiome(pos); - return EndBiomes.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; - } - - private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { - Box box = new Box(pos).expand(radius); - List list = world.getEntitiesByClass(EntityEndSlime.class, box, (entity) -> { return true; }); - return list.size() <= maxCount; - } - - private static boolean isWaterNear(ServerWorldAccess world, BlockPos pos, int radius, int radius2) { - for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { - POS.setX(x); - for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; z++) { - POS.setZ(z); - for (int y = pos.getY() - radius2; y <= pos.getY() + radius2; y++) { - POS.setY(y); - if (world.getBlockState(POS).getBlock() == Blocks.WATER) { - return true; - } - } - } - } - return false; - } - - class MoveGoal extends Goal { - public MoveGoal() { - this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); - } - - public boolean canStart() { - if (EntityEndSlime.this.hasVehicle()) { - return false; - } - - float yaw = EntityEndSlime.this.getHeadYaw(); - float speed = EntityEndSlime.this.getMovementSpeed(); - if (speed > 0.1) { - float dx = MathHelper.sin(-yaw * 0.017453292F - 3.1415927F); - float dz = MathHelper.cos(-yaw * 0.017453292F - 3.1415927F); - BlockPos pos = EntityEndSlime.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); - int down = BlocksHelper.downRay(EntityEndSlime.this.world, pos, 16); - return down < 5; - } - - return true; - } - - public void tick() { - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).move(1.0D); - } - } - - class SwimmingGoal extends Goal { - public SwimmingGoal() { - this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); - EntityEndSlime.this.getNavigation().setCanSwim(true); - } - - public boolean canStart() { - return (EntityEndSlime.this.isTouchingWater() - || EntityEndSlime.this.isInLava()) - && EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; - } - - public void tick() { - if (EntityEndSlime.this.getRandom().nextFloat() < 0.8F) { - EntityEndSlime.this.getJumpControl().setActive(); - } - - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).move(1.2D); - } - } - - class RandomLookGoal extends Goal { - private float targetYaw; - private int timer; - - public RandomLookGoal() { - this.setControls(EnumSet.of(Goal.Control.LOOK)); - } - - public boolean canStart() { - return EntityEndSlime.this.getTarget() == null - && (EntityEndSlime.this.onGround - || EntityEndSlime.this.isTouchingWater() - || EntityEndSlime.this.isInLava() - || EntityEndSlime.this.hasStatusEffect(StatusEffects.LEVITATION)) - && EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; - } - - public void tick() { - if (--this.timer <= 0) { - this.timer = 40 + EntityEndSlime.this.getRandom().nextInt(60); - this.targetYaw = (float) EntityEndSlime.this.getRandom().nextInt(360); - } - - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).look(this.targetYaw, false); - } - } - - class FaceTowardTargetGoal extends Goal { - private int ticksLeft; - - public FaceTowardTargetGoal() { - this.setControls(EnumSet.of(Goal.Control.LOOK)); - } - - public boolean canStart() { - LivingEntity livingEntity = EntityEndSlime.this.getTarget(); - if (livingEntity == null) { - return false; - } - else if (!livingEntity.isAlive()) { - return false; - } - else { - return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable ? false : EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; - } - } - - public void start() { - this.ticksLeft = 300; - super.start(); - } - - public boolean shouldContinue() { - LivingEntity livingEntity = EntityEndSlime.this.getTarget(); - if (livingEntity == null) { - return false; - } - else if (!livingEntity.isAlive()) { - return false; - } - else if (livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable) { - return false; - } - else { - return --this.ticksLeft > 0; - } - } - - public void tick() { - EntityEndSlime.this.lookAtEntity(EntityEndSlime.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).look(EntityEndSlime.this.yaw, EntityEndSlime.this.canAttack()); - } - } - - class EndSlimeMoveControl extends MoveControl { - private float targetYaw; - private int ticksUntilJump; - private boolean jumpOften; - - public EndSlimeMoveControl(EntityEndSlime slime) { - super(slime); - this.targetYaw = 180.0F * slime.yaw / 3.1415927F; - } - - public void look(float targetYaw, boolean jumpOften) { - this.targetYaw = targetYaw; - this.jumpOften = jumpOften; - } - - public void move(double speed) { - this.speed = speed; - this.state = MoveControl.State.MOVE_TO; - } - - public void tick() { - this.entity.yaw = this.changeAngle(this.entity.yaw, this.targetYaw, 90.0F); - this.entity.headYaw = this.entity.yaw; - this.entity.bodyYaw = this.entity.yaw; - if (this.state != MoveControl.State.MOVE_TO) { - this.entity.setForwardSpeed(0.0F); - } - else { - this.state = MoveControl.State.WAIT; - if (this.entity.isOnGround()) { - this.entity.setMovementSpeed((float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); - if (this.ticksUntilJump-- <= 0) { - this.ticksUntilJump = EntityEndSlime.this.getTicksUntilNextJump(); - if (this.jumpOften) { - this.ticksUntilJump /= 3; - } - - EntityEndSlime.this.getJumpControl().setActive(); - if (EntityEndSlime.this.makesJumpSound()) { - EntityEndSlime.this.playSound(EntityEndSlime.this.getJumpSound(), EntityEndSlime.this.getSoundVolume(), getJumpSoundPitch()); - } - } - else { - EntityEndSlime.this.sidewaysSpeed = 0.0F; - EntityEndSlime.this.forwardSpeed = 0.0F; - this.entity.setMovementSpeed(0.0F); - } - } - else { - this.entity.setMovementSpeed((float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); - } - - } - } - - private float getJumpSoundPitch() { - float f = EntityEndSlime.this.isSmall() ? 1.4F : 0.8F; - return ((EntityEndSlime.this.random.nextFloat() - EntityEndSlime.this.random.nextFloat()) * 0.2F + 1.0F) * f; - } - } -} diff --git a/src/main/java/ru/betterend/entity/EntityShadowWalker.java b/src/main/java/ru/betterend/entity/EntityShadowWalker.java deleted file mode 100644 index b7d5d50c..00000000 --- a/src/main/java/ru/betterend/entity/EntityShadowWalker.java +++ /dev/null @@ -1,154 +0,0 @@ -package ru.betterend.entity; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.goal.FollowTargetGoal; -import net.minecraft.entity.ai.goal.LookAroundGoal; -import net.minecraft.entity.ai.goal.LookAtEntityGoal; -import net.minecraft.entity.ai.goal.MeleeAttackGoal; -import net.minecraft.entity.ai.goal.WanderAroundFarGoal; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -import ru.betterend.registry.EndSounds; -import ru.betterend.util.MHelper; - -public class EntityShadowWalker extends HostileEntity { - public EntityShadowWalker(EntityType entityType, World world) { - super(entityType, world); - } - - @Override - protected void initGoals() { - this.goalSelector.add(2, new AttackGoal(this, 1.0D, false)); - this.goalSelector.add(7, new WanderAroundFarGoal(this, 1.0D)); - this.goalSelector.add(8, new LookAtEntityGoal(this, PlayerEntity.class, 8.0F)); - this.goalSelector.add(8, new LookAroundGoal(this)); - this.targetSelector.add(2, new FollowTargetGoal(this, PlayerEntity.class, true)); - } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return HostileEntity.createHostileAttributes() - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 35.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15) - .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.5) - .add(EntityAttributes.GENERIC_ARMOR, 2.0) - .add(EntityAttributes.ZOMBIE_SPAWN_REINFORCEMENTS); - } - - @Override - public void tick() { - super.tick(); - world.addParticle(ParticleTypes.ASH, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - world.addParticle(ParticleTypes.SMOKE, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - world.addParticle(ParticleTypes.ENTITY_EFFECT, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - } - - @Override - protected SoundEvent getAmbientSound() { - return EndSounds.ENTITY_SHADOW_WALKER; - } - - @Override - protected SoundEvent getHurtSound(DamageSource source) { - return EndSounds.ENTITY_SHADOW_WALKER_DAMAGE; - } - - @Override - protected SoundEvent getDeathSound() { - return EndSounds.ENTITY_SHADOW_WALKER_DEATH; - } - - @Override - protected void playStepSound(BlockPos pos, BlockState state) {} - - @Override - protected float getSoundVolume() { - return MHelper.randRange(0.25F, 0.5F, random); - } - - @Override - protected float getSoundPitch() { - return MHelper.randRange(0.75F, 1.25F, random); - } - - @Override - public boolean tryAttack(Entity target) { - boolean attack = super.tryAttack(target); - if (attack && target instanceof LivingEntity) { - LivingEntity living = (LivingEntity) target; - if (!(living.hasStatusEffect(StatusEffects.BLINDNESS))) { - living.addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 60)); - } - } - return attack; - } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - if (HostileEntity.canSpawnInDark(type, world, spawnReason, pos, random)) { - Box box = new Box(pos).expand(16); - List entities = world.getEntitiesByClass(EntityShadowWalker.class, box, (entity) -> { return true; }); - return entities.size() < 6; - } - return false; - } - - private final class AttackGoal extends MeleeAttackGoal { - private final EntityShadowWalker walker; - private int ticks; - - public AttackGoal(EntityShadowWalker walker, double speed, boolean pauseWhenMobIdle) { - super(walker, speed, pauseWhenMobIdle); - this.walker = walker; - } - - public void start() { - super.start(); - this.ticks = 0; - } - - public void stop() { - super.stop(); - this.walker.setAttacking(false); - } - - public void tick() { - super.tick(); - ++this.ticks; - if (this.ticks >= 5 && this.method_28348() < this.method_28349() / 2) { - this.walker.setAttacking(true); - } - else { - this.walker.setAttacking(false); - } - } - } -} diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java new file mode 100644 index 00000000..8f209b7a --- /dev/null +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -0,0 +1,154 @@ +package ru.betterend.entity; + +import java.util.List; +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import ru.betterend.registry.EndSounds; +import ru.betterend.util.MHelper; + +public class ShadowWalkerEntity extends Monster { + public ShadowWalkerEntity(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(2, new AttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, Player.class, true)); + } + + public static AttributeSupplier.Builder createMobAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.FOLLOW_RANGE, 35.0) + .add(Attributes.MOVEMENT_SPEED, 0.15) + .add(Attributes.ATTACK_DAMAGE, 4.5) + .add(Attributes.ARMOR, 2.0) + .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); + } + + @Override + public void tick() { + super.tick(); + level.addParticle(ParticleTypes.ASH, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); + level.addParticle(ParticleTypes.SMOKE, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); + level.addParticle(ParticleTypes.ENTITY_EFFECT, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); + } + + @Override + protected SoundEvent getAmbientSound() { + return EndSounds.ENTITY_SHADOW_WALKER; + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return EndSounds.ENTITY_SHADOW_WALKER_DAMAGE; + } + + @Override + protected SoundEvent getDeathSound() { + return EndSounds.ENTITY_SHADOW_WALKER_DEATH; + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) {} + + @Override + protected float getSoundVolume() { + return MHelper.randRange(0.25F, 0.5F, random); + } + + @Override + protected float getVoicePitch() { + return MHelper.randRange(0.75F, 1.25F, random); + } + + @Override + public boolean doHurtTarget(Entity target) { + boolean attack = super.doHurtTarget(target); + if (attack && target instanceof LivingEntity) { + LivingEntity living = (LivingEntity) target; + if (!(living.hasEffect(MobEffects.BLINDNESS))) { + living.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60)); + } + } + return attack; + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + if (Monster.checkMonsterSpawnRules(type, world, spawnReason, pos, random)) { + AABB box = new AABB(pos).inflate(16); + List entities = world.getEntitiesOfClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); + return entities.size() < 6; + } + return false; + } + + private final class AttackGoal extends MeleeAttackGoal { + private final ShadowWalkerEntity walker; + private int ticks; + + public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { + super(walker, speed, pauseWhenMobIdle); + this.walker = walker; + } + + public void start() { + super.start(); + this.ticks = 0; + } + + public void stop() { + super.stop(); + this.walker.setAggressive(false); + } + + public void tick() { + super.tick(); + ++this.ticks; + if (this.ticks >= 5 && this.getTicksUntilNextAttack() < this.getAttackInterval() / 2) { + this.walker.setAggressive(true); + } + else { + this.walker.setAggressive(false); + } + } + } +} diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java new file mode 100644 index 00000000..3365d894 --- /dev/null +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -0,0 +1,310 @@ +package ru.betterend.entity; + +import java.util.EnumSet; +import java.util.List; +import java.util.Random; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.control.LookControl; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class SilkMothEntity extends Animal implements FlyingAnimal { + private BlockPos hivePos; + private BlockPos entrance; + private Level hiveWorld; + + public SilkMothEntity(EntityType entityType, Level world) { + super(entityType, world); + this.moveControl = new FlyingMoveControl(this, 20, true); + this.lookControl = new MothLookControl(this); + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); + this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); + this.xpReward = 1; + } + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 0.4D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); + } + + public void setHive(Level world, BlockPos hive) { + this.hivePos = hive; + this.hiveWorld = world; + } + + @Override + public Entity getLeashHolder() { + return null; + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + if (hivePos != null) { + tag.put("HivePos", NbtUtils.writeBlockPos(hivePos)); + tag.putString("HiveWorld", hiveWorld.dimension().location().toString()); + } + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + if (tag.contains("HivePos")) { + hivePos = NbtUtils.readBlockPos(tag.getCompound("HivePos")); + ResourceLocation worldID = new ResourceLocation(tag.getString("HiveWorld")); + try { + hiveWorld = level.getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, worldID)); + } + catch (Exception e) { + BetterEnd.LOGGER.warning("Silk Moth Hive World {} is missing!", worldID); + hivePos = null; + } + } + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new ReturnToHiveGoal()); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25D)); + this.goalSelector.addGoal(8, new WanderAroundGoal()); + this.goalSelector.addGoal(9, new FloatGoal(this)); + } + + @Override + protected PathNavigation createNavigation(Level world) { + FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { + public boolean isStableDestination(BlockPos pos) { + BlockState state = this.level.getBlockState(pos); + return state.isAir() || !state.getMaterial().blocksMotion(); + } + + public void tick() { + super.tick(); + } + }; + birdNavigation.setCanOpenDoors(false); + birdNavigation.setCanFloat(false); + birdNavigation.setCanPassDoors(true); + return birdNavigation; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + protected boolean makeFlySound() { + return true; + } + + @Override + public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + return false; + } + + @Override + public boolean isMovementNoisy() { + return false; + } + + @Override + public boolean isNoGravity() { + return true; + } + + @Override + public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + return EndEntities.SILK_MOTH.create(world); + } + + @Override + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { + int minCount = 0; + int maxCount = 1; + if (causedByPlayer && this.lastHurtByPlayer != null) { + int looting = EnchantmentHelper.getMobLooting(this.lastHurtByPlayer); + minCount += looting; + maxCount += looting; + if (maxCount > 2) { + maxCount = 2; + } + } + int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); + this.level.addFreshEntity(drop); + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); + } + + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { + AABB box = new AABB(pos).inflate(radius); + List list = world.getEntitiesOfClass(SilkMothEntity.class, box, (entity) -> true); + return list.size() <= maxCount; + } + + class MothLookControl extends LookControl { + MothLookControl(Mob entity) { + super(entity); + } + + protected boolean resetXRotOnTick() { + return true; + } + } + + class WanderAroundGoal extends Goal { + WanderAroundGoal() { + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + @Override + public boolean canUse() { + return SilkMothEntity.this.navigation.isDone() && SilkMothEntity.this.random.nextInt(10) == 0; + } + + @Override + public boolean canContinueToUse() { + return SilkMothEntity.this.navigation.isInProgress(); + } + + @Override + public void start() { + Vec3 vec3d = null; + if (SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level) { + if (SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { + vec3d = SilkMothEntity.this.position().add(random.nextGaussian() * 2, 0, random.nextGaussian() * 2); + } + } + vec3d = vec3d == null ? this.getRandomLocation() : vec3d; + if (vec3d != null) { + try { + SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(new BlockPos(vec3d), 1), 1.0D); + } + catch (Exception e) {} + } + } + + @Nullable + private Vec3 getRandomLocation() { + Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); + Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); + return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + } + } + + class ReturnToHiveGoal extends Goal { + ReturnToHiveGoal() { + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + @Override + public boolean canUse() { + return SilkMothEntity.this.hivePos != null + && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level + && SilkMothEntity.this.navigation.isDone() + && SilkMothEntity.this.random.nextInt(16) == 0 + && SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; + } + + @Override + public boolean canContinueToUse() { + return SilkMothEntity.this.navigation.isInProgress() && level.getBlockState(entrance).isAir() && (level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) || level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); + } + + @Override + public void start() { + BlockState state = SilkMothEntity.this.level.getBlockState(SilkMothEntity.this.hivePos); + if (!state.is(EndBlocks.SILK_MOTH_NEST) && !state.is(EndBlocks.SILK_MOTH_HIVE)) { + SilkMothEntity.this.hivePos = null; + return; + } + try { + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING)); + SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(entrance, 1), 1.0D); + } + catch (Exception e) {} + } + + @Override + public void tick() { + super.tick(); + if (SilkMothEntity.this.entrance == null) { + return; + } + double dx = Math.abs(SilkMothEntity.this.entrance.getX() - SilkMothEntity.this.getX()); + double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); + double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); + if (dx + dy + dz < 1) { + BlockState state = SilkMothEntity.this.level.getBlockState(hivePos); + if (state.is(EndBlocks.SILK_MOTH_NEST) || state.is(EndBlocks.SILK_MOTH_HIVE)) { + int fullness = state.getValue(BlockProperties.FULLNESS); + boolean isHive = state.is(EndBlocks.SILK_MOTH_HIVE); + if (fullness < 3 && (isHive || SilkMothEntity.this.random.nextBoolean())) { + fullness += isHive ? MHelper.randRange(1, 2, random) : 1; + if (fullness > 3) { + fullness = 3; + } + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(BlockProperties.FULLNESS, fullness)); + } + SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); + SilkMothEntity.this.remove(); + } + else { + SilkMothEntity.this.hivePos = null; + } + } + } + } +} diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java new file mode 100644 index 00000000..cb0758ad --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -0,0 +1,25 @@ +package ru.betterend.entity.model; + +import java.util.function.Function; + +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; + +public abstract class BlockBenchModel extends EntityModel { + public BlockBenchModel() { + super(); + } + + public BlockBenchModel(Function function) { + super(function); + } + + protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } +} diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java new file mode 100644 index 00000000..91f0abda --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -0,0 +1,104 @@ +package ru.betterend.entity.model; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Mth; +import ru.betterend.entity.CubozoaEntity; + +public class CubozoaEntityModel extends BlockBenchModel { + private final ModelPart model; + private final ModelPart main_cube_r1; + private final ModelPart tentacle_center_1; + private final ModelPart tentacle_1; + private final ModelPart tentacle_center_2; + private final ModelPart tentacle_2; + private final ModelPart tentacle_center_3; + private final ModelPart tentacle_3; + private final ModelPart tentacle_center_4; + private final ModelPart tentacle_4; + private float scaleY; + private float scaleXZ; + + public CubozoaEntityModel() { + super(RenderType::entityTranslucent); + + texWidth = 48; + texHeight = 48; + + model = new ModelPart(this); + model.setPos(0.0F, 24.0F, 0.0F); + model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); + + main_cube_r1 = new ModelPart(this); + main_cube_r1.setPos(0.0F, -14.0F, 0.0F); + model.addChild(main_cube_r1); + setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); + main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); + + tentacle_center_1 = new ModelPart(this); + tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); + model.addChild(tentacle_center_1); + + + tentacle_1 = new ModelPart(this); + tentacle_1.setPos(0.0F, -7.0F, 4.5F); + tentacle_center_1.addChild(tentacle_1); + tentacle_1.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + + tentacle_center_2 = new ModelPart(this); + tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); + model.addChild(tentacle_center_2); + setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); + + + tentacle_2 = new ModelPart(this); + tentacle_2.setPos(0.0F, -7.0F, 4.5F); + tentacle_center_2.addChild(tentacle_2); + tentacle_2.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + + tentacle_center_3 = new ModelPart(this); + tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); + model.addChild(tentacle_center_3); + setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); + + + tentacle_3 = new ModelPart(this); + tentacle_3.setPos(0.0F, -7.0F, 4.5F); + tentacle_center_3.addChild(tentacle_3); + tentacle_3.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + + tentacle_center_4 = new ModelPart(this); + tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); + model.addChild(tentacle_center_4); + setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); + + + tentacle_4 = new ModelPart(this); + tentacle_4.setPos(0.0F, -7.0F, 4.5F); + tentacle_center_4.addChild(tentacle_4); + tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + } + + @Override + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); + scaleY = sin * 0.1F + 0.9F; + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; + + tentacle_1.xRot = sin * 0.15F; + tentacle_2.xRot = sin * 0.15F; + tentacle_3.xRot = sin * 0.15F; + tentacle_4.xRot = sin * 0.15F; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.pushPose(); + matrices.scale(scaleXZ, scaleY, scaleXZ); + model.render(matrices, vertices, light, overlay); + matrices.popPose(); + } +} diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java new file mode 100644 index 00000000..88162bc2 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -0,0 +1,106 @@ +package ru.betterend.entity.model; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import ru.betterend.entity.DragonflyEntity; + +public class DragonflyEntityModel extends BlockBenchModel { + private final ModelPart model; + private final ModelPart head; + private final ModelPart tail; + private final ModelPart tail_2; + private final ModelPart wing_1; + private final ModelPart wing_2; + private final ModelPart wing_3; + private final ModelPart wing_4; + private final ModelPart legs_1; + private final ModelPart legs_2; + + public DragonflyEntityModel() { + super(RenderType::entityCutout); + + texWidth = 64; + texHeight = 64; + + model = new ModelPart(this); + model.setPos(2.0F, 21.5F, -4.0F); + model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); + + head = new ModelPart(this); + head.setPos(-2.0F, -2.0F, 0.0F); + model.addChild(head); + setRotationAngle(head, 0.3491F, 0.0F, 0.0F); + head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); + + tail = new ModelPart(this); + tail.setPos(-2.0F, -2.0F, 9.0F); + model.addChild(tail); + tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); + + tail_2 = new ModelPart(this); + tail_2.setPos(0.0F, 0.0F, 7.0F); + tail.addChild(tail_2); + tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); + + wing_1 = new ModelPart(this); + wing_1.setPos(-2.0F, -4.0F, 4.0F); + model.addChild(wing_1); + wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + + wing_2 = new ModelPart(this); + wing_2.setPos(-2.0F, -4.0F, 4.0F); + model.addChild(wing_2); + wing_2.mirror = true; + wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + + wing_3 = new ModelPart(this); + wing_3.setPos(-2.0F, -4.0F, 8.0F); + model.addChild(wing_3); + wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + + wing_4 = new ModelPart(this); + wing_4.setPos(-2.0F, -4.0F, 8.0F); + model.addChild(wing_4); + wing_4.mirror = true; + wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + + legs_1 = new ModelPart(this); + legs_1.setPos(-1.0F, 0.0F, 1.0F); + model.addChild(legs_1); + setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); + legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + + legs_2 = new ModelPart(this); + legs_2.setPos(-3.0F, 0.0F, 1.0F); + model.addChild(legs_2); + setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); + legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + } + + @Override + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + float progress = animationProgress * 2F; + + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; + wing_2.zRot = -wing_1.zRot; + + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; + wing_4.zRot = -wing_3.zRot; + + progress = animationProgress * 0.05F; + + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; + tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; + tail_2.xRot = -tail.xRot * 1.5F; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + model.render(matrices, vertices, light, overlay); + } +} diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java new file mode 100644 index 00000000..ebfe8f7b --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -0,0 +1,76 @@ +package ru.betterend.entity.model; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import ru.betterend.entity.EndFishEntity; + +public class EndFishEntityModel extends BlockBenchModel { + private final ModelPart model; + private final ModelPart fin_top; + private final ModelPart fin_bottom; + private final ModelPart flipper; + private final ModelPart fin_right; + private final ModelPart fin_left; + + public EndFishEntityModel() { + super(RenderType::entityCutout); + + texWidth = 32; + texHeight = 32; + + model = new ModelPart(this); + model.setPos(0.0F, 20.0F, 0.0F); + model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); + + fin_top = new ModelPart(this); + fin_top.setPos(0.0F, -2.0F, -4.0F); + model.addChild(fin_top); + setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); + fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + + fin_bottom = new ModelPart(this); + fin_bottom.setPos(0.0F, 2.0F, -4.0F); + model.addChild(fin_bottom); + setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); + fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + + flipper = new ModelPart(this); + flipper.setPos(0.0F, 0.0F, 2.0F); + model.addChild(flipper); + setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); + flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); + + fin_right = new ModelPart(this); + fin_right.setPos(-1.0F, 0.0F, -1.0F); + model.addChild(fin_right); + setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); + fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); + + fin_left = new ModelPart(this); + fin_left.setPos(1.0F, 0.0F, -1.0F); + model.addChild(fin_left); + setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); + fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); + } + + @Override + public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + float s1 = (float) Math.sin(animationProgress * 0.1); + float s2 = (float) Math.sin(animationProgress * 0.05); + flipper.yRot = s1 * 0.3F; + fin_top.xRot = s2 * 0.02F - 0.6981F; + fin_bottom.xRot = 0.6981F - s2 * 0.02F; + fin_left.yRot = s1 * 0.3F - 0.7854F; + fin_right.yRot = 0.7854F - s1 * 0.3F; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + model.render(matrices, vertices, light, overlay); + } +} diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java new file mode 100644 index 00000000..bd5b7d52 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -0,0 +1,83 @@ +package ru.betterend.entity.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.util.MHelper; + +public class EndSlimeEntityModel extends ListModel { + private final ModelPart flower; + private final ModelPart crop; + private final ModelPart innerCube; + private final ModelPart rightEye; + private final ModelPart leftEye; + private final ModelPart mouth; + + public EndSlimeEntityModel(boolean onlyShell) { + super(RenderType::entityCutout); + + this.innerCube = new ModelPart(this, 0, 16); + this.rightEye = new ModelPart(this, 32, 0); + this.leftEye = new ModelPart(this, 32, 4); + this.mouth = new ModelPart(this, 32, 8); + this.flower = new ModelPart(this); + this.crop = new ModelPart(this); + + if (onlyShell) { + this.innerCube.texOffs(0, 0); + this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + } else { + this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + + for (int i = 0; i < 4; i++) { + ModelPart petalRot = new ModelPart(this); + petalRot.yRot = MHelper.degreesToRadians(i * 45F); + + ModelPart petal = new ModelPart(this, 40, 0); + petal.setPos(-4, 8, 0); + petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + + this.flower.addChild(petalRot); + petalRot.addChild(petal); + } + + for (int i = 0; i < 2; i++) { + ModelPart petalRot = new ModelPart(this); + petalRot.yRot = MHelper.degreesToRadians(i * 90F + 45F); + + ModelPart petal = new ModelPart(this, 40, 0); + petal.setPos(-4, 8, 0); + petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + + this.crop.addChild(petalRot); + petalRot.addChild(petal); + } + } + } + + @Override + public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, + float headPitch) { + } + + public void renderFlower(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { + flower.render(matrices, vertices, light, overlay); + } + + public void renderCrop(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { + crop.render(matrices, vertices, light, overlay); + } + + @Override + public Iterable parts() { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } +} diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java b/src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java deleted file mode 100644 index 5207fde6..00000000 --- a/src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java +++ /dev/null @@ -1,105 +0,0 @@ -package ru.betterend.entity.model; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.MathHelper; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityCubozoa; - -public class ModelEntityCubozoa extends BlockBenchModel { - private final ModelPart model; - private final ModelPart main_cube_r1; - private final ModelPart tentacle_center_1; - private final ModelPart tentacle_1; - private final ModelPart tentacle_center_2; - private final ModelPart tentacle_2; - private final ModelPart tentacle_center_3; - private final ModelPart tentacle_3; - private final ModelPart tentacle_center_4; - private final ModelPart tentacle_4; - private float scaleY; - private float scaleXZ; - - public ModelEntityCubozoa() { - super(RenderLayer::getEntityTranslucent); - - textureWidth = 48; - textureHeight = 48; - - model = new ModelPart(this); - model.setPivot(0.0F, 24.0F, 0.0F); - model.setTextureOffset(0, 17).addCuboid(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); - - main_cube_r1 = new ModelPart(this); - main_cube_r1.setPivot(0.0F, -14.0F, 0.0F); - model.addChild(main_cube_r1); - setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.setTextureOffset(0, 0).addCuboid(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); - - tentacle_center_1 = new ModelPart(this); - tentacle_center_1.setPivot(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_1); - - - tentacle_1 = new ModelPart(this); - tentacle_1.setPivot(0.0F, -7.0F, 4.5F); - tentacle_center_1.addChild(tentacle_1); - tentacle_1.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_2 = new ModelPart(this); - tentacle_center_2.setPivot(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_2); - setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - - - tentacle_2 = new ModelPart(this); - tentacle_2.setPivot(0.0F, -7.0F, 4.5F); - tentacle_center_2.addChild(tentacle_2); - tentacle_2.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_3 = new ModelPart(this); - tentacle_center_3.setPivot(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_3); - setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - - - tentacle_3 = new ModelPart(this); - tentacle_3.setPivot(0.0F, -7.0F, 4.5F); - tentacle_center_3.addChild(tentacle_3); - tentacle_3.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_4 = new ModelPart(this); - tentacle_center_4.setPivot(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_4); - setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - - - tentacle_4 = new ModelPart(this); - tentacle_4.setPivot(0.0F, -7.0F, 4.5F); - tentacle_center_4.addChild(tentacle_4); - tentacle_4.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - } - - @Override - public void setAngles(EntityCubozoa entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = MathHelper.sin(animationProgress * 0.13F); - scaleY = sin * 0.1F + 0.9F; - scaleXZ = MathHelper.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - tentacle_1.pitch = sin * 0.15F; - tentacle_2.pitch = sin * 0.15F; - tentacle_3.pitch = sin * 0.15F; - tentacle_4.pitch = sin * 0.15F; - } - - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - matrices.push(); - matrices.scale(scaleXZ, scaleY, scaleXZ); - model.render(matrices, vertices, light, overlay); - matrices.pop(); - } - -} diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java b/src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java deleted file mode 100644 index 764bb647..00000000 --- a/src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java +++ /dev/null @@ -1,105 +0,0 @@ -package ru.betterend.entity.model; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityDragonfly; - -public class ModelEntityDragonfly extends BlockBenchModel { - private final ModelPart model; - private final ModelPart head; - private final ModelPart tail; - private final ModelPart tail_2; - private final ModelPart wing_1; - private final ModelPart wing_2; - private final ModelPart wing_3; - private final ModelPart wing_4; - private final ModelPart legs_1; - private final ModelPart legs_2; - - public ModelEntityDragonfly() { - super(RenderLayer::getEntityCutout); - - textureWidth = 64; - textureHeight = 64; - - model = new ModelPart(this); - model.setPivot(2.0F, 21.5F, -4.0F); - model.setTextureOffset(0, 0).addCuboid(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); - - head = new ModelPart(this); - head.setPivot(-2.0F, -2.0F, 0.0F); - model.addChild(head); - setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.setTextureOffset(17, 0).addCuboid(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); - - tail = new ModelPart(this); - tail.setPivot(-2.0F, -2.0F, 9.0F); - model.addChild(tail); - tail.setTextureOffset(26, 0).addCuboid(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); - - tail_2 = new ModelPart(this); - tail_2.setPivot(0.0F, 0.0F, 7.0F); - tail.addChild(tail_2); - tail_2.setTextureOffset(36, 0).addCuboid(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); - - wing_1 = new ModelPart(this); - wing_1.setPivot(-2.0F, -4.0F, 4.0F); - model.addChild(wing_1); - wing_1.setTextureOffset(0, 13).addCuboid(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); - - wing_2 = new ModelPart(this); - wing_2.setPivot(-2.0F, -4.0F, 4.0F); - model.addChild(wing_2); - wing_2.mirror = true; - wing_2.setTextureOffset(0, 13).addCuboid(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); - - wing_3 = new ModelPart(this); - wing_3.setPivot(-2.0F, -4.0F, 8.0F); - model.addChild(wing_3); - wing_3.setTextureOffset(4, 17).addCuboid(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); - - wing_4 = new ModelPart(this); - wing_4.setPivot(-2.0F, -4.0F, 8.0F); - model.addChild(wing_4); - wing_4.mirror = true; - wing_4.setTextureOffset(4, 17).addCuboid(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); - - legs_1 = new ModelPart(this); - legs_1.setPivot(-1.0F, 0.0F, 1.0F); - model.addChild(legs_1); - setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.setTextureOffset(50, 1).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); - - legs_2 = new ModelPart(this); - legs_2.setPivot(-3.0F, 0.0F, 1.0F); - model.addChild(legs_2); - setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.setTextureOffset(50, 1).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); - } - - - @Override - public void setAngles(EntityDragonfly entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float progress = animationProgress * 2F; - - wing_1.roll = 0.3491F + (float) Math.sin(progress) * 0.3491F; - wing_2.roll = -wing_1.roll; - - wing_3.roll = 0.3491F + (float) Math.cos(progress) * 0.3491F; - wing_4.roll = -wing_3.roll; - - progress = animationProgress * 0.05F; - - head.pitch = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; - tail.pitch = (float) Math.cos(progress) * 0.05F - 0.05F; - tail_2.pitch = -tail.pitch * 1.5F; - } - - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - model.render(matrices, vertices, light, overlay); - } -} diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java b/src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java deleted file mode 100644 index 5e0019b2..00000000 --- a/src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java +++ /dev/null @@ -1,75 +0,0 @@ -package ru.betterend.entity.model; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityEndFish; - -public class ModelEntityEndFish extends BlockBenchModel { - private final ModelPart model; - private final ModelPart fin_top; - private final ModelPart fin_bottom; - private final ModelPart flipper; - private final ModelPart fin_right; - private final ModelPart fin_left; - - public ModelEntityEndFish() { - super(RenderLayer::getEntityCutout); - - textureWidth = 32; - textureHeight = 32; - - model = new ModelPart(this); - model.setPivot(0.0F, 20.0F, 0.0F); - model.setTextureOffset(0, 0).addCuboid(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); - - fin_top = new ModelPart(this); - fin_top.setPivot(0.0F, -2.0F, -4.0F); - model.addChild(fin_top); - setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.setTextureOffset(0, 6).addCuboid(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); - - fin_bottom = new ModelPart(this); - fin_bottom.setPivot(0.0F, 2.0F, -4.0F); - model.addChild(fin_bottom); - setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.setTextureOffset(0, 6).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); - - flipper = new ModelPart(this); - flipper.setPivot(0.0F, 0.0F, 2.0F); - model.addChild(flipper); - setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.setTextureOffset(0, 15).addCuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); - - fin_right = new ModelPart(this); - fin_right.setPivot(-1.0F, 0.0F, -1.0F); - model.addChild(fin_right); - setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.setTextureOffset(0, 25).addCuboid(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); - - fin_left = new ModelPart(this); - fin_left.setPivot(1.0F, 0.0F, -1.0F); - model.addChild(fin_left); - setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.setTextureOffset(0, 25).addCuboid(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); - } - - - @Override - public void setAngles(EntityEndFish entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float s1 = (float) Math.sin(animationProgress * 0.1); - float s2 = (float) Math.sin(animationProgress * 0.05); - flipper.yaw = s1 * 0.3F; - fin_top.pitch = s2 * 0.02F - 0.6981F; - fin_bottom.pitch = 0.6981F - s2 * 0.02F; - fin_left.yaw = s1 * 0.3F - 0.7854F; - fin_right.yaw = 0.7854F - s1 * 0.3F; - } - - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - model.render(matrices, vertices, light, overlay); - } -} diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java new file mode 100644 index 00000000..5d21fafe --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -0,0 +1,138 @@ +package ru.betterend.entity.model; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Mth; +import ru.betterend.entity.SilkMothEntity; + +public class SilkMothEntityModel extends BlockBenchModel { + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; + + public SilkMothEntityModel() { + super(RenderType::entityCutout); + + texWidth = 64; + texHeight = 64; + + legsL = new ModelPart(this); + legsL.setPos(1.5F, 19.9F, -0.45F); + setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); + + cube_r1 = new ModelPart(this); + cube_r1.setPos(0.0F, 0.0F, -1.0F); + legsL.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); + cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r2 = new ModelPart(this); + cube_r2.setPos(0.5F, 0.1F, -0.05F); + legsL.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); + cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r3 = new ModelPart(this); + cube_r3.setPos(0.0F, 0.0F, 0.9F); + legsL.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); + cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + legsR = new ModelPart(this); + legsR.setPos(-1.5F, 19.9F, -0.55F); + setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); + + cube_r4 = new ModelPart(this); + cube_r4.setPos(0.0F, 0.0F, -1.0F); + legsR.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); + cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r5 = new ModelPart(this); + cube_r5.setPos(0.5F, 0.1F, -0.05F); + legsR.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); + cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r6 = new ModelPart(this); + cube_r6.setPos(0.0F, 0.0F, 0.9F); + legsR.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); + cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); + + head_pivot = new ModelPart(this); + head_pivot.setPos(0.0F, 18.0F, -3.0F); + head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); + + tendril_r_r1 = new ModelPart(this); + tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r1); + setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); + tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); + + tendril_r_r2 = new ModelPart(this); + tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r2); + setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); + tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); + + bb_main = new ModelPart(this); + bb_main.setPos(0.0F, 24.0F, 0.0F); + bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); + + wingR_r1 = new ModelPart(this); + wingR_r1.setPos(-1.5F, -6.5F, 0.5F); + bb_main.addChild(wingR_r1); + setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); + wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); + + wingL_r1 = new ModelPart(this); + wingL_r1.setPos(1.5F, -6.5F, 0.5F); + bb_main.addChild(wingL_r1); + setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); + wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); + + abdomen_r1 = new ModelPart(this); + abdomen_r1.setPos(1.0F, -3.9F, 0.0F); + bb_main.addChild(abdomen_r1); + setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); + abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + } + + @Override + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.zRot = -wingR_r1.zRot; + head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.zRot = -tendril_r_r1.zRot; + abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.zRot = -legsR.zRot; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } +} diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 6e23c023..5b6b78fe 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -1,46 +1,47 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityCubozoa; -import ru.betterend.entity.model.ModelEntityCubozoa; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; -public class RendererEntityCubozoa extends MobEntityRenderer { - private static final Identifier[] TEXTURE = new Identifier[2]; - private static final RenderLayer[] GLOW = new RenderLayer[2]; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.BetterEnd; +import ru.betterend.entity.CubozoaEntity; +import ru.betterend.entity.model.CubozoaEntityModel; + +public class RendererEntityCubozoa extends MobRenderer { + private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; + private static final RenderType[] GLOW = new RenderType[2]; public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityCubozoa(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + this.addLayer(new EyesLayer(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityCubozoa entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, CubozoaEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); } }); } @Override - protected void scale(EntityCubozoa entity, MatrixStack matrixStack, float f) { + protected void scale(CubozoaEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } @Override - public Identifier getTexture(EntityCubozoa entity) { + public ResourceLocation getTextureLocation(CubozoaEntity entity) { return TEXTURE[entity.getVariant()]; } @@ -48,7 +49,7 @@ public class RendererEntityCubozoa extends MobEntityRenderer { + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); + private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); -public class RendererEntityDragonfly extends MobEntityRenderer { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); - private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityDragonfly(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { - @Override - public RenderLayer getEyesTexture() { - return GLOW; - } + super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); + this.addLayer(new EyesLayer(this) { + @Override + public RenderType renderType() { + return GLOW; + } }); } - + @Override - public Identifier getTexture(EntityDragonfly entity) { + public ResourceLocation getTextureLocation(DragonflyEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index 1bfc97c0..fce70f61 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -1,53 +1,57 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityEndFish; -import ru.betterend.entity.model.ModelEntityEndFish; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; -public class RendererEntityEndFish extends MobEntityRenderer { - private static final Identifier[] TEXTURE = new Identifier[EntityEndFish.VARIANTS]; - private static final RenderLayer[] GLOW = new RenderLayer[EntityEndFish.VARIANTS]; - - public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityEndFish(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.BetterEnd; +import ru.betterend.entity.EndFishEntity; +import ru.betterend.entity.model.EndFishEntityModel; + +public class RendererEntityEndFish extends MobRenderer { + private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; + private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; + + public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + this.addLayer(new EyesLayer(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityEndFish entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity, + float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, + float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, + 1.0F, 1.0F, 1.0F, 1.0F); } - }); - } - - @Override - protected void scale(EntityEndFish entity, MatrixStack matrixStack, float f) { + }); + } + + @Override + protected void scale(EndFishEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } - - @Override - public Identifier getTexture(EntityEndFish entity) { - return TEXTURE[entity.getVariant()]; - } - - static { - for (int i = 0; i < EntityEndFish.VARIANTS; i++) { - TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); - GLOW[i] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); - } - } + + @Override + public ResourceLocation getTextureLocation(EndFishEntity entity) { + return TEXTURE[entity.getVariant()]; + } + + static { + for (int i = 0; i < EndFishEntity.VARIANTS; i++) { + TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); + GLOW[i] = RenderType.eyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); + } + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index bdf2229a..3fad8fc1 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -1,32 +1,116 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.SlimeEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.render.entity.model.SlimeEntityModel; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityEndSlime; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; -public class RendererEntityEndSlime extends SlimeEntityRenderer { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/end_slime.png"); - private static final Identifier TEXTURE_MOSSY = BetterEnd.makeID("textures/entity/end_slime_mossy.png"); - private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime_glow.png")); - - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher); - this.addFeature(new EyesFeatureRenderer>(this) { +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import ru.betterend.BetterEnd; +import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.model.EndSlimeEntityModel; + +public class RendererEntityEndSlime extends MobRenderer> { + private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; + private static final RenderType GLOW[] = new RenderType[4]; + + public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); + this.addLayer(new OverlayFeatureRenderer(this)); + this.addLayer(new EyesLayer>(this) { @Override - public RenderLayer getEyesTexture() { - return GLOW; + public RenderType renderType() { + return GLOW[0]; } - }); - } - - @Override - public Identifier getTexture(SlimeEntity entity) { - return ((EntityEndSlime) entity).isMossy() ? TEXTURE_MOSSY : TEXTURE; - } + + @Override + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity, + float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, + float headPitch) { + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, + 1.0F, 1.0F, 1.0F, 1.0F); + if (entity.isLake()) { + this.getParentModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY); + } + } + }); + } + + @Override + public ResourceLocation getTextureLocation(EndSlimeEntity entity) { + return TEXTURE[entity.getSlimeType()]; + } + + @Override + public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack, + MultiBufferSource vertexConsumerProvider, int i) { + this.shadowRadius = 0.25F * (float) slimeEntity.getSize(); + super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + @Override + protected void scale(EndSlimeEntity slimeEntity, PoseStack matrixStack, float f) { + matrixStack.scale(0.999F, 0.999F, 0.999F); + matrixStack.translate(0.0D, 0.0010000000474974513D, 0.0D); + float h = (float) slimeEntity.getSize(); + float i = Mth.lerp(f, slimeEntity.oSquish, slimeEntity.squish) / (h * 0.5F + 1.0F); + float j = 1.0F / (i + 1.0F); + matrixStack.scale(j * h, 1.0F / j * h, j * h); + } + + private final class OverlayFeatureRenderer + extends RenderLayer> { + private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); + private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); + + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { + super(featureRendererContext); + } + + public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, + float f, float g, float h, float j, float k, float l) { + if (!livingEntity.isInvisible()) { + if (livingEntity.isLake()) { + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); + this.getParentModel().renderFlower(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); + } else if (livingEntity.isAmber() || livingEntity.isChorus()) { + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); + this.getParentModel().renderCrop(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); + } + + EndSlimeEntityModel model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; + this.getParentModel().copyPropertiesTo(model); + model.prepareMobModel(livingEntity, f, g, h); + model.setupAnim(livingEntity, f, g, j, k, l); + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderType.entityTranslucent(this.getTextureLocation(livingEntity))); + model.renderToBuffer(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + } + } + } + + static { + TEXTURE[0] = BetterEnd.makeID("textures/entity/end_slime/end_slime.png"); + TEXTURE[1] = BetterEnd.makeID("textures/entity/end_slime/end_slime_mossy.png"); + TEXTURE[2] = BetterEnd.makeID("textures/entity/end_slime/end_slime_lake.png"); + TEXTURE[3] = BetterEnd.makeID("textures/entity/end_slime/end_slime_amber.png"); + GLOW[0] = RenderType.eyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_glow.png")); + GLOW[1] = GLOW[0]; + GLOW[2] = RenderType.eyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_lake_glow.png")); + GLOW[3] = RenderType.eyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_amber_glow.png")); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index 6e3b8291..d75db944 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -1,21 +1,22 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.entity.BipedEntityRenderer; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.util.Identifier; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityShadowWalker; +import ru.betterend.entity.ShadowWalkerEntity; + +public class RendererEntityShadowWalker + extends HumanoidMobRenderer> { + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); -public class RendererEntityShadowWalker extends BipedEntityRenderer> { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); - public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerEntityModel(0.0F, false), 0.5F); + super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); } @Override - public Identifier getTexture(EntityShadowWalker zombieEntity) { + public ResourceLocation getTextureLocation(ShadowWalkerEntity zombieEntity) { return TEXTURE; } } diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java new file mode 100644 index 00000000..7d3a2745 --- /dev/null +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -0,0 +1,21 @@ +package ru.betterend.entity.render; + +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.BetterEnd; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.entity.model.SilkMothEntityModel; + +public class SilkMothEntityRenderer extends MobRenderer { + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + + public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); + } + + @Override + public ResourceLocation getTextureLocation(SilkMothEntity entity) { + return TEXTURE; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java new file mode 100644 index 00000000..b67fbaa9 --- /dev/null +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java @@ -0,0 +1,19 @@ +package ru.betterend.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.advancements.Advancement; +import net.minecraft.server.level.ServerPlayer; + +public final class PlayerAdvancementsEvents { + + public static Event PLAYER_ADVENCEMENT_COMPLETE = EventFactory.createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { + for (AdvancementComplete event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } + }); + + public interface AdvancementComplete { + void onAdvancementComplete(ServerPlayer player, Advancement advancement, String criterionName); + } +} diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java new file mode 100644 index 00000000..1a2ef30e --- /dev/null +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -0,0 +1,23 @@ +package ru.betterend.integration; + +public class AdornIntegration extends ModIntegration { + public AdornIntegration() { + super("adorn"); + } + + @Override + public void register() { + //Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); + //Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); + //Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); + + //Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); + //Method create = getMethod(adornBlockBuilder, "create", blockVariant); + //Object builder = executeMethod(adornBlockBuilder, create, testVariant); + //getAndExecuteRuntime(builder, "withEverything"); + //getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); + } + + @Override + public void addBiomes() {} +} diff --git a/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java b/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java new file mode 100644 index 00000000..61fdc5db --- /dev/null +++ b/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java @@ -0,0 +1,17 @@ +package ru.betterend.integration; + +public class ExtraPiecesIntegration extends ModIntegration { + public ExtraPiecesIntegration() { + super("extrapieces"); + } + + @Override + public void register() { + //Class pieceSets = getClass("com.shnupbups.extrapieces.core.PieceSets"); + } + + @Override + public void addBiomes() { + + } +} diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java new file mode 100644 index 00000000..ec830f43 --- /dev/null +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -0,0 +1,67 @@ +package ru.betterend.integration; + +import java.awt.Color; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.world.level.ItemLike; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.blocks.complex.ColoredMaterial; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class FlamboyantRefabricatedIntegration extends ModIntegration { + public FlamboyantRefabricatedIntegration() { + super("flamboyant"); + } + + @Override + public void register() { + /*Class fDyeColor = getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); + Object[] values = getStaticFieldValue(fDyeColor, "VALUES"); + + if (values == null) { + return; + }*/ + + Map colors = Maps.newHashMap(); + Map dyes = Maps.newHashMap(); + /*for (Object val: values) { + Integer color = (Integer) getFieldValue(fDyeColor, "signColor", val); + String name = (String) getFieldValue(fDyeColor, "name", val); + if (color != null && name != null) { + colors.put(color, name); + System.out.println(name + " " + color + " " + new Color(color)); + dyes.put(color, getItem(name + "_dye")); + } + }*/ + + addColor("fead1d", "amber", colors, dyes); + addColor("bd9a5f", "beige", colors, dyes); + addColor("edeada", "cream", colors, dyes); + addColor("33430e", "dark_green", colors, dyes); + addColor("639920", "forest_green", colors, dyes); + addColor("f0618c", "hot_pink", colors, dyes); + addColor("491c7b", "indigo", colors, dyes); + addColor("65291b", "maroon", colors, dyes); + addColor("2c3969", "navy", colors, dyes); + addColor("827c17", "olive", colors, dyes); + addColor("7bc618", "pale_green", colors, dyes); + addColor("f4a4bd", "pale_pink", colors, dyes); + addColor("f8d45a", "pale_yellow", colors, dyes); + addColor("6bb1cf", "sky_blue", colors, dyes); + addColor("6e8c9c", "slate_gray", colors, dyes); + addColor("b02454", "violet", colors, dyes); + + new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); + } + + private void addColor(String hex, String name, Map colors, Map dyes) { + int color = MHelper.color(hex); + colors.put(color, name); + dyes.put(color, getItem(name + "_dye")); + + System.out.println(name + " " + color + " " + new Color(color)); + } +} diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index dd27c4e4..6d7664f1 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -9,6 +9,10 @@ import ru.betterend.integration.byg.BYGIntegration; public class Integrations { public static final List INTEGRATIONS = Lists.newArrayList(); public static final ModIntegration BYG = register(new BYGIntegration()); + public static final ModIntegration NOURISH = register(new NourishIntegration()); + //public static final ModIntegration EXTRA_PIECES = register(new ExtraPiecesIntegration()); + //public static final ModIntegration ADORN = register(new AdornIntegration()); + public static final ModIntegration FLAMBOYANT_REFABRICATED = register(new FlamboyantRefabricatedIntegration()); public static void register() { INTEGRATIONS.forEach((integration) -> { @@ -18,6 +22,14 @@ public class Integrations { }); } + public static void addBiomes() { + INTEGRATIONS.forEach((integration) -> { + if (integration.modIsInstalled()) { + integration.addBiomes(); + } + }); + } + private static ModIntegration register(ModIntegration integration) { INTEGRATIONS.add(integration); return integration; diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 4eafb8b9..24c01e58 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -1,55 +1,72 @@ package ru.betterend.integration; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.tags.Tag.Named; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.BetterEnd; import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { private final String modID; - public abstract void register(); + public void register() {} + + public void addBiomes() {} public ModIntegration(String modID) { this.modID = modID; } - public Identifier getID(String name) { - return new Identifier(modID, name); + public ResourceLocation getID(String name) { + return new ResourceLocation(modID, name); } public Block getBlock(String name) { return Registry.BLOCK.get(getID(name)); } + + public Item getItem(String name) { + return Registry.ITEM.get(getID(name)); + } public BlockState getDefaultState(String name) { - return getBlock(name).getDefaultState(); + return getBlock(name).defaultBlockState(); } - public RegistryKey getKey(String name) { - return RegistryKey.of(Registry.BIOME_KEY, getID(name)); + public ResourceKey getKey(String name) { + return ResourceKey.create(Registry.BIOME_REGISTRY, getID(name)); } public boolean modIsInstalled() { return FabricLoader.getInstance().isModLoaded(modID); } - public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Feature featureStep) { + public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Decoration featureStep) { Feature feature = Registry.FEATURE.get(getID(featureID)); ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE.get(getID(configuredFeatureID)); - System.out.println(feature + " " + featureConfigured); return new EndFeature(feature, featureConfigured, featureStep); } - public EndFeature getFeature(String name, GenerationStep.Feature featureStep) { + public EndFeature getFeature(String name, GenerationStep.Decoration featureStep) { return getFeature(name, name, featureStep); } @@ -60,4 +77,135 @@ public abstract class ModIntegration { public Biome getBiome(String name) { return BuiltinRegistries.BIOME.get(getID(name)); } + + public Class getClass(String path) { + Class cl = null; + try { + cl = Class.forName(path); + } + catch (ClassNotFoundException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + return cl; + } + + @SuppressWarnings("unchecked") + public T getStaticFieldValue(Class cl, String name) { + if (cl != null) { + try { + Field field = cl.getDeclaredField(name); + if (field != null) { + return (T) field.get(null); + } + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + public Object getFieldValue(Class cl, String name, Object classInstance) { + if (cl != null) { + try { + Field field = cl.getDeclaredField(name); + if (field != null) { + return field.get(classInstance); + } + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + public Method getMethod(Class cl, String functionName, Class... args) { + if (cl != null) { + try { + return cl.getMethod(functionName, args); + } + catch (NoSuchMethodException | SecurityException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object executeMethod(Object instance, Method method, Object... args) { + if (method != null) { + try { + return method.invoke(instance, args); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object getAndExecuteStatic(Class cl, String functionName, Object... args) { + if (cl != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getMethod(cl, functionName, classes); + return executeMethod(null, method, args); + } + return null; + } + + @SuppressWarnings("unchecked") + public T getAndExecuteRuntime(Class cl, Object instance, String functionName, Object... args) { + if (instance != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getMethod(cl, functionName, classes); + return (T) executeMethod(instance, method, args); + } + return null; + } + + public Object newInstance(Class cl, Object... args) { + if (cl != null) { + for (Constructor constructor: cl.getConstructors()) { + if (constructor.getParameterCount() == args.length) { + try { + return constructor.newInstance(args); + } + catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + } + } + return null; + } + + public Tag.Named getItemTag(String name) { + ResourceLocation id = getID(name); + Tag tag = ItemTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; + } + + public Tag.Named getBlockTag(String name) { + ResourceLocation id = getID(name); + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; + } } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java new file mode 100644 index 00000000..37a92fa6 --- /dev/null +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -0,0 +1,25 @@ +package ru.betterend.integration; + +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; +import ru.betterend.registry.EndItems; +import ru.betterend.util.TagHelper; + +public class NourishIntegration extends ModIntegration { + public NourishIntegration() { + super("nourish"); + } + + @Override + public void register() { + Tag.Named fats = getItemTag("fats"); + Tag.Named fruit = getItemTag("fruit"); + Tag.Named protein = getItemTag("protein"); + Tag.Named sweets = getItemTag("sweets"); + + TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); + TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); + TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + } +} diff --git a/src/main/java/ru/betterend/integration/byg/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/BYGBiomes.java deleted file mode 100644 index d3c47b76..00000000 --- a/src/main/java/ru/betterend/integration/byg/BYGBiomes.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.betterend.integration.byg; - -import ru.betterend.integration.Integrations; -import ru.betterend.registry.EndBiomes; -import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.generator.BiomeType; - -public class BYGBiomes { - // Original Biomes - public static final EndBiome BULBIS_GARDENS = EndBiomes.registerBiome(Integrations.BYG.getKey("bulbis_gardens"), BiomeType.LAND, 1F); - - // New Biomes - public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiome(new OldBulbisGardens(), BULBIS_GARDENS); - - public static void register() {} -} diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index bb811560..911ea1ea 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -1,13 +1,15 @@ package ru.betterend.integration.byg; -import net.minecraft.block.Block; -import ru.betterend.blocks.basis.BlockVine; -import ru.betterend.blocks.basis.BlockWallPlant; +import net.minecraft.world.level.block.Block; +import ru.betterend.blocks.basis.EndWallPlantBlock; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; public class BYGBlocks { - public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new BlockWallPlant()); - public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new BlockVine()); + public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); + public static final Block NIGHTSHADE_MOSS = EndBlocks.registerBlock("nightshade_moss", new EndWallPlantBlock()); + + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new VineBlock()); public static void register() {} } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 50696aa5..64a805d7 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,9 +1,20 @@ package ru.betterend.integration.byg; +import java.util.List; +import java.util.stream.Collectors; + +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.level.biome.Biome; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; +import ru.betterend.integration.byg.biomes.BYGBiomes; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; +import ru.betterend.world.biome.EndBiome; public class BYGIntegration extends ModIntegration { public BYGIntegration() { @@ -17,4 +28,49 @@ public class BYGIntegration extends ModIntegration { BYGFeatures.register(); BYGBiomes.register(); } + + @Override + public void addBiomes() { + BYGBiomes.addBiomes(); + + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); + List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); + + if (biomes != null && biomeClass != null) { + biomes.forEach((obj) -> { + Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); + if (biome != null) { + ResourceLocation biomeID = BuiltinRegistries.BIOME.getKey(biome); + EndBiome endBiome = EndBiomes.getBiome(biomeID); + Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); + if (edge != null) { + ResourceLocation edgeID = BuiltinRegistries.BIOME.getKey(edge); + EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); + EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); + EndBiome edgeBiome = EndBiomes.getBiome(edgeID); + endBiome.setEdge(edgeBiome); + } + else { + Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); + if (isVoid != null && isVoid.booleanValue()) { + EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); + EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); + } + WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + if (subBiomes != null) { + subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { + EndBiome subBiome = EndBiomes.getBiome(id); + EndBiomes.LAND_BIOMES.removeMutableBiome(id); + EndBiomes.VOID_BIOMES.removeMutableBiome(id); + if (!endBiome.containsSubBiome(subBiome)) { + EndBiomes.SUBBIOMES.add(subBiome); + endBiome.addSubBiome(subBiome); + } + }); + } + } + } + }); + } + } } diff --git a/src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java deleted file mode 100644 index 6c2b21c9..00000000 --- a/src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.betterend.integration.byg; - -import java.util.List; - -import net.minecraft.entity.SpawnGroup; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundEvent; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; -import net.minecraft.world.gen.GenerationStep.Feature; -import ru.betterend.BetterEnd; -import ru.betterend.integration.Integrations; -import ru.betterend.registry.EndFeatures; -import ru.betterend.world.biome.BiomeDefinition; -import ru.betterend.world.biome.EndBiome; - -public class OldBulbisGardens extends EndBiome { - public OldBulbisGardens() { - super(makeDef()); - } - - private static BiomeDefinition makeDef() { - Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); - BiomeEffects effects = biome.getEffects(); - - BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") - .setFogColor(215, 132, 207) - .setFogDensity(1.8F) - .setWaterAndFogColor(40, 0, 56) - .setFoliageColor(122, 17, 155) - .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(Integrations.BYG.getBlock("ivis_phylium")) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.BULBIS_TREES) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.PURPLE_BULBIS_TREES) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT) - .addFeature(BYGFeatures.BULBIS_ODDITY) - .addFeature(BYGFeatures.PURPLE_BULBIS_ODDITY); - - if (BetterEnd.isClient()) { - SoundEvent loop = effects.getLoopSound().get(); - SoundEvent music = effects.getMusic().get().getSound(); - SoundEvent additions = effects.getAdditionsSound().get().getSound(); - SoundEvent mood = effects.getMoodSound().get().getSound(); - def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); - } - - for (SpawnGroup group: SpawnGroup.values()) { - List list = biome.getSpawnSettings().getSpawnEntry(group); - list.forEach((entry) -> { - def.addMobSpawn(entry); - }); - } - - return def; - } -} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java new file mode 100644 index 00000000..0211415c --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -0,0 +1,20 @@ +package ru.betterend.integration.byg.biomes; + +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.EndBiome; + +public class BYGBiomes { + // New Biomes + public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiomeIntegration(new OldBulbisGardens()); + public static final EndBiome NIGHTSHADE_REDWOODS = EndBiomes.registerSubBiomeIntegration(new NightshadeRedwoods()); + //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); + + public static void register() {} + + public static void addBiomes() { + EndBiomes.addSubBiomeIntegration(OLD_BULBIS_GARDENS, Integrations.BYG.getID("bulbis_gardens")); + EndBiomes.addSubBiomeIntegration(NIGHTSHADE_REDWOODS, Integrations.BYG.getID("nightshade_forest")); + //EndBiomes.addSubBiomeIntegration(ETHERIAL_GROVE, Integrations.BYG.getID("ethereal_islands")); + } +} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java new file mode 100644 index 00000000..58c69b13 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -0,0 +1,46 @@ +package ru.betterend.integration.byg.biomes; + +import java.util.List; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import ru.betterend.BetterEnd; +import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class EterialGrove extends EndBiome { + public EterialGrove() { + super(makeDef()); + } + + private static BiomeDefinition makeDef() { + Biome biome = Integrations.BYG.getBiome("ethereal_islands"); + BiomeSpecialEffects effects = biome.getSpecialEffects(); + + BiomeDefinition def = new BiomeDefinition("eterial_grove") + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) + .addFeature(BYGFeatures.BIG_ETHER_TREE); + + if (BetterEnd.isClient()) { + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); + def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + } + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); + list.forEach((entry) -> { + def.addMobSpawn(entry); + }); + } + + return def; + } +} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java new file mode 100644 index 00000000..d373af5e --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -0,0 +1,64 @@ +package ru.betterend.integration.byg.biomes; + +import java.util.List; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import ru.betterend.BetterEnd; +import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class NightshadeRedwoods extends EndBiome { + public NightshadeRedwoods() { + super(makeDef()); + } + + private static BiomeDefinition makeDef() { + Biome biome = Integrations.BYG.getBiome("nightshade_forest"); + BiomeSpecialEffects effects = biome.getSpecialEffects(); + + BiomeDefinition def = new BiomeDefinition("nightshade_redwoods") + .setFogColor(140, 108, 47) + .setFogDensity(1.5F) + .setWaterAndFogColor(55, 70, 186) + .setFoliageColor(122, 17, 155) + .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) + .setGrassColor(48, 13, 89) + .setPlantsColor(200, 125, 9) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) + .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .addFeature(BYGFeatures.NIGHTSHADE_MOSS); + + if (BetterEnd.isClient()) { + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); + def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + } + biome.getGenerationSettings().features().forEach((list) -> { + list.forEach((feature) -> { + def.addFeature(Decoration.VEGETAL_DECORATION, feature.get()); + }); + }); + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); + list.forEach((entry) -> { + def.addMobSpawn(entry); + }); + } + + return def; + } +} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java new file mode 100644 index 00000000..d1aeb582 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -0,0 +1,91 @@ +package ru.betterend.integration.byg.biomes; + +import java.util.List; +import java.util.function.Supplier; + +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.Features; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import ru.betterend.BetterEnd; +import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class OldBulbisGardens extends EndBiome { + public OldBulbisGardens() { + super(makeDef()); + } + + private static BiomeDefinition makeDef() { + Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); + BiomeSpecialEffects effects = biome.getSpecialEffects(); + + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); + Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); + BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") + .setFogColor(215, 132, 207) + .setFogDensity(1.8F) + .setWaterAndFogColor(40, 0, 56) + .setFoliageColor(122, 17, 155) + .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) + .setSurface(ivis, origin) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.OLD_BULBIS_TREE); + + if (BetterEnd.isClient()) { + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); + def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + } + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); + list.forEach((entry) -> { + def.addMobSpawn(entry); + }); + } + + List>>> features = biome.getGenerationSettings().features(); + List>> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); + if (vegetal.size() > 2) { + Supplier> getter; + // Trees (first two features) + // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) + for (int i = 0; i < 2; i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1)); + def.addFeature(Decoration.VEGETAL_DECORATION, feature); + } + // Grasses and other features + for (int i = 2; i < vegetal.size(); i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + def.addFeature(Decoration.VEGETAL_DECORATION, feature); + } + } + + def.addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS) + .addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + + return def; + } +} diff --git a/src/main/java/ru/betterend/integration/byg/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java similarity index 58% rename from src/main/java/ru/betterend/integration/byg/BYGFeatures.java rename to src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 39d0242b..b2e7e812 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -1,7 +1,7 @@ -package ru.betterend.integration.byg; +package ru.betterend.integration.byg.features; -import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.BYGBlocks; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.VineFeature; @@ -14,11 +14,11 @@ public class BYGFeatures { public static final EndFeature IVIS_VINE = new EndFeature("ivis_vine", new VineFeature(BYGBlocks.IVIS_VINE, 24), 5); public static final EndFeature IVIS_MOSS = new EndFeature("ivis_moss", new WallPlantFeature(BYGBlocks.IVIS_MOSS, 6), 1); public static final EndFeature IVIS_MOSS_WOOD = new EndFeature("ivis_moss_wood", new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), 15); - public static final EndFeature BULBIS_ODDITY = new EndFeature("bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("bulbis_oddity"), 4, 4), 5); - public static final EndFeature PURPLE_BULBIS_ODDITY = new EndFeature("purple_bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("purple_bulbis_oddity"), 4, 4), 5); + public static final EndFeature NIGHTSHADE_MOSS = new EndFeature("nightshade_moss", new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 2); + public static final EndFeature NIGHTSHADE_MOSS_WOOD = new EndFeature("nightshade_moss_wood", new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 8); - public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); - public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); + public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); + public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); public static void register() {} } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java new file mode 100644 index 00000000..19b254e4 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -0,0 +1,84 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.world.features.DefaultFeature; + +public class BigEtherTreeFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + BlockState log = Integrations.BYG.getDefaultState("ether_log"); + BlockState wood = Integrations.BYG.getDefaultState("ether_wood"); + // BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); + Function splinePlacer = (bpos) -> { + return log; + }; + Function replace = (state) -> { + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); + }; + + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); + SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + + int count = height / 15; + for (int i = 1; i < count; i++) { + float splinePos = (float) i / (float) count; + float startAngle = random.nextFloat() * MHelper.PI2; + float length = (1 - splinePos) * height * 0.4F; + int points = (int) (length / 3); + List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); + SplineHelper.powerOffset(branch, length, 2F); + int rotCount = MHelper.randRange(5, 7, random); + // float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; + Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); + for (int j = 0; j < rotCount; j++) { + float angle = startAngle + (float) j / rotCount * MHelper.PI2; + List br = SplineHelper.copySpline(branch); + SplineHelper.offsetParts(br, random, 0, 1, 1); + SplineHelper.rotateSpline(br, angle); + + SplineHelper.offset(br, start); + SplineHelper.fillSpline(br, world, wood, pos, replace); + } + } + + sdf.setReplaceFunction((state) -> { + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); + }).addPostProcess((info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); + }).fillRecursive(world, pos); + + return true; + } + + // private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, + // BlockState leaves, Function ignore) { + // + // } +} diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java new file mode 100644 index 00000000..12a3554e --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -0,0 +1,191 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class GreatNightshadeTreeFeature extends DefaultFeature { + private static final List BRANCH; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); + BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves").setValue(LeavesBlock.DISTANCE, 1); + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves") + .setValue(LeavesBlock.DISTANCE, 1); + + Function splinePlacer = (bpos) -> { + return log; + }; + Function replace = (state) -> { + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); + }; + Function post = (info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); + }; + Function ignore = (state) -> { + return state.equals(log) || state.equals(wood); + }; + + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); + SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); + + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { + return false; + } + + int count = height >> 2; + float start = trunk.size() / 3F; + float delta = trunk.size() * 0.6F; + float max = height - 7; + for (int i = 0; i < count; i++) { + float scale = (float) (count - i) / count * 15; + Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); + if (offset.y() > max) { + break; + } + List branch = SplineHelper.copySpline(BRANCH); + SplineHelper.rotateSpline(branch, i * 1.3F); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); + SplineHelper.offset(branch, offset); + SplineHelper.fillSpline(branch, world, wood, pos, replace); + } + SplineHelper.fillSpline(trunk, world, log, pos, ignore); + + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + SDF roots = new SDFSphere().setRadius(2F).setBlock(log); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)) + .setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); + sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); + Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.75F); + for (int y = 0; y < 8; y++) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); + } + + for (int y = 0; y < 16; y++) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves); + } + float radius = (1 - y / 16F) * 3F; + int rad = (int) (radius + 1); + radius *= radius; + for (int x = -rad; x <= rad; x++) { + int x2 = x * x; + for (int z = -rad; z <= rad; z++) { + int z2 = z * z; + if (x2 + z2 < radius - random.nextFloat() * rad) { + BlockPos lp = p.offset(x, 0, z); + if (world.isEmptyBlock(lp)) { + BlocksHelper.setWithoutUpdate(world, lp, leaves); + } + } + } + } + } + + MutableBlockPos mut = new MutableBlockPos(); + Function leavesPost1 = (info) -> { + if (info.getState().equals(log) || info.getState().equals(wood)) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.getValue(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + return info.getState(); + }; + Function leavesPost2 = (info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getState().getValue(LeavesBlock.DISTANCE); + if (distance > MHelper.randRange(2, 4, random)) { + return Blocks.AIR.defaultBlockState(); + } + for (Direction d : BlocksHelper.DIRECTIONS) { + int airCount = 0; + if (info.getState(d).isAir()) { + airCount++; + } + if (airCount > 5) { + return Blocks.AIR.defaultBlockState(); + } + } + if (random.nextInt(8) == 0) { + return leaves_flower.setValue(LeavesBlock.DISTANCE, distance); + } + } + return info.getState(); + }; + + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); + canopy = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-3F, 3F, random); + }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, + pos.offset(0, height * 0.75, 0), ignore); + + return true; + } + + static { + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0)); + } +} diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java new file mode 100644 index 00000000..72f35a9a --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -0,0 +1,190 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class NightshadeRedwoodTreeFeature extends DefaultFeature { + private static final List BRANCH; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); + BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); + + Function splinePlacer = (bpos) -> { + return log; + }; + Function replace = (state) -> { + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); + }; + Function post = (info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); + }; + Function ignore = (state) -> { + return state.equals(log) || state.equals(wood); + }; + + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); + SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); + + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { + return false; + } + + int count = height >> 2; + float start = trunk.size() / 3F; + float delta = trunk.size() * 0.6F; + float max = height - 7; + float startAngle = random.nextFloat() * MHelper.PI2; + for (int i = 0; i < count; i++) { + float scale = (float) (count - i) / count * 15; + Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); + if (offset.y() > max) { + break; + } + List branch = SplineHelper.copySpline(BRANCH); + SplineHelper.rotateSpline(branch, i * 1.3F + startAngle); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); + SplineHelper.offset(branch, offset); + SplineHelper.fillSpline(branch, world, wood, pos, replace); + } + + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + SDF roots = new SDFSphere().setRadius(2F).setBlock(log); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)) + .setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); + sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); + Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F); + for (int y = 0; y < 8; y++) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); + } + + for (int y = 0; y < 16; y++) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves); + } + float radius = (1 - y / 16F) * 3F; + int rad = (int) (radius + 1); + radius *= radius; + for (int x = -rad; x <= rad; x++) { + int x2 = x * x; + for (int z = -rad; z <= rad; z++) { + int z2 = z * z; + if (x2 + z2 < radius - random.nextFloat() * rad) { + BlockPos lp = p.offset(x, 0, z); + if (world.isEmptyBlock(lp)) { + BlocksHelper.setWithoutUpdate(world, lp, leaves); + } + } + } + } + } + + MutableBlockPos mut = new MutableBlockPos(); + Function leavesPost1 = (info) -> { + if (info.getState().equals(log) || info.getState().equals(wood)) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.getValue(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + return info.getState(); + }; + Function leavesPost2 = (info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getState().getValue(LeavesBlock.DISTANCE); + if (distance > MHelper.randRange(2, 4, random)) { + return Blocks.AIR.defaultBlockState(); + } + for (Direction d : BlocksHelper.DIRECTIONS) { + int airCount = 0; + if (info.getState(d).isAir()) { + airCount++; + } + if (airCount > 5) { + return Blocks.AIR.defaultBlockState(); + } + } + if (random.nextInt(8) == 0) { + return leaves_flower.setValue(LeavesBlock.DISTANCE, distance); + } + } + return info.getState(); + }; + + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); + canopy = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-3F, 3F, random); + }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, + pos.offset(0, height * 0.75, 0), ignore); + + return true; + } + + static { + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0)); + } +} diff --git a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java similarity index 54% rename from src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java rename to src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 3fb5fc5f..479f1162 100644 --- a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -1,21 +1,21 @@ -package ru.betterend.integration.byg; +package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; import java.util.function.Function; import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; @@ -34,160 +34,150 @@ public class OldBulbisTreeFeature extends DefaultFeature { private static final List ROOT; private static final List LEAF; private static final List SIDE; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - if (!world.getBlockState(pos.down(4)).getBlock().isIn(EndTags.GEN_TERRAIN)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + if (!world.getBlockState(pos.below(4)).getBlock().is(EndTags.GEN_TERRAIN)) + return false; + BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); BlockState wood = Integrations.BYG.getDefaultState("bulbis_wood"); - BlockState cap = Integrations.BYG.getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); + BlockState cap = Integrations.BYG + .getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); BlockState glow = Integrations.BYG.getDefaultState("purple_shroomlight"); - + Function replacement = (state) -> { - if (state.equals(stem) || state.equals(wood) || state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.equals(stem) || state.equals(wood) || state.is(EndTags.END_GROUND) + || state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); }; - + float size = MHelper.randRange(10, 20, random); + float addSize = MHelper.randRange(1, 1.7F, random); + float addRad = addSize * 0.5F + 0.5F; int count = (int) (size * 0.15F); - float var = MHelper.PI2 / (float) (count * 3); + size *= addSize; + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; int x1 = ((pos.getX() >> 4) << 4) - 16; int z1 = ((pos.getZ() >> 4) << 4) - 16; - Box limits = new Box(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); + AABB limits = new AABB(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * 1.5F + MHelper.randRange(0, size * 0.5F, random), sizeXZ); - SplineHelper.offset(spline, new Vector3f((20 - size), 0, 0)); + SplineHelper.offset(spline, new Vector3f(size * random.nextFloat() * 0.3F, 0, 0)); SplineHelper.rotateSpline(spline, angle); - SplineHelper.offsetParts(spline, random, 1F, 0, 1F);//1.3F 0.8F - SDF branch = SplineHelper.buildSDF(spline, 2.3F, 1.3F, (bpos) -> { + SplineHelper.offsetParts(spline, random, 1F, 0, 1F);// 1.3F 0.8F + SDF branch = SplineHelper.buildSDF(spline, 2.3F * addRad, 1.3F * addRad, (bpos) -> { return stem; }); Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.35F; - bigSphere(world, pos.add(vec.getX(), vec.getY(), vec.getZ()), radius, cap, glow, wood, replacement, random); + bigSphere(world, pos.offset(vec.x(), vec.y(), vec.z()), radius, cap, glow, wood, replacement, random); vec = SplineHelper.getPos(spline, 0.3F); - makeRoots(world, pos.add(vec.getX(), vec.getY(), vec.getZ()), size * 0.4F + 5, random, wood, replacement); + makeRoots(world, pos.offset(vec.x(), vec.y(), vec.z()), size * 0.4F + 5, random, wood, replacement); sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); } - - sdf.setReplaceFunction(replacement).setPostProcess((info) -> { - if (info.getState().equals(stem) && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { + + sdf.setReplaceFunction(replacement).addPostProcess((info) -> { + if (info.getState().equals(stem) + && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { return wood; } return info.getState(); }).fillArea(world, pos, limits); - return true; } - - private void bigSphere(StructureWorldAccess world, BlockPos pos, float radius, BlockState cap, BlockState glow, BlockState wood, Function replacement, Random random) { + + private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, + BlockState wood, Function replacement, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); - + SDF sphereInner = new SDFSphere().setRadius(radius * 0.53F).setBlock(Blocks.AIR); sphereInner = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); + return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); }).setSource(sphereInner); - + SDF sphereGlow = new SDFSphere().setRadius(radius * 0.6F).setBlock(glow); sphereGlow = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1) * 2F; + return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1) * 2F; }).setSource(sphereGlow); sphereGlow = new SDFSubtraction().setSourceA(sphereGlow).setSourceB(sphereInner); - + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereInner); - + float offsetY = radius * 1.7F; sphere = new SDFUnion().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFTranslate().setTranslate(0, offsetY, 0).setSource(sphere); - + int leafCount = (int) (radius * 0.5F) + 2; - System.out.println("Origin " + pos); for (int i = 0; i < 4; i++) { float angle = (float) i / 4 * MHelper.PI2; List spline = SplineHelper.copySpline(LEAF); SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, radius * 1.4F); SplineHelper.fillSplineForce(spline, world, wood, pos, replacement); - + for (int j = 0; j < leafCount; j++) { float delta = ((float) j / (float) (leafCount - 1)); float scale = (float) Math.sin(delta * Math.PI) * 0.8F + 0.2F; - float index = MathHelper.lerp(delta, 1F, 3.9F); + float index = Mth.lerp(delta, 1F, 3.9F); Vector3f point = SplineHelper.getPos(spline, index); - + List side = SplineHelper.copySpline(SIDE); SplineHelper.rotateSpline(side, angle); SplineHelper.scale(side, scale * radius); - BlockPos p = pos.add(point.getX() + 0.5F, point.getY() + 0.5F, point.getZ() + 0.5F); + BlockPos p = pos.offset(point.x() + 0.5F, point.y() + 0.5F, point.z() + 0.5F); SplineHelper.fillSplineForce(side, world, wood, p, replacement); } } - - sphere.fillArea(world, pos, new Box(pos.up((int) offsetY)).expand(radius * 1.3F)); + + sphere.fillArea(world, pos, new AABB(pos.above((int) offsetY)).inflate(radius * 1.3F)); } - - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood, Function replacement) { + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, + Function replacement) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, replacement); } } } - + static { - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - - LEAF = Lists.newArrayList( - new Vector3f(0.00F, 0.0F, 0), - new Vector3f(0.10F, 0.4F, 0), - new Vector3f(0.40F, 0.8F, 0), - new Vector3f(0.75F, 0.9F, 0), - new Vector3f(1.00F, 0.8F, 0) - ); - - SIDE = Lists.newArrayList( - new Vector3f(0, -0.3F, -0.5F), - new Vector3f(0, -0.1F, -0.3F), - new Vector3f(0, 0.0F, 0.0F), - new Vector3f(0, -0.1F, 0.3F), - new Vector3f(0, -0.3F, 0.5F) - ); + + LEAF = Lists.newArrayList(new Vector3f(0.00F, 0.0F, 0), new Vector3f(0.10F, 0.4F, 0), + new Vector3f(0.40F, 0.8F, 0), new Vector3f(0.75F, 0.9F, 0), new Vector3f(1.00F, 0.8F, 0)); + + SIDE = Lists.newArrayList(new Vector3f(0, -0.3F, -0.5F), new Vector3f(0, -0.1F, -0.3F), + new Vector3f(0, 0.0F, 0.0F), new Vector3f(0, -0.1F, 0.3F), new Vector3f(0, -0.3F, 0.5F)); } } diff --git a/src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java similarity index 73% rename from src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java rename to src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index f3ea48b9..507cfc15 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,89 +1,89 @@ -package ru.betterend.compat.rei; - -import java.text.DecimalFormat; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIAlloyingCategory implements TransferRecipeCategory { - - @Override - public @NotNull Identifier getIdentifier() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getTranslationKey()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.END_STONE_SMELTER; - } - - @Override - public @NotNull List setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); - double smeltTime = display.getSmeltTime(); - DecimalFormat df = new DecimalFormat("###.##"); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); - widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), - new TranslatableText("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); - List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); - if (inputEntries.size() > 1) { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); - } else { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); - } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); - return widgets; - } - - @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, - IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.push(); - matrices.translate(0, 0, 400); - if (redSlots.contains(0)) { - DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); - DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); - } - matrices.pop(); - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } - - @Override - public int getDisplayHeight() { - return 49; - } -} +package ru.betterend.integration.rei; + +import java.text.DecimalFormat; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.LangUtil; + +public class REIAlloyingCategory implements TransferRecipeCategory { + + @Override + public @NotNull ResourceLocation getIdentifier() { + return AlloyingRecipe.ID; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.END_STONE_SMELTER; + } + + @Override + public @NotNull List setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); + double smeltTime = display.getSmeltTime(); + DecimalFormat df = new DecimalFormat("###.##"); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); + widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), + new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); + List> inputEntries = display.getInputEntries(); + widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); + if (inputEntries.size() > 1) { + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); + } else { + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); + } + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, + IntList redSlots) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + matrices.pushPose(); + matrices.translate(0, 0, 400); + if (redSlots.contains(0)) { + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); + } + matrices.popPose(); + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { + return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + } + + @Override + public int getDisplayHeight() { + return 49; + } +} diff --git a/src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java similarity index 67% rename from src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java index b5a91a95..5937c021 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; @@ -10,13 +10,13 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.item.Item; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.recipe.builders.AlloyingRecipe; @@ -32,18 +32,18 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { public REIAlloyingDisplay(AlloyingRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); this.smeltTime = recipe.getSmeltTime(); } public REIAlloyingDisplay(BlastingRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); - this.smeltTime = recipe.getCookTime(); + this.smeltTime = recipe.getCookingTime(); } public static List getFuel() { @@ -51,7 +51,7 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @@ -66,7 +66,7 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } @@ -98,14 +98,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { return this.input; } static { fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() - .map(Item::getDefaultStack).map(EntryStack::create) - .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableText("category.rei.smelting.fuel") - .formatted(Formatting.YELLOW)))).collect(Collectors.toList()); + .map(Item::getDefaultInstance).map(EntryStack::create) + .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel") + .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java new file mode 100644 index 00000000..8b7a552a --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -0,0 +1,92 @@ +package ru.betterend.integration.rei; + +import java.text.DecimalFormat; +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeCategory; +import me.shedaniel.rei.api.widgets.Slot; +import me.shedaniel.rei.api.widgets.Tooltip; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; + +public class REIAlloyingFuelCategory implements RecipeCategory { + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); + + @Override + public @NotNull ResourceLocation getIdentifier() { + return REIPlugin.ALLOYING_FUEL; + } + + @Override + public @NotNull String getCategoryName() { + return I18n.get("category.rei.fuel"); + } + + @Override + public int getDisplayHeight() { + return 49; + } + + @Override + public @NotNull EntryStack getLogo() { + return EntryStack.create(Items.COAL); + } + + @Override + public @NotNull List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); + String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)) + .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); + return widgets; + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); + String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); + return new RecipeEntry() { + private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); + + @Override + public int getHeight() { + return 22; + } + + @Nullable + @Override + public Tooltip getTooltip(Point point) { + if (slot.containsMouse(point)) + return slot.getCurrentTooltip(point); + return null; + } + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + slot.setZ(getZ() + 50); + slot.getBounds().setLocation(bounds.x + 4, bounds.y + 2); + slot.render(matrices, mouseX, mouseY, delta); + Minecraft.getInstance().font.drawShadow(matrices, text.getVisualOrderText(), bounds.x + 25, bounds.y + 8, -1); + } + }; + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java new file mode 100644 index 00000000..d9e9d827 --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -0,0 +1,40 @@ +package ru.betterend.integration.rei; + +import java.util.Collections; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeDisplay; +import net.minecraft.resources.ResourceLocation; + +public class REIAlloyingFuelDisplay implements RecipeDisplay { + private final EntryStack fuel; + private final int fuelTime; + + public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { + this.fuel = fuel; + this.fuelTime = fuelTime; + } + + @Override + public @NotNull List> getInputEntries() { + return Collections.singletonList(Collections.singletonList(fuel)); + } + + @Override + public @NotNull List> getResultingEntries() { + return Collections.emptyList(); + } + + @Override + public @NotNull ResourceLocation getRecipeCategory() { + return REIPlugin.ALLOYING_FUEL; + } + + public int getFuelTime() { + return fuelTime; + } + +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java new file mode 100644 index 00000000..fddf1a83 --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -0,0 +1,101 @@ +package ru.betterend.integration.rei; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.util.LangUtil; + +public class REIAnvilCategory implements TransferRecipeCategory { + + @Override + public @NotNull ResourceLocation getIdentifier() { + return REIPlugin.SMITHING; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.ANVILS[0]; + } + + @Override + public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + int x = startPoint.x + 10; + int y = startPoint.y; + widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); + List> inputEntries = display.getInputEntries(); + List materials = inputEntries.get(1); + int anvilLevel = display.getAnvilLevel(); + List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { + Block block = ((BlockItem) anvil.getItem()).getBlock(); + if (block instanceof EndAnvilBlock) { + return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; + } + return anvilLevel == 1; + }).collect(Collectors.toList()); + materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); + widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), + new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); + + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, + IntList redSlots) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + matrices.pushPose(); + matrices.translate(0, 0, 400); + if (redSlots.contains(0)) { + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); + } + matrices.popPose(); + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { + return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); + } + + @Override + public int getDisplayHeight() { + return 60; + } + +} diff --git a/src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java similarity index 54% rename from src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 2de2d777..3ca2f929 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; @@ -9,29 +9,37 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.recipe.Recipe; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.Identifier; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.crafting.Recipe; +import ru.betterend.recipe.builders.AnvilRecipe; public class REIAnvilDisplay implements TransferRecipeDisplay { - private AnvilSmithingRecipe recipe; - private List> input; - private List output; + private final AnvilRecipe recipe; + private final List> input; + private final List output; - public REIAnvilDisplay(AnvilSmithingRecipe recipe) { + public REIAnvilDisplay(AnvilRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); } public int getDamage() { - return this.recipe.getDamage(); + return recipe.getDamage(); + } + + public int getInputCount() { + return recipe.getInputCount(); + } + + public int getAnvilLevel() { + return recipe.getAnvilLevel(); } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @@ -46,13 +54,13 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return REIPlugin.SMITHING; } @Override public @NotNull List> getRequiredEntries() { - return this.input; + return input; } @Override @@ -66,8 +74,8 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - ScreenHandler container) { - return this.input; + public List> getOrganisedInputEntries(ContainerInfo containerInfo, + AbstractContainerMenu container) { + return input; } } diff --git a/src/main/java/ru/betterend/compat/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java similarity index 92% rename from src/main/java/ru/betterend/compat/rei/REIContainer.java rename to src/main/java/ru/betterend/integration/rei/REIContainer.java index dae79d5f..9d6a0118 100644 --- a/src/main/java/ru/betterend/compat/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; import me.shedaniel.rei.server.ContainerInfoHandler; diff --git a/src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java similarity index 82% rename from src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java rename to src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index c304659b..5acb5b12 100644 --- a/src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,81 +1,81 @@ -package ru.betterend.compat.rei; - -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.InfusionRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIInfusionCategory implements TransferRecipeCategory { - - private final static Identifier BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); - - @Override - public @NotNull Identifier getIdentifier() { - return InfusionRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getTranslationKey()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.INFUSION_RITUAL; - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } - - @Override - public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { - Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - List> inputEntries = display.getInputEntries(); - List> outputEntries = display.getResultingEntries(); - widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); - widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); - widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableText("category.rei.infusion.time&val", display.getInfusionTime())) - .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - return widgets; - } - - @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} - - @Override - public int getDisplayHeight() { - return 104; - } -} +package ru.betterend.integration.rei; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.BetterEnd; +import ru.betterend.recipe.builders.InfusionRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.LangUtil; + +public class REIInfusionCategory implements TransferRecipeCategory { + + private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); + + @Override + public @NotNull ResourceLocation getIdentifier() { + return InfusionRecipe.ID; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.INFUSION_RITUAL; + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { + return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + } + + @Override + public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { + Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + List> inputEntries = display.getInputEntries(); + List> outputEntries = display.getResultingEntries(); + widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); + widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())) + .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, + REIInfusionDisplay display, IntList redSlots) {} + + @Override + public int getDisplayHeight() { + return 104; + } +} diff --git a/src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java similarity index 77% rename from src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index 644b0d3c..d8411bc9 100644 --- a/src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; @@ -11,9 +11,9 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.recipe.Recipe; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.InfusionRecipe; @@ -27,10 +27,10 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { public REIInfusionDisplay(InfusionRecipe recipe) { this.recipe = recipe; this.input = Lists.newArrayList(); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.time = recipe.getInfusionTime(); - recipe.getPreviewInputs().forEach(ingredient -> { + recipe.getIngredients().forEach(ingredient -> { input.add(EntryStack.ofIngredient(ingredient)); }); } @@ -40,7 +40,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @@ -55,7 +55,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } @@ -75,7 +75,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { return this.input; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java new file mode 100644 index 00000000..8ac01152 --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -0,0 +1,91 @@ +package ru.betterend.integration.rei; + +import java.util.List; +import java.util.stream.Collectors; + +import com.google.common.collect.Lists; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeHelper; +import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.plugin.DefaultPlugin; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; +import ru.betterend.recipe.builders.InfusionRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +@Environment(EnvType.CLIENT) +public class REIPlugin implements REIPluginV0 { + + public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); + public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); + public final static ResourceLocation ALLOYING = AlloyingRecipe.ID; + public final static ResourceLocation SMITHING = AnvilRecipe.ID; + public final static ResourceLocation INFUSION = InfusionRecipe.ID; + + public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); + public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); + public final static EntryStack[] FURNACES; + public final static EntryStack[] ANVILS; + + @Override + public ResourceLocation getPluginIdentifier() { + return PLUGIN_ID; + } + + @Override + public void registerRecipeDisplays(RecipeHelper recipeHelper) { + recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); + recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); + recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); + recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); + FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { + if (time >= 2000) { + recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); + } + }); + } + + @Override + public void registerOthers(RecipeHelper recipeHelper) { + recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); + recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); + recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); + recipeHelper.registerWorkingStations(SMITHING, ANVILS); + recipeHelper.removeAutoCraftButton(ALLOYING_FUEL); + recipeHelper.removeAutoCraftButton(SMITHING); + + recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); + recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); + } + + @Override + public void registerPluginCategories(RecipeHelper recipeHelper) { + recipeHelper.registerCategories( + new REIAlloyingFuelCategory(), + new REIAlloyingCategory(), + new REIInfusionCategory(), + new REIAnvilCategory()); + } + + static { + List anvils = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() + .filter(item -> ((BlockItem) item).getBlock() instanceof EndAnvilBlock).collect(Collectors.toList()))); + anvils.add(0, EntryStack.create(Blocks.ANVIL)); + ANVILS = anvils.toArray(new EntryStack[0]); + FURNACES = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() + .filter(item -> ((BlockItem) item).getBlock() instanceof EndFurnaceBlock).collect(Collectors.toList()))) + .toArray(new EntryStack[0]); + } +} diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java new file mode 100644 index 00000000..9146ab8e --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -0,0 +1,33 @@ +package ru.betterend.interfaces; + +import java.util.List; + +import ru.betterend.recipe.builders.AnvilRecipe; + +public interface AnvilScreenHandlerExtended { + void be_updateCurrentRecipe(AnvilRecipe recipe); + AnvilRecipe be_getCurrentRecipe(); + List be_getRecipes(); + + default void be_nextRecipe() { + List recipes = be_getRecipes(); + if (recipes.size() < 2) return; + AnvilRecipe current = be_getCurrentRecipe(); + int i = recipes.indexOf(current) + 1; + if (i >= recipes.size()) { + i = 0; + } + be_updateCurrentRecipe(recipes.get(i)); + } + + default void be_previousRecipe() { + List recipes = be_getRecipes(); + if (recipes.size() < 2) return; + AnvilRecipe current = be_getCurrentRecipe(); + int i = recipes.indexOf(current) - 1; + if (i <= 0) { + i = recipes.size() - 1; + } + be_updateCurrentRecipe(recipes.get(i)); + } +} diff --git a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java new file mode 100644 index 00000000..9f939661 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java @@ -0,0 +1,3 @@ +package ru.betterend.interfaces; + +public interface BetterEndRecipe {} diff --git a/src/main/java/ru/betterend/interfaces/BreakableItem.java b/src/main/java/ru/betterend/interfaces/BreakableItem.java new file mode 100644 index 00000000..7af4687b --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/BreakableItem.java @@ -0,0 +1,5 @@ +package ru.betterend.interfaces; + +public interface BreakableItem { + void registerBrokenItem(); +} diff --git a/src/main/java/ru/betterend/interfaces/IBiomeArray.java b/src/main/java/ru/betterend/interfaces/IBiomeArray.java new file mode 100644 index 00000000..9c632b6d --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/IBiomeArray.java @@ -0,0 +1,8 @@ +package ru.betterend.interfaces; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.biome.Biome; + +public interface IBiomeArray { + public void be_setBiome(Biome biome, BlockPos pos); +} diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java new file mode 100644 index 00000000..4dbbfde4 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/IBiomeList.java @@ -0,0 +1,10 @@ +package ru.betterend.interfaces; + +import java.util.List; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +public interface IBiomeList { + public List> getBiomes(); +} diff --git a/src/main/java/ru/betterend/interfaces/IColorProvider.java b/src/main/java/ru/betterend/interfaces/IColorProvider.java index ae6d0db5..f8b5ba51 100644 --- a/src/main/java/ru/betterend/interfaces/IColorProvider.java +++ b/src/main/java/ru/betterend/interfaces/IColorProvider.java @@ -1,10 +1,10 @@ package ru.betterend.interfaces; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; public interface IColorProvider { - BlockColorProvider getProvider(); + BlockColor getProvider(); - ItemColorProvider getItemProvider(); + ItemColor getItemProvider(); } diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 646490c8..7df19bc6 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,5 @@ package ru.betterend.interfaces; public interface ISlime { - public void setSlimeSize(int size, boolean heal); + public void be_setSlimeSize(int size, boolean heal); } diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java new file mode 100644 index 00000000..ef19bc36 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/ISpetialItem.java @@ -0,0 +1,7 @@ +package ru.betterend.interfaces; + +public interface ISpetialItem { + public int getStackSize(); + + public boolean canPlaceOnWater(); +} diff --git a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java b/src/main/java/ru/betterend/interfaces/IdentifiedContext.java deleted file mode 100644 index e03bfbb6..00000000 --- a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.betterend.interfaces; - -import net.minecraft.util.Identifier; - -public interface IdentifiedContext { - public Identifier getContextId(); - public void setContextId(Identifier id); - - default void removeId() { - this.setContextId(null); - } -} diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index f91957b6..cfd23f30 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -1,14 +1,9 @@ package ru.betterend.interfaces; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public interface TeleportingEntity { - public abstract long beGetCooldown(); - public abstract void beSetCooldown(long time); - public abstract void beSetExitPos(BlockPos pos); - public abstract BlockPos beGetExitPos(); - - default boolean hasCooldown() { - return this.beGetCooldown() > 0; - } + void be_setExitPos(BlockPos pos); + void be_resetExitPos(); + boolean be_canTeleport(); } diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java new file mode 100644 index 00000000..d5604248 --- /dev/null +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -0,0 +1,59 @@ +package ru.betterend.item; + +import net.fabricmc.fabric.api.item.v1.EquipmentSlotProvider; +import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.BreakableItem; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class ArmoredElytra extends ElytraItem implements EquipmentSlotProvider, BreakableItem, Patterned { + + private final ResourceLocation wingTexture; + private final Item repairItem; + private final double movementFactor; + + public ArmoredElytra(String name, Item repairItem, int durability, double movementFactor, boolean fireproof) { + super(fireproof ? EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE).fireResistant() : + EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE)); + this.wingTexture = BetterEnd.makeID("textures/entity/" + name + ".png"); + this.repairItem = repairItem; + this.movementFactor = movementFactor; + } + + public double getMovementFactor() { + return movementFactor; + } + + public ResourceLocation getWingTexture() { + return wingTexture; + } + + @Override + public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) { + return itemStack2.getItem() == repairItem; + } + + @Override + public void registerBrokenItem() { + FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), + (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createItemGenerated(name); + } + + @Override + public EquipmentSlot getPreferredEquipmentSlot(ItemStack stack) { + return EquipmentSlot.CHEST; + } +} diff --git a/src/main/java/ru/betterend/item/DrinkItem.java b/src/main/java/ru/betterend/item/DrinkItem.java new file mode 100644 index 00000000..50e4ad1a --- /dev/null +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -0,0 +1,54 @@ +package ru.betterend.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; + +public class DrinkItem extends PatternedItem { + public DrinkItem(Properties settings) { + super(settings); + } + + @Override + public int getUseDuration(ItemStack stack) { + return 32; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.DRINK; + } + + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + return ItemUtils.useDrink(world, user, hand); + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level world, LivingEntity user) { + if (user instanceof ServerPlayer) { + ServerPlayer serverPlayerEntity = (ServerPlayer) user; + CriteriaTriggers.CONSUME_ITEM.trigger(serverPlayerEntity, stack); + serverPlayerEntity.awardStat(Stats.ITEM_USED.get(this)); + } + + if (user instanceof Player && !((Player) user).abilities.instabuild) { + stack.shrink(1); + } + + if (!world.isClientSide) { + user.removeAllEffects(); + } + + return stack.isEmpty() ? new ItemStack(Items.GLASS_BOTTLE) : stack; + } +} diff --git a/src/main/java/ru/betterend/item/EnchantedPetalItem.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java new file mode 100644 index 00000000..27d04935 --- /dev/null +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -0,0 +1,22 @@ +package ru.betterend.item; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class EnchantedPetalItem extends PatternedItem { + public EnchantedPetalItem() { + super(EndItems.makeItemSettings().rarity(Rarity.RARE).stacksTo(16)); + } + + @Override + public boolean isFoil(ItemStack stack) { + return true; + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/hydralux_petal"); + } +} diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java new file mode 100644 index 00000000..e9272779 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -0,0 +1,44 @@ +package ru.betterend.item; + +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.registry.EndItems; + +public class EndAnvilItem extends BlockItem { + public EndAnvilItem(Block block) { + super(block, EndItems.makeBlockItemSettings()); + } + + @Override + protected BlockState getPlacementState(BlockPlaceContext blockPlaceContext) { + BlockState blockState = super.getPlacementState(blockPlaceContext); + ItemStack stack = blockPlaceContext.getItemInHand(); + int level = stack.getOrCreateTag().getInt("level"); + blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDestructionProperty(), level); + return blockState; + } + + @Override + @Environment(EnvType.CLIENT) + public void appendHoverText(ItemStack itemStack, @Nullable Level level, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, level, list, tooltipFlag); + int l = itemStack.getOrCreateTag().getInt("level"); + if (l > 0) { + list.add(new TranslatableComponent("message.betterend.anvil_damage").append(": " + l)); + } + } +} diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java new file mode 100644 index 00000000..61ed97d1 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -0,0 +1,52 @@ +package ru.betterend.item; + +import java.util.UUID; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Item; +import ru.betterend.mixin.common.ArmorItemAccessor; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndArmorItem extends ArmorItem implements Patterned { + public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Properties settings) { + super(material, slot, settings); + + addKnockbackResistance((ArmorItemAccessor) this, slot, this.knockbackResistance); + } + + /** Ensures knockback resistance is actually applied */ + private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) { + if (knockbackResistance == 0) { + return; + } + + Multimap attributeModifiers = accessor.be_getDefaultModifiers(); + + // In case Mojang or anyone else decided to fix this + if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) { + return; + } + + UUID uuid = accessor.be_getModifiers()[slot.getIndex()]; + + // Rebuild attributeModifiers to include knockback resistance + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.putAll(attributeModifiers); + builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); + accessor.be_setDefaultModifiers(builder.build()); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/item/EndAxe.java b/src/main/java/ru/betterend/item/EndAxe.java deleted file mode 100644 index 7667dadd..00000000 --- a/src/main/java/ru/betterend/item/EndAxe.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.betterend.item; - -import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.AxeItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; -import ru.betterend.patterns.Patterned; -import ru.betterend.patterns.Patterns; - -public class EndAxe extends AxeItem implements DynamicAttributeTool, Patterned { - - public EndAxe(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(FabricToolTags.AXES)) { - return this.getMaterial().getMiningLevel(); - } - return 0; - } - - @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_HANDHELD, name); - } -} diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java new file mode 100644 index 00000000..5b84e7a4 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -0,0 +1,18 @@ +package ru.betterend.item; + +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class EndBucketItem extends BucketItem implements Patterned { + public EndBucketItem() { + super(Fluids.WATER, EndItems.makeItemSettings().stacksTo(1)); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/item/EndHammer.java b/src/main/java/ru/betterend/item/EndHammer.java deleted file mode 100644 index ff92a6bd..00000000 --- a/src/main/java/ru/betterend/item/EndHammer.java +++ /dev/null @@ -1,142 +0,0 @@ -package ru.betterend.item; - -import java.util.UUID; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableMultimap.Builder; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - -import io.netty.util.internal.ThreadLocalRandom; -import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MiningToolItem; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import ru.betterend.patterns.Patterned; -import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndTags; - -public class EndHammer extends MiningToolItem implements DynamicAttributeTool, Patterned { - - public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current()); - - private final Multimap attributeModifiers; - - public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { - super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); - - Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", attackDamage + material.getAttackDamage(), EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); - this.attributeModifiers = builder.build(); - } - - @Override - public boolean canMine(BlockState state, World world, BlockPos pos, PlayerEntity miner) { - return state.getMaterial().equals(Material.STONE) || - state.getMaterial().equals(Material.GLASS) || - state.isOf(Blocks.DIAMOND_BLOCK) || - state.isOf(Blocks.EMERALD_BLOCK) || - state.isOf(Blocks.LAPIS_BLOCK) || - state.isOf(Blocks.REDSTONE_BLOCK); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - stack.damage(1, attacker, ((entity) -> { - entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); - })); - - return true; - } - - @Override - public boolean postMine(ItemStack stack, World world, BlockState state, BlockPos pos, LivingEntity miner) { - if (state.getHardness(world, pos) != 0.0F) { - stack.damage(1, miner, ((entity) -> { - entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); - })); - } - - return true; - } - - @Override - public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { - if (state.getMaterial().equals(Material.GLASS)) { - return this.getMaterial().getMiningSpeedMultiplier() * 2.0F; - } - if (isEffectiveOn(state)) { - float mult = 1.0F; - if (state.isOf(Blocks.DIAMOND_BLOCK) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.REDSTONE_BLOCK)) { - mult = this.getMaterial().getMiningSpeedMultiplier(); - } else { - mult = this.getMaterial().getMiningSpeedMultiplier() / 2.0F; - } - return mult > 1.0F ? mult : 1.0F; - } - return 1.0F; - } - - @Override - public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { - return this.getMiningSpeedMultiplier(stack, state); - } - return 1.0F; - } - - @Override - public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { - return this.getMaterial().getMiningLevel(); - } - return 0; - } - - @Override - public boolean isEffectiveOn(BlockState state) { - if (state.getMaterial().equals(Material.GLASS)) { - return true; - } - if (!state.isOf(Blocks.REDSTONE_BLOCK) && !state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.EMERALD_BLOCK) && !state.isOf(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { - return false; - } - int level = this.getMaterial().getMiningLevel(); - if (state.isOf(Blocks.IRON_ORE) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.LAPIS_ORE)) { - return level >= 1; - } - if (state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.DIAMOND_ORE) || state.isOf(Blocks.EMERALD_ORE) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.GOLD_ORE) || state.isOf(Blocks.REDSTONE_ORE)) { - return level >= 2; - } - if (state.isOf(Blocks.OBSIDIAN) || state.isOf(Blocks.CRYING_OBSIDIAN) || state.isOf(Blocks.RESPAWN_ANCHOR) || state.isOf(Blocks.ANCIENT_DEBRIS)) { - return level >= 3; - } - return true; - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getAttributeModifiers(slot); - } - - @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_HANDHELD, name); - } -} diff --git a/src/main/java/ru/betterend/item/EndHoe.java b/src/main/java/ru/betterend/item/EndHoe.java deleted file mode 100644 index c9a75032..00000000 --- a/src/main/java/ru/betterend/item/EndHoe.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.betterend.item; - -import net.minecraft.item.HoeItem; -import net.minecraft.item.ToolMaterial; -import ru.betterend.patterns.Patterned; -import ru.betterend.patterns.Patterns; - -public class EndHoe extends HoeItem implements Patterned { - - public EndHoe(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_HANDHELD, name); - } -} diff --git a/src/main/java/ru/betterend/item/EndPickaxe.java b/src/main/java/ru/betterend/item/EndPickaxe.java deleted file mode 100644 index 750acb42..00000000 --- a/src/main/java/ru/betterend/item/EndPickaxe.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.betterend.item; - -import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.PickaxeItem; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; -import ru.betterend.patterns.Patterned; -import ru.betterend.patterns.Patterns; - -public class EndPickaxe extends PickaxeItem implements DynamicAttributeTool, Patterned { - - public EndPickaxe(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(FabricToolTags.PICKAXES)) { - return this.getMaterial().getMiningLevel(); - } - return 0; - } - - @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_HANDHELD, name); - } -} diff --git a/src/main/java/ru/betterend/item/ItemSpawnEgg.java b/src/main/java/ru/betterend/item/EndSpawnEggItem.java similarity index 50% rename from src/main/java/ru/betterend/item/ItemSpawnEgg.java rename to src/main/java/ru/betterend/item/EndSpawnEggItem.java index d1b0583f..cf2d2e35 100644 --- a/src/main/java/ru/betterend/item/ItemSpawnEgg.java +++ b/src/main/java/ru/betterend/item/EndSpawnEggItem.java @@ -1,12 +1,12 @@ package ru.betterend.item; -import net.minecraft.entity.EntityType; -import net.minecraft.item.SpawnEggItem; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.SpawnEggItem; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class ItemSpawnEgg extends SpawnEggItem implements Patterned { - public ItemSpawnEgg(EntityType type, int primaryColor, int secondaryColor, Settings settings) { +public class EndSpawnEggItem extends SpawnEggItem implements Patterned { + public EndSpawnEggItem(EntityType type, int primaryColor, int secondaryColor, Properties settings) { super(type, primaryColor, secondaryColor, settings); } diff --git a/src/main/java/ru/betterend/item/EternalCrystal.java b/src/main/java/ru/betterend/item/EternalCrystal.java deleted file mode 100644 index 656c4b32..00000000 --- a/src/main/java/ru/betterend/item/EternalCrystal.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.betterend.item; - -import ru.betterend.registry.EndItems; - -public class EternalCrystal extends PatternedItem { - - public EternalCrystal() { - super(EndItems.makeItemSettings().maxCount(16)); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/item/EternalCrystalItem.java b/src/main/java/ru/betterend/item/EternalCrystalItem.java new file mode 100644 index 00000000..8a547347 --- /dev/null +++ b/src/main/java/ru/betterend/item/EternalCrystalItem.java @@ -0,0 +1,10 @@ +package ru.betterend.item; + +import net.minecraft.world.item.Rarity; +import ru.betterend.registry.EndItems; + +public class EternalCrystalItem extends PatternedItem { + public EternalCrystalItem() { + super(EndItems.makeItemSettings().stacksTo(16).rarity(Rarity.EPIC)); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/item/GuideBook.java b/src/main/java/ru/betterend/item/GuideBook.java deleted file mode 100644 index 702c9cd5..00000000 --- a/src/main/java/ru/betterend/item/GuideBook.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.betterend.item; - -import java.util.List; - -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; -import ru.betterend.BetterEnd; -import ru.betterend.registry.EndItems; -import ru.betterend.util.LangUtil; -import vazkii.patchouli.api.PatchouliAPI; - -public class GuideBook extends PatternedItem { - - public final static Identifier BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBook()); - - public static void register() {} - - public GuideBook() { - super(EndItems.makeItemSettings().maxCount(1)); - } - - @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { - if (!world.isClient && user instanceof ServerPlayerEntity) { - PatchouliAPI.get().openBookGUI((ServerPlayerEntity) user, BOOK_ID); - return TypedActionResult.success(user.getStackInHand(hand)); - } - return TypedActionResult.consume(user.getStackInHand(hand)); - } - - @Override - public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { - tooltip.add(LangUtil.getText("book.betterend", "subtitle").formatted(Formatting.DARK_PURPLE, Formatting.ITALIC)); - } -} diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java new file mode 100644 index 00000000..915ae3b3 --- /dev/null +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -0,0 +1,44 @@ +package ru.betterend.item; + +import java.util.List; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import ru.betterend.BetterEnd; +import ru.betterend.registry.EndItems; +import ru.betterend.util.LangUtil; +import vazkii.patchouli.api.PatchouliAPI; + +public class GuideBookItem extends PatternedItem { + public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); + public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); + + public static void register() {} + + public GuideBookItem() { + super(EndItems.makeItemSettings().stacksTo(1)); + } + + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { + PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); + return InteractionResultHolder.success(user.getItemInHand(hand)); + } + return InteractionResultHolder.consume(user.getItemInHand(hand)); + } + + @Override + public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { + tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } +} diff --git a/src/main/java/ru/betterend/item/PatternedDiscItem.java b/src/main/java/ru/betterend/item/PatternedDiscItem.java new file mode 100644 index 00000000..44a32123 --- /dev/null +++ b/src/main/java/ru/betterend/item/PatternedDiscItem.java @@ -0,0 +1,17 @@ +package ru.betterend.item; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.RecordItem; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class PatternedDiscItem extends RecordItem implements Patterned { + public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Properties settings) { + super(comparatorOutput, sound, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/item/PatternedItem.java b/src/main/java/ru/betterend/item/PatternedItem.java index c2b8eeff..2d5dce7a 100644 --- a/src/main/java/ru/betterend/item/PatternedItem.java +++ b/src/main/java/ru/betterend/item/PatternedItem.java @@ -1,16 +1,16 @@ package ru.betterend.item; -import net.minecraft.item.Item; +import net.minecraft.world.item.Item; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class PatternedItem extends Item implements Patterned { - public PatternedItem(Settings settings) { + public PatternedItem(Properties settings) { super(settings); } @Override public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_GENERATED, name); + return Patterns.createItemGenerated(name); } } diff --git a/src/main/java/ru/betterend/item/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java similarity index 57% rename from src/main/java/ru/betterend/item/EndArmorMaterial.java rename to src/main/java/ru/betterend/item/material/EndArmorMaterial.java index b3ae46e0..13358a76 100644 --- a/src/main/java/ru/betterend/item/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -1,26 +1,30 @@ -package ru.betterend.item; +package ru.betterend.item.material; import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ArmorMaterial; -import net.minecraft.recipe.Ingredient; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Lazy; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.LazyLoadedValue; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndArmorMaterial implements ArmorMaterial { - TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { + return Ingredient.of(EndBlocks.THALLASIUM.ingot); }), - AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { - return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + return Ingredient.of(EndBlocks.TERMINITE.ingot); }), - CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { + return Ingredient.of(EndItems.AETERNIUM_INGOT); + }), + CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { + return Ingredient.of(EndBlocks.TERMINITE.ingot); }); private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; @@ -31,7 +35,7 @@ public enum EndArmorMaterial implements ArmorMaterial { private final SoundEvent equipSound; private final float toughness; private final float knockbackResistance; - private final Lazy repairIngredient; + private final LazyLoadedValue repairIngredient; private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, SoundEvent equipSound, float toughness, float knockbackResistance, @@ -44,21 +48,21 @@ public enum EndArmorMaterial implements ArmorMaterial { this.equipSound = equipSound; this.toughness = toughness; this.knockbackResistance = knockbackResistance; - this.repairIngredient = new Lazy<>(repairIngredient); + this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } @Override - public int getDurability(EquipmentSlot slot) { - return BASE_DURABILITY[slot.getEntitySlotId()] * this.durabilityMultiplier; + public int getDurabilityForSlot(EquipmentSlot slot) { + return BASE_DURABILITY[slot.getIndex()] * this.durabilityMultiplier; } @Override - public int getProtectionAmount(EquipmentSlot slot) { - return this.protectionAmounts[slot.getEntitySlotId()]; + public int getDefenseForSlot(EquipmentSlot slot) { + return this.protectionAmounts[slot.getIndex()]; } @Override - public int getEnchantability() { + public int getEnchantmentValue() { return this.enchantability; } diff --git a/src/main/java/ru/betterend/item/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java similarity index 55% rename from src/main/java/ru/betterend/item/EndToolMaterial.java rename to src/main/java/ru/betterend/item/material/EndToolMaterial.java index 85dcc3e4..9c0197ae 100644 --- a/src/main/java/ru/betterend/item/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,18 +1,22 @@ -package ru.betterend.item; +package ru.betterend.item.material; import java.util.function.Supplier; -import net.minecraft.item.ToolMaterial; -import net.minecraft.recipe.Ingredient; -import net.minecraft.util.Lazy; +import net.minecraft.util.LazyLoadedValue; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.Ingredient; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -public enum EndToolMaterial implements ToolMaterial { +public enum EndToolMaterial implements Tier { + THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { + return Ingredient.of(EndBlocks.THALLASIUM.ingot); + }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + return Ingredient.of(EndBlocks.TERMINITE.ingot); }), AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { - return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + return Ingredient.of(EndItems.AETERNIUM_INGOT); }); private final int durability; @@ -20,7 +24,7 @@ public enum EndToolMaterial implements ToolMaterial { private final float attackDamage; private final int miningLevel; private final int enchantability; - private final Lazy repairIngredient; + private final LazyLoadedValue repairIngredient; private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, Supplier repairIngredient) { @@ -30,31 +34,31 @@ public enum EndToolMaterial implements ToolMaterial { this.attackDamage = attackDamage; this.miningLevel = miningLevel; this.enchantability = enchantability; - this.repairIngredient = new Lazy<>(repairIngredient); + this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } @Override - public int getDurability() { + public int getUses() { return this.durability; } @Override - public float getMiningSpeedMultiplier() { + public float getSpeed() { return this.miningSpeed; } @Override - public float getAttackDamage() { + public float getAttackDamageBonus() { return this.attackDamage; } @Override - public int getMiningLevel() { + public int getLevel() { return this.miningLevel; } @Override - public int getEnchantability() { + public int getEnchantmentValue() { return this.enchantability; } diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java new file mode 100644 index 00000000..d5b5c1a0 --- /dev/null +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -0,0 +1,74 @@ +package ru.betterend.item.model; + +import com.google.common.collect.ImmutableList; + +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; + +public class ArmoredElytraModel extends AgeableListModel { + private final ModelPart rightWing; + private final ModelPart leftWing; + + public ArmoredElytraModel() { + this.leftWing = new ModelPart(this, 22, 0); + this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + this.rightWing = new ModelPart(this, 22, 0); + this.rightWing.mirror = true; + this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + } + + protected Iterable headParts() { + return ImmutableList.of(); + } + + protected Iterable bodyParts() { + return ImmutableList.of(leftWing, rightWing); + } + + public void setupAnim(T livingEntity, float f, float g, float h, float i, float j) { + float rotX = 0.2617994F; + float rotZ = -0.2617994F; + float rotY = 0.0F; + float wingY = 0.0F; + if (livingEntity.isFallFlying()) { + float coef = 1.0F; + Vec3 vec3 = livingEntity.getDeltaMovement(); + if (vec3.y < 0.0D) { + Vec3 normalized = vec3.normalize(); + coef = 1.0F - (float) Math.pow(-normalized.y, 2.5D); + } + rotX = coef * 0.34906584F + (1.0F - coef) * rotX; + rotZ = coef * -1.5707964F + (1.0F - coef) * rotZ; + } else if (livingEntity.isCrouching()) { + rotX = 0.6981317F; + rotZ = -0.7853982F; + rotY = 0.08726646F; + wingY = 3.0F; + } + + leftWing.x = 5.0F; + leftWing.y = wingY; + if (livingEntity instanceof AbstractClientPlayer) { + AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; + abstractClientPlayer.elytraRotX = (float) ((double) abstractClientPlayer.elytraRotX + (double) (rotX - abstractClientPlayer.elytraRotX) * 0.1D); + abstractClientPlayer.elytraRotY = (float) ((double) abstractClientPlayer.elytraRotY + (double) (rotY - abstractClientPlayer.elytraRotY) * 0.1D); + abstractClientPlayer.elytraRotZ = (float) ((double) abstractClientPlayer.elytraRotZ + (double) (rotZ - abstractClientPlayer.elytraRotZ) * 0.1D); + leftWing.xRot = abstractClientPlayer.elytraRotX; + leftWing.yRot = abstractClientPlayer.elytraRotY; + leftWing.zRot = abstractClientPlayer.elytraRotZ; + } else { + leftWing.xRot = rotX; + leftWing.zRot = rotZ; + leftWing.yRot = rotY; + } + + rightWing.x = -leftWing.x; + rightWing.yRot = -leftWing.yRot; + rightWing.y = leftWing.y; + rightWing.xRot = leftWing.xRot; + rightWing.zRot = -leftWing.zRot; + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index b80c871f..28e02a03 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -9,20 +9,19 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { - private final static Identifier FIRST_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_1.png"); - private final static Identifier SECOND_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_2.png"); + private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); + private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); @@ -30,35 +29,35 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); @Override - public @NotNull Identifier getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, - boolean secondLayer, @Nullable String suffix, Identifier defaultTexture) { + public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, + boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { if (!isStackValid(stack)) return defaultTexture; if (secondLayer) return SECOND_LAYER; return FIRST_LAYER; } @Override - public @NotNull BipedEntityModel getArmorModel(LivingEntity entity, ItemStack stack, - EquipmentSlot slot, BipedEntityModel defaultModel) { + public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, + EquipmentSlot slot, HumanoidModel defaultModel) { if (!isStackValid(stack)) return defaultModel; switch(slot) { case HEAD: { return HELMET_MODEL; } case CHEST: { - if (entity instanceof AbstractClientPlayerEntity && - ((AbstractClientPlayerEntity) entity).getModel().equals("slim")) { - CHEST_MODEL_SLIM.setAttributes(defaultModel); + if (entity instanceof AbstractClientPlayer && + ((AbstractClientPlayer) entity).getModelName().equals("slim")) { + CHEST_MODEL_SLIM.copyPropertiesTo(defaultModel); return CHEST_MODEL_SLIM; } - CHEST_MODEL.setAttributes(defaultModel); + CHEST_MODEL.copyPropertiesTo(defaultModel); return CHEST_MODEL; } case LEGS: { return LEGGINGS_MODEL; } case FEET: { - BOOTS_MODEL.setAttributes(defaultModel); + BOOTS_MODEL.copyPropertiesTo(defaultModel); return BOOTS_MODEL; } default: { diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index c0c05698..d1a37fde 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -1,43 +1,43 @@ -package ru.betterend.item.model; - -import java.util.Collections; - -import com.google.common.collect.Lists; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; - -public class CrystaliteBootsModel extends BipedEntityModel { - - public ModelPart leftBoot; - public ModelPart rightBoot; - - public CrystaliteBootsModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPivot(1.9F, 12.0F, 0.0F); - this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPivot(-1.9F, 12.0F, 0.0F); - } - - @Override - public void setAttributes(BipedEntityModel bipedEntityModel) { - super.setAttributes(bipedEntityModel); - this.leftBoot.copyPositionAndRotation(leftLeg); - this.rightBoot.copyPositionAndRotation(rightLeg); - } - - @Override - protected Iterable getHeadParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(leftBoot, rightBoot); - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteBootsModel extends HumanoidModel { + + public ModelPart leftBoot; + public ModelPart rightBoot; + + public CrystaliteBootsModel(float scale) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.leftBoot = new ModelPart(this, 0, 32); + this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftBoot.setPos(1.9F, 12.0F, 0.0F); + this.rightBoot = new ModelPart(this, 0, 16); + this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + } + + @Override + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftBoot.copyFrom(leftLeg); + this.rightBoot.copyFrom(rightLeg); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(leftBoot, rightBoot); + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 5a08f9d0..d0dd72f0 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -1,74 +1,74 @@ -package ru.betterend.item.model; - -import java.util.Collections; - -import com.google.common.collect.Lists; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Arm; - -public class CrystaliteChestplateModel extends BipedEntityModel { - - public ModelPart leftShoulder; - public ModelPart rightShoulder; - private boolean thinArms; - - public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.thinArms = thinArms; - this.torso = new ModelPart(this, 16, 16); - this.torso.addCuboid(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.torso.setPivot(0.0F, 0.0F, 0.0F); - if (thinArms) { - this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addCuboid(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPivot(5.0F, 2.5F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addCuboid(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPivot(-5.0F, 2.5F, 10.0F); - } else { - this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addCuboid(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPivot(5.0F, 2.0F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addCuboid(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPivot(-5.0F, 2.0F, 10.0F); - } - } - - @Override - public void setAttributes(BipedEntityModel bipedEntityModel) { - super.setAttributes(bipedEntityModel); - this.leftShoulder.copyPositionAndRotation(leftArm); - this.rightShoulder.copyPositionAndRotation(rightArm); - } - - @Override - protected Iterable getHeadParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(torso, leftShoulder, rightShoulder); - } - - @Override - public void setArmAngle(Arm arm, MatrixStack matrices) { - ModelPart modelPart = this.getArm(arm); - if (this.thinArms) { - float f = 0.5F * (float)(arm == Arm.RIGHT ? 1 : -1); - modelPart.pivotX += f; - modelPart.rotate(matrices); - modelPart.pivotX -= f; - } else { - modelPart.rotate(matrices); - } - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteChestplateModel extends HumanoidModel { + + public ModelPart leftShoulder; + public ModelPart rightShoulder; + private boolean thinArms; + + public CrystaliteChestplateModel(float scale, boolean thinArms) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.thinArms = thinArms; + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); + this.body.setPos(0.0F, 0.0F, 0.0F); + if (thinArms) { + this.leftShoulder = new ModelPart(this, 41, 32); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); + this.leftShoulder.mirror = true; + this.rightShoulder = new ModelPart(this, 41, 16); + this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); + } else { + this.leftShoulder = new ModelPart(this, 40, 32); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); + this.leftShoulder.mirror = true; + this.rightShoulder = new ModelPart(this, 40, 16); + this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + } + } + + @Override + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftShoulder.copyFrom(leftArm); + this.rightShoulder.copyFrom(rightArm); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(body, leftShoulder, rightShoulder); + } + + @Override + public void translateToHand(HumanoidArm arm, PoseStack matrices) { + ModelPart modelPart = this.getArm(arm); + if (this.thinArms) { + float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); + modelPart.x += f; + modelPart.translateAndRotate(matrices); + modelPart.x -= f; + } else { + modelPart.translateAndRotate(matrices); + } + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 6d759695..3513c2f4 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -6,28 +6,28 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; @Environment(EnvType.CLIENT) -public class CrystaliteHelmetModel extends BipedEntityModel { +public class CrystaliteHelmetModel extends HumanoidModel { public CrystaliteHelmetModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.helmet = new ModelPart(this, 0, 0); - this.helmet.addCuboid(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); - this.helmet.setPivot(0.0F, 0.0F, 0.0F); + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.hat = new ModelPart(this, 0, 0); + this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); + this.hat.setPos(0.0F, 0.0F, 0.0F); } @Override - protected Iterable getHeadParts() { + protected Iterable headParts() { return Collections::emptyIterator; } @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(helmet); + protected Iterable bodyParts() { + return Lists.newArrayList(hat); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index ea5d80fe..54772ebd 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -1,36 +1,36 @@ -package ru.betterend.item.model; - -import java.util.Collections; - -import com.google.common.collect.Lists; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; - -public class CrystaliteLeggingsModel extends BipedEntityModel { - - public CrystaliteLeggingsModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.torso = new ModelPart(this, 16, 16); - this.torso.addCuboid(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.torso.setPivot(0.0F, 0.0F, 0.0F); - this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPivot(1.9F, 12.0F, 0.0F); - this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPivot(-1.9F, 12.0F, 0.0F); - } - - @Override - protected Iterable getHeadParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(torso, rightLeg, leftLeg); - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteLeggingsModel extends HumanoidModel { + + public CrystaliteLeggingsModel(float scale) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); + this.body.setPos(0.0F, 0.0F, 0.0F); + this.leftLeg = new ModelPart(this, 0, 32); + this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.leftLeg.setPos(1.9F, 12.0F, 0.0F); + this.rightLeg = new ModelPart(this, 0, 16); + this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(body, rightLeg, leftLeg); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndAxeItem.java b/src/main/java/ru/betterend/item/tool/EndAxeItem.java new file mode 100644 index 00000000..0720695c --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndAxeItem.java @@ -0,0 +1,32 @@ +package ru.betterend.item.tool; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.tags.Tag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndAxeItem extends AxeItem implements DynamicAttributeTool, Patterned { + public EndAxeItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(FabricToolTags.AXES)) { + return this.getTier().getLevel(); + } + return 0; + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java new file mode 100644 index 00000000..2fe92f82 --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -0,0 +1,141 @@ +package ru.betterend.item.tool; + +import java.util.UUID; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableMultimap.Builder; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import io.netty.util.internal.ThreadLocalRandom; +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.Tag; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndTags; + +public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, Patterned { + public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.createInsecureUUID(ThreadLocalRandom.current()); + + private final Multimap attributeModifiers; + + public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { + super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); + + Builder builder = ImmutableMultimap.builder(); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", attackSpeed, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, AttributeModifier.Operation.ADDITION)); + this.attributeModifiers = builder.build(); + } + + @Override + public boolean canAttackBlock(BlockState state, Level world, BlockPos pos, Player miner) { + return state.getMaterial().equals(Material.STONE) || + state.getMaterial().equals(Material.GLASS) || + state.is(Blocks.DIAMOND_BLOCK) || + state.is(Blocks.EMERALD_BLOCK) || + state.is(Blocks.LAPIS_BLOCK) || + state.is(Blocks.REDSTONE_BLOCK); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + stack.hurtAndBreak(1, attacker, ((entity) -> { + entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); + })); + + return true; + } + + @Override + public boolean mineBlock(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { + if (state.getDestroySpeed(world, pos) != 0.0F) { + stack.hurtAndBreak(1, miner, ((entity) -> { + entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); + })); + } + + return true; + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + if (state.getMaterial().equals(Material.GLASS)) { + return this.getTier().getSpeed() * 2.0F; + } + if (isCorrectToolForDrops(state)) { + float mult = 1.0F; + if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK)) { + mult = this.getTier().getSpeed(); + } else { + mult = this.getTier().getSpeed() / 2.0F; + } + return mult > 1.0F ? mult : 1.0F; + } + return 1.0F; + } + + @Override + public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(EndTags.HAMMERS)) { + return this.getDestroySpeed(stack, state); + } + return 1.0F; + } + + @Override + public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(EndTags.HAMMERS)) { + return this.getTier().getLevel(); + } + return 0; + } + + @Override + public boolean isCorrectToolForDrops(BlockState state) { + if (state.getMaterial().equals(Material.GLASS)) { + return true; + } + if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) && !state.is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { + return false; + } + int level = this.getTier().getLevel(); + if (state.is(Blocks.IRON_ORE) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.LAPIS_ORE)) { + return level >= 1; + } + if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { + return level >= 2; + } + if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) || state.is(Blocks.ANCIENT_DEBRIS)) { + return level >= 3; + } + return true; + } + + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getDefaultAttributeModifiers(slot); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndHoeItem.java b/src/main/java/ru/betterend/item/tool/EndHoeItem.java new file mode 100644 index 00000000..07fa387e --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndHoeItem.java @@ -0,0 +1,17 @@ +package ru.betterend.item.tool; + +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.Tier; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndHoeItem extends HoeItem implements Patterned { + public EndHoeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java new file mode 100644 index 00000000..a7aac37c --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java @@ -0,0 +1,44 @@ +package ru.betterend.item.tool; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; +import net.minecraft.tags.Tag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, Patterned { + public EndPickaxeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(FabricToolTags.PICKAXES)) { + return this.getTier().getLevel(); + } + return 0; + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + if (this.getTier().getLevel() > 2 && state.getMaterial().equals(Blocks.END_STONE.defaultBlockState().getMaterial())) { + return this.speed * 3; + } + Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); + return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? this.speed : super.getDestroySpeed(stack, state); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndShovelItem.java b/src/main/java/ru/betterend/item/tool/EndShovelItem.java new file mode 100644 index 00000000..5a59a2bc --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndShovelItem.java @@ -0,0 +1,40 @@ +package ru.betterend.item.tool; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; +import net.minecraft.tags.Tag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, Patterned { + public EndShovelItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(FabricToolTags.SHOVELS)) { + return this.getTier().getLevel(); + } + return 0; + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); + return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? this.speed : super.getDestroySpeed(stack, state); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/tool/EndSwordItem.java b/src/main/java/ru/betterend/item/tool/EndSwordItem.java new file mode 100644 index 00000000..43aa6761 --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndSwordItem.java @@ -0,0 +1,18 @@ +package ru.betterend.item.tool; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndSwordItem extends SwordItem implements DynamicAttributeTool, Patterned { + public EndSwordItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java index c925808e..296a013e 100644 --- a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java @@ -3,7 +3,7 @@ package ru.betterend.mixin.client; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.sound.AbstractSoundInstance; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; @Mixin(AbstractSoundInstance.class) public interface AbstractSoundInstanceAccessor { diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java new file mode 100644 index 00000000..2efb8696 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -0,0 +1,96 @@ +package ru.betterend.mixin.client; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.inventory.AnvilScreen; +import net.minecraft.client.gui.screens.inventory.ItemCombinerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.item.ItemStack; +import ru.betterend.interfaces.AnvilScreenHandlerExtended; + +@Mixin(AnvilScreen.class) +public class AnvilScreenMixin extends ItemCombinerScreen { + + @Shadow + private EditBox name; + + private final List be_buttons = Lists.newArrayList(); + + public AnvilScreenMixin(AnvilMenu handler, Inventory playerInventory, Component title, + ResourceLocation texture) { + super(handler, playerInventory, title, texture); + } + + @Inject(method = "subInit", at = @At("TAIL")) + protected void be_subInit(CallbackInfo info) { + int x = (width - imageWidth) / 2; + int y = (height - imageHeight) / 2; + be_buttons.clear(); + be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), b -> be_previousRecipe())); + be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), b -> be_nextRecipe())); + } + + @Inject(method = "renderFg", at = @At("TAIL")) + protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + be_buttons.forEach(button -> { + button.render(matrices, mouseX, mouseY, delta); + }); + } + + @Inject(method = "slotChanged", at = @At("HEAD"), cancellable = true) + public void be_onSlotUpdate(AbstractContainerMenu handler, int slotId, ItemStack stack, CallbackInfo info) { + AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; + if (anvilHandler.be_getCurrentRecipe() != null) { + if (anvilHandler.be_getRecipes().size() > 1) { + be_buttons.forEach(button -> button.visible = true); + } else { + be_buttons.forEach(button -> button.visible = false); + } + name.setValue(""); + info.cancel(); + } else { + be_buttons.forEach(button -> button.visible = false); + } + } + + private void be_nextRecipe() { + ((AnvilScreenHandlerExtended) menu).be_nextRecipe(); + } + + private void be_previousRecipe() { + ((AnvilScreenHandlerExtended) menu).be_previousRecipe(); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (minecraft != null) { + for (AbstractWidget elem : be_buttons) { + if (elem.visible && elem.mouseClicked(mouseX, mouseY, button)) { + if (minecraft.gameMode != null) { + int i = be_buttons.indexOf(elem); + minecraft.gameMode.handleInventoryButtonClick(menu.containerId, i); + return true; + } + } + } + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 0d88add2..4e0db101 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -9,24 +9,25 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.Camera; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.Util; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; +import net.minecraft.Util; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.material.FluidState; +import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; import ru.betterend.world.biome.EndBiome; -@Mixin(BackgroundRenderer.class) +@Mixin(FogRenderer.class) public class BackgroundRendererMixin { private static float lastFogDensity; private static float fogDensity; @@ -34,45 +35,45 @@ public class BackgroundRendererMixin { private static long time; @Shadow - private static float red; + private static float fogRed; @Shadow - private static float green; + private static float fogGreen; @Shadow - private static float blue; + private static float fogBlue; - @Inject(method = "render", at = @At("RETURN")) - private static void onRender(Camera camera, float tickDelta, ClientWorld world, int i, float f, CallbackInfo info) { - long l = Util.getMeasuringTimeMs() - time; + @Inject(method = "setupColor", at = @At("RETURN")) + private static void be_onRender(Camera camera, float tickDelta, ClientLevel world, int i, float f, CallbackInfo info) { + long l = Util.getMillis() - time; time += l; lerp += l * 0.001F; if (lerp > 1) lerp = 1; - FluidState fluidState = camera.getSubmergedFluidState(); - if (fluidState.isEmpty() && world.getRegistryKey().equals(World.END)) { - Entity entity = camera.getFocusedEntity(); + FluidState fluidState = camera.getFluidInCamera(); + if (fluidState.isEmpty() && world.dimension().equals(Level.END)) { + Entity entity = camera.getEntity(); boolean skip = false; if (entity instanceof LivingEntity) { - StatusEffectInstance effect = ((LivingEntity) entity).getStatusEffect(StatusEffects.NIGHT_VISION); + MobEffectInstance effect = ((LivingEntity) entity).getEffect(MobEffects.NIGHT_VISION); skip = effect != null && effect.getDuration() > 0; } if (!skip) { - red *= 4; - green *= 4; - blue *= 4; + fogRed *= 4; + fogGreen *= 4; + fogBlue *= 4; } } - BackgroundInfo.red = red; - BackgroundInfo.green = green; - BackgroundInfo.blue = blue; + BackgroundInfo.red = fogRed; + BackgroundInfo.green = fogGreen; + BackgroundInfo.blue = fogBlue; } - @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) - private static void fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, boolean thickFog, CallbackInfo info) { - Entity entity = camera.getFocusedEntity(); - Biome biome = entity.world.getBiome(entity.getBlockPos()); - FluidState fluidState = camera.getSubmergedFluidState(); - if (biome.getCategory() == Category.THEEND && fluidState.isEmpty()) { + @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) + private static void be_fogDensity(Camera camera, FogRenderer.FogMode fogType, float viewDistance, boolean thickFog, CallbackInfo info) { + Entity entity = camera.getEntity(); + Biome biome = entity.level.getBiome(entity.blockPosition()); + FluidState fluidState = camera.getFluidInCamera(); + if (ClientOptions.useFogDensity() && biome.getBiomeCategory() == BiomeCategory.THEEND && fluidState.isEmpty()) { EndBiome endBiome = EndBiomes.getRenderBiome(biome); if (fogDensity == 0) { @@ -85,14 +86,14 @@ public class BackgroundRendererMixin { lerp = 0; } - float fog = MathHelper.lerp(lerp, lastFogDensity, fogDensity); + float fog = Mth.lerp(lerp, lastFogDensity, fogDensity); BackgroundInfo.fog = fog; float start = viewDistance * 0.75F / fog; float end = viewDistance / fog; if (entity instanceof LivingEntity) { LivingEntity le = (LivingEntity) entity; - StatusEffectInstance effect = le.getStatusEffect(StatusEffects.BLINDNESS); + MobEffectInstance effect = le.getEffect(MobEffects.BLINDNESS); if (effect != null) { int duration = effect.getDuration(); if (duration > 20) { @@ -103,8 +104,8 @@ public class BackgroundRendererMixin { else { float delta = (float) duration / 20F; BackgroundInfo.blindness = delta; - start = MathHelper.lerp(delta, start, 0); - end = MathHelper.lerp(delta, end, end * 0.03F); + start = Mth.lerp(delta, start, 0); + end = Mth.lerp(delta, end, end * 0.03F); } } else { diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 6ad1f324..fc1f26ad 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -1,15 +1,20 @@ package ru.betterend.mixin.client; +import java.awt.Point; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockAndTintGetter; +import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -18,44 +23,45 @@ import ru.betterend.util.MHelper; public class BiomeColorsMixin { private static final int POISON_COLOR = MHelper.color(92, 160, 78); private static final int STREAM_COLOR = MHelper.color(105, 213, 244); + private static final Point[] OFFSETS; + private static final boolean HAS_SODIUM; - @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) - private static void beGetWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { - int color = info.getReturnValue(); - - boolean scanDeep = true; - Mutable mut = new Mutable(); - for (Direction d: BlocksHelper.HORIZONTAL) { - mut.set(pos).move(d); - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = POISON_COLOR; - scanDeep = false; - break; - } - } - - if (scanDeep) { - int x1 = pos.getX() - 2; - int z1 = pos.getZ() - 2; - - int x2 = pos.getX() + 3; - int z2 = pos.getZ() + 3; - + @Inject(method = "getAverageWaterColor", at = @At("RETURN"), cancellable = true) + private static void be_getWaterColor(BlockAndTintGetter world, BlockPos pos, CallbackInfoReturnable info) { + if (ClientOptions.useSulfurWaterColor()) { + BlockAndTintGetter view = HAS_SODIUM ? Minecraft.getInstance().level : world; + MutableBlockPos mut = new MutableBlockPos(); mut.setY(pos.getY()); - for (int x = x1; x < x2 && scanDeep; x++) { - mut.setX(x); - for (int z = z1; z < z2 && scanDeep; z++) { - mut.setZ(z); - if (Math.abs(pos.getX() - x) != 2 || Math.abs(pos.getZ() - z) != 2) { - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = STREAM_COLOR; - scanDeep = false; - } - } + for (int i = 0; i < OFFSETS.length; i++) { + mut.setX(pos.getX() + OFFSETS[i].x); + mut.setZ(pos.getZ() + OFFSETS[i].y); + if ((view.getBlockState(mut).is(EndBlocks.BRIMSTONE))) { + info.setReturnValue(i < 16 ? STREAM_COLOR : POISON_COLOR); + info.cancel(); + return; } } } + } + + static { + HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); - info.setReturnValue(color); + OFFSETS = new Point[20]; + for (int i = 0; i < 3; i++) { + int p = i - 1; + OFFSETS[i] = new Point(p, -2); + OFFSETS[i + 3] = new Point(p, 2); + OFFSETS[i + 6] = new Point(-2, p); + OFFSETS[i + 9] = new Point(2, p); + } + + for (int i = 0; i < 4; i++) { + int inner = i + 16; + Direction dir = BlocksHelper.HORIZONTAL[i]; + OFFSETS[inner] = new Point(dir.getStepX(), dir.getStepZ()); + dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; + OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getStepX(), OFFSETS[inner].y + dir.getStepZ()); + } } } diff --git a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java new file mode 100644 index 00000000..3e0e5dd5 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java @@ -0,0 +1,27 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.CapeLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import ru.betterend.item.ArmoredElytra; + +@Mixin(CapeLayer.class) +public class CapeLayerMixin { + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + public void be_checkCustomElytra(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, AbstractClientPlayer abstractClientPlayer, float f, float g, float h, float j, float k, float l, CallbackInfo info) { + ItemStack itemStack = abstractClientPlayer.getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra) { + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 540f8128..39163b8b 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -6,48 +6,31 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.thread.ThreadExecutor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.protocol.PacketUtils; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; +import net.minecraft.world.level.block.entity.BlockEntity; import ru.betterend.blocks.entities.ESignBlockEntity; -import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; -@Mixin(ClientPlayNetworkHandler.class) +@Mixin(ClientPacketListener.class) public class ClientPlayNetworkHandlerMixin { @Shadow - private MinecraftClient client; + private Minecraft minecraft; @Shadow - private ClientWorld world; + private ClientLevel level; - @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) - public void openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, - (ThreadExecutor) client); - BlockEntity blockEntity = this.world.getBlockEntity(packet.getPos()); + @Inject(method = "handleOpenSignEditor", at = @At(value = "HEAD"), cancellable = true) + public void be_openSignEditor(ClientboundOpenSignEditorPacket packet, CallbackInfo info) { + PacketUtils.ensureRunningOnSameThread(packet, ClientPacketListener.class.cast(this), minecraft); + BlockEntity blockEntity = level.getBlockEntity(packet.getPos()); if (blockEntity instanceof ESignBlockEntity) { ESignBlockEntity sign = (ESignBlockEntity) blockEntity; - client.openScreen(new BlockSignEditScreen(sign)); - info.cancel(); - } - } - - @Inject(method = "onBlockEntityUpdate", at = @At(value = "HEAD"), cancellable = true) - public void onEntityUpdate(BlockEntityUpdateS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, - (ThreadExecutor) client); - BlockPos blockPos = packet.getPos(); - BlockEntity blockEntity = this.client.world.getBlockEntity(blockPos); - if (blockEntity instanceof ESignBlockEntity || blockEntity instanceof PedestalBlockEntity) { - blockEntity.fromTag(this.client.world.getBlockState(blockPos), packet.getCompoundTag()); + minecraft.setScreen(new BlockSignEditScreen(sign)); info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index 1ef0fa79..4fd3d635 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -5,18 +5,17 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.recipebook.ClientRecipeBook; -import net.minecraft.client.recipebook.RecipeBookGroup; -import net.minecraft.recipe.Recipe; -import ru.betterend.recipe.builders.AlloyingRecipe; +import net.minecraft.client.ClientRecipeBook; +import net.minecraft.client.RecipeBookCategories; +import net.minecraft.world.item.crafting.Recipe; +import ru.betterend.interfaces.BetterEndRecipe; @Mixin(ClientRecipeBook.class) public abstract class ClientRecipeBookMixin { - @Inject(method = "getGroupForRecipe", at = @At("HEAD"), cancellable = true) - private static void getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { - if (recipe instanceof AlloyingRecipe) { - cinfo.setReturnValue(RecipeBookGroup.BLAST_FURNACE_MISC); - cinfo.cancel(); + @Inject(method = "getCategory", at = @At("HEAD"), cancellable = true) + private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable info) { + if (recipe instanceof BetterEndRecipe) { + info.setReturnValue(RecipeBookCategories.UNKNOWN); } } } diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java new file mode 100644 index 00000000..484b3a65 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java @@ -0,0 +1,14 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.google.gson.Gson; + +import net.minecraft.client.renderer.block.model.BlockModelDefinition; + +@Mixin(BlockModelDefinition.Context.class) +public interface ContextGsonAccessor { + @Accessor + Gson getGson(); +} diff --git a/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java b/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java deleted file mode 100644 index 0852e1e2..00000000 --- a/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; -import net.minecraft.util.Identifier; -import ru.betterend.interfaces.IdentifiedContext; - -@Mixin(DeserializationContext.class) -public class DeserializationContextMixin implements IdentifiedContext { - - private Identifier contextId; - - @Override - public Identifier getContextId() { - return this.contextId; - } - - @Override - public void setContextId(Identifier id) { - this.contextId = id; - } -} diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index 113e3c27..384dc491 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -7,22 +7,22 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.EnchantingTableBlock; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EnchantmentTableBlock; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndTags; -@Mixin(EnchantingTableBlock.class) +@Mixin(EnchantmentTableBlock.class) public abstract class EnchantingTableBlockMixin extends Block { - public EnchantingTableBlockMixin(Settings settings) { + public EnchantingTableBlockMixin(Properties settings) { super(settings); } - @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) - private void beOnRandomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo info) { + @Inject(method = "animateTick", at = @At(value = "TAIL")) + private void be_onRandomDisplayTick(BlockState state, Level world, BlockPos pos, Random random, CallbackInfo info) { for (int px = -2; px <= 2; ++px) { for (int pz = -2; pz <= 2; ++pz) { if (px > -2 && px < 2 && pz == -1) { @@ -30,9 +30,9 @@ public abstract class EnchantingTableBlockMixin extends Block { } if (random.nextInt(16) == 0) { for (int py = 0; py <= 1; ++py) { - BlockPos blockPos = pos.add(px, py, pz); - if (world.getBlockState(blockPos).isIn(EndTags.BOOKSHELVES)) { - if (!world.isAir(pos.add(px / 2, 0, pz / 2))) { + BlockPos blockPos = pos.offset(px, py, pz); + if (world.getBlockState(blockPos).is(EndTags.BOOKSHELVES)) { + if (!world.isEmptyBlock(pos.offset(px / 2, 0, pz / 2))) { break; } world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, pz + random.nextFloat() - 0.5); diff --git a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java new file mode 100644 index 00000000..a72def2a --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java @@ -0,0 +1,43 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.authlib.GameProfile; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import ru.betterend.item.ArmoredElytra; + +@Mixin(LocalPlayer.class) +public abstract class LocalPlayerMixin extends AbstractClientPlayer { + + public LocalPlayerMixin(ClientLevel clientLevel, GameProfile gameProfile) { + super(clientLevel, gameProfile); + } + + @Final + @Shadow + public ClientPacketListener connection; + + @Inject(method = "aiStep", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;", + shift = Shift.AFTER)) + public void be_aiStep(CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack) && tryToStartFallFlying()) { + connection.send(new ServerboundPlayerCommandPacket(LocalPlayer.class.cast(this), ServerboundPlayerCommandPacket.Action.START_FALL_FLYING)); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 28a02e22..00f48281 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -8,65 +8,65 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.RunArgs; +import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.gui.screen.CreditsScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.sound.MusicType; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.sound.MusicSound; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.WinScreen; +import net.minecraft.client.main.GameConfig; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.Registry; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; +import net.minecraft.world.level.Level; import ru.betterend.interfaces.IColorProvider; import ru.betterend.util.MHelper; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public class MinecraftClientMixin { @Shadow - public ClientPlayerEntity player; - - @Shadow - public Screen currentScreen; + public LocalPlayer player; @Shadow + public Screen screen; + @Final - public InGameHud inGameHud; - - @Shadow - public ClientWorld world; + @Shadow + public Gui gui; @Shadow + public ClientLevel level; + @Final + @Shadow private BlockColors blockColors; - @Shadow @Final + @Shadow private ItemColors itemColors; @Inject(method = "*", at = @At("TAIL")) - private void onInit(RunArgs args, CallbackInfo info) { + private void be_onInit(GameConfig args, CallbackInfo info) { Registry.BLOCK.forEach(block -> { if (block instanceof IColorProvider) { IColorProvider provider = (IColorProvider) block; - blockColors.registerColorProvider(provider.getProvider(), block); + blockColors.register(provider.getProvider(), block); itemColors.register(provider.getItemProvider(), block.asItem()); } }); } - @Inject(method = "getMusicType", at = @At("HEAD"), cancellable = true) - private void getEndMusic(CallbackInfoReturnable info) { - if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) { - if (this.player.world.getRegistryKey() == World.END) { - if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { - info.setReturnValue(MusicType.DRAGON); + @Inject(method = "getSituationalMusic", at = @At("HEAD"), cancellable = true) + private void be_getEndMusic(CallbackInfoReturnable info) { + if (!(this.screen instanceof WinScreen) && this.player != null) { + if (this.player.level.dimension() == Level.END) { + if (this.gui.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { + info.setReturnValue(Musics.END_BOSS); } else { - MusicSound sound = (MusicSound) this.world.getBiomeAccess().method_27344(this.player.getBlockPos()).getMusic().orElse(MusicType.END); + Music sound = (Music) this.level.getBiomeManager().getNoiseBiomeAtPosition(this.player.blockPosition()).getBackgroundMusic().orElse(Musics.END); info.setReturnValue(sound); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 174fc608..07c57f8f 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -9,65 +9,55 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; -import net.minecraft.item.Item; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; -import ru.betterend.interfaces.IdentifiedContext; import ru.betterend.patterns.Patterned; +import ru.betterend.world.generator.GeneratorOptions; -@Mixin(ModelLoader.class) +@Mixin(ModelBakery.class) public class ModelLoaderMixin { - - @Final - @Shadow - private DeserializationContext variantMapDeserializationContext; - @Final @Shadow private ResourceManager resourceManager; - @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) - private void loadModelPattern(Identifier id, CallbackInfoReturnable info) { + @Inject(method = "loadBlockModel", at = @At("HEAD"), cancellable = true) + private void be_loadModelPattern(ResourceLocation id, CallbackInfoReturnable info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - Identifier modelId = new Identifier(id.getNamespace(), "models/" + id.getPath() + ".json"); - JsonUnbakedModel model; + ResourceLocation modelId = new ResourceLocation(id.getNamespace(), "models/" + id.getPath() + ".json"); + BlockModel model; try (Resource resource = this.resourceManager.getResource(modelId)) { Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8); - model = JsonUnbakedModel.deserialize(reader); - model.id = id.toString(); + model = BlockModel.fromStream(reader); + model.name = id.toString(); info.setReturnValue(model); - info.cancel(); } catch (Exception ex) { - String data[] = id.getPath().split("/"); + String[] data = id.getPath().split("/"); if (data.length > 1) { - Identifier itemId = new Identifier(id.getNamespace(), data[1]); - Optional block = Registry.BLOCK.getOrEmpty(itemId); + ResourceLocation itemId = new ResourceLocation(id.getNamespace(), data[1]); + Optional block = Registry.BLOCK.getOptional(itemId); if (block.isPresent()) { if (block.get() instanceof Patterned) { Patterned patterned = (Patterned) block.get(); model = this.be_getModel(data, id, patterned); info.setReturnValue(model); - info.cancel(); } } else { - Optional item = Registry.ITEM.getOrEmpty(itemId); + Optional item = Registry.ITEM.getOptional(itemId); if (item.isPresent() && item.get() instanceof Patterned) { Patterned patterned = (Patterned) item.get(); model = this.be_getModel(data, id, patterned); info.setReturnValue(model); - info.cancel(); } } } @@ -75,7 +65,7 @@ public class ModelLoaderMixin { } } - private JsonUnbakedModel be_getModel(String data[], Identifier id, Patterned patterned) { + private BlockModel be_getModel(String[] data, ResourceLocation id, Patterned patterned) { String pattern; if (id.getPath().contains("item")) { pattern = patterned.getModelPattern(id.getPath()); @@ -86,22 +76,17 @@ public class ModelLoaderMixin { pattern = patterned.getModelPattern(data[1]); } } - JsonUnbakedModel model = JsonUnbakedModel.deserialize(pattern); - model.id = id.toString(); + BlockModel model = BlockModel.fromString(pattern); + model.name = id.toString(); return model; } - @Inject(method = "loadModel", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/render/model/json/ModelVariantMap$DeserializationContext;setStateFactory(Lnet/minecraft/state/StateManager;)V", - shift = Shift.AFTER)) - private void appendContextID(Identifier id, CallbackInfo info) { - IdentifiedContext context = IdentifiedContext.class.cast(variantMapDeserializationContext); - if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - context.setContextId(BetterEnd.makeID("pattern/" + id.getPath())); - } else { - context.setContextId(null); + @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) + public ResourceLocation be_switchModel(ResourceLocation id) { + if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && !id.getPath().contains("custom_")) { + id = new ResourceLocation(id.getPath().replace("chorus", "custom_chorus")); } + return id; } } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index b8315dfd..d657e0aa 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -4,40 +4,28 @@ import java.io.Reader; import java.io.StringReader; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.client.render.model.json.ModelVariantMap; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.interfaces.IdentifiedContext; +import com.google.gson.Gson; + +import net.minecraft.client.renderer.block.model.BlockModelDefinition; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.block.Block; import ru.betterend.patterns.BlockPatterned; -@Mixin(ModelVariantMap.class) +@Mixin(BlockModelDefinition.class) public abstract class ModelVariantMapMixin { - @Shadow - static ModelVariantMap deserialize(ModelVariantMap.DeserializationContext context, Reader reader) { - return null; - } - - @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) - private static void deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { - IdentifiedContext idContext = IdentifiedContext.class.cast(context); - Identifier id = idContext.getContextId(); - if (id != null && id.getPath().contains("pattern")) { - String[] data = id.getPath().split("/"); - Identifier blockId = new Identifier(id.getNamespace(), data[1]); - Block block = Registry.BLOCK.get(blockId); - idContext.removeId(); - if (block instanceof BlockPatterned) { - String pattern = ((BlockPatterned) block).getStatesPattern(reader); - info.setReturnValue(deserialize(context, new StringReader(pattern))); - info.cancel(); - } + @Inject(method = "fromStream", at = @At("HEAD"), cancellable = true) + private static void be_deserializeBlockState(BlockModelDefinition.Context context, Reader reader, CallbackInfoReturnable info) { + Block block = context.getDefinition().any().getBlock(); + if (block instanceof BlockPatterned) { + String pattern = ((BlockPatterned) block).getStatesPattern(reader); + Gson gson = ContextGsonAccessor.class.cast(context).getGson(); + BlockModelDefinition map = GsonHelper.fromJson(gson, new StringReader(pattern), BlockModelDefinition.class); + info.setReturnValue(map); } } } diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 5e0f531e..7af64b12 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -9,83 +9,90 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.sound.AbstractSoundInstance; -import net.minecraft.client.sound.MusicTracker; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.sound.MusicSound; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.MusicManager; +import net.minecraft.sounds.Music; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import ru.betterend.client.ClientOptions; -@Mixin(MusicTracker.class) -public class MusicTrackerMixin { - @Shadow +@Mixin(MusicManager.class) +public abstract class MusicTrackerMixin { @Final - private MinecraftClient client; - @Shadow + private Minecraft minecraft; + @Final + @Shadow private Random random; @Shadow - private SoundInstance current; + private SoundInstance currentMusic; @Shadow - private int timeUntilNextSong; + private int nextSongDelay; private static float volume = 1; private static float srcVolume = 0; private static long time; @Inject(method = "tick", at = @At("HEAD"), cancellable = true) - public void beOnTick(CallbackInfo info) { - MusicSound musicSound = client.getMusicType(); - if (volume > 0 && beIsInEnd() && beShouldChangeSound(musicSound)) { - if (volume > 0) { - if (srcVolume < 0) { - srcVolume = current.getVolume(); - } - if (current instanceof AbstractSoundInstance) { - ((AbstractSoundInstanceAccessor) current).setVolume(volume); - } - client.getSoundManager().updateSoundVolume(current.getCategory(), current.getVolume() * volume); - long t = System.currentTimeMillis(); - if (volume == 1 && time == 0) { + public void be_onTick(CallbackInfo info) { + if (ClientOptions.blendBiomeMusic()) { + Music musicSound = minecraft.getSituationalMusic(); + if (be_checkNullSound(musicSound) && volume > 0 && be_isInEnd() && be_shouldChangeSound(musicSound)) { + if (volume > 0) { + if (srcVolume < 0) { + srcVolume = currentMusic.getVolume(); + } + if (currentMusic instanceof AbstractSoundInstance) { + ((AbstractSoundInstanceAccessor) currentMusic).setVolume(volume); + } + minecraft.getSoundManager().updateSourceVolume(currentMusic.getSource(), currentMusic.getVolume() * volume); + long t = System.currentTimeMillis(); + if (volume == 1 && time == 0) { + time = t; + } + float delta = (t - time) * 0.0005F; time = t; + volume -= delta; + if (volume < 0) { + volume = 0; + } } - float delta = (t - time) * 0.0005F; - time = t; - volume -= delta; - if (volume < 0) { - volume = 0; + if (volume == 0) { + volume = 1; + time = 0; + srcVolume = -1; + this.minecraft.getSoundManager().stop(this.currentMusic); + this.nextSongDelay = Mth.nextInt(this.random, 0, musicSound.getMinDelay() / 2); + this.currentMusic = null; } + if (this.currentMusic == null && this.nextSongDelay-- <= 0) { + this.startPlaying(musicSound); + } + info.cancel(); } - if (volume == 0) { + else { volume = 1; - time = 0; - srcVolume = -1; - this.client.getSoundManager().stop(this.current); - this.timeUntilNextSong = MathHelper.nextInt(this.random, 0, musicSound.getMinDelay() / 2); - this.current = null; } - if (this.current == null && this.timeUntilNextSong-- <= 0) { - this.play(musicSound); - } - info.cancel(); - } - else { - volume = 1; } } - private boolean beIsInEnd() { - return client.world != null && client.world.getRegistryKey().equals(World.END); + private boolean be_isInEnd() { + return minecraft.level != null && minecraft.level.dimension().equals(Level.END); } - private boolean beShouldChangeSound(MusicSound musicSound) { - return current != null && !musicSound.getSound().getId().equals(this.current.getId()) && musicSound.shouldReplaceCurrentMusic(); + private boolean be_shouldChangeSound(Music musicSound) { + return currentMusic != null && !musicSound.getEvent().getLocation().equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); + } + + private boolean be_checkNullSound(Music musicSound) { + return musicSound != null && musicSound.getEvent() != null; } @Shadow - public void play(MusicSound type) {} + public abstract void startPlaying(Music type); } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 84805062..ca9e8460 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -11,35 +11,40 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.resource.NamespaceResourceManager; -import net.minecraft.resource.Resource; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.FallbackResourceManager; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; -@Mixin(NamespaceResourceManager.class) +@Mixin(FallbackResourceManager.class) public abstract class NamespaceResourceManagerMixin { @Shadow - public abstract Resource getResource(Identifier id); + public abstract Resource getResource(ResourceLocation id); - @Inject(method = "getAllResources", cancellable = true, at = @At( + @Inject(method = "getResources", cancellable = true, at = @At( value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) - public void getStatesPattern(Identifier id, CallbackInfoReturnable> info) { - if (id.getNamespace().contains(BetterEnd.MOD_ID)) { + public void be_getStatesPattern(ResourceLocation id, CallbackInfoReturnable> info) { + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String[] data = id.getPath().split("/"); if (data.length > 1) { - Identifier blockId = BetterEnd.makeID(data[1].replace(".json", "")); + ResourceLocation blockId = BetterEnd.makeID(data[1].replace(".json", "")); Block block = Registry.BLOCK.get(blockId); if (block instanceof BlockPatterned) { - List resources = Lists.newArrayList(); - resources.add(this.getResource(((BlockPatterned) block).statePatternId())); - info.setReturnValue(resources); - info.cancel(); + ResourceLocation stateId = ((BlockPatterned) block).statePatternId(); + try { + List resources = Lists.newArrayList(); + Resource stateRes = this.getResource(stateId); + resources.add(stateRes); + info.setReturnValue(resources); + } catch (Exception ex) { + BetterEnd.LOGGER.catching(ex); + } } } } diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java new file mode 100644 index 00000000..557b0699 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import ru.betterend.client.render.ArmoredElytraLayer; + +@Mixin(PlayerRenderer.class) +public abstract class PlayerRendererMixin extends LivingEntityRenderer> { + + public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel entityModel, float f) { + super(entityRenderDispatcher, entityModel, f); + } + + @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL")) + public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) { + addLayer(new ArmoredElytraLayer<>(PlayerRenderer.class.cast(this))); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index ea68a311..9f06187d 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -11,38 +11,41 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferBuilderStorage; -import net.minecraft.client.render.SkyProperties; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Quaternion; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; +import ru.betterend.client.ClientOptions; import ru.betterend.util.BackgroundInfo; import ru.betterend.util.MHelper; -@Mixin(WorldRenderer.class) +@Mixin(LevelRenderer.class) public class WorldRendererMixin { - private static final Identifier NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); - private static final Identifier NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); - private static final Identifier HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); - private static final Identifier FOG = BetterEnd.makeID("textures/sky/fog.png"); + private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); + private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); + private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); + private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); + private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); private static VertexBuffer stars1; private static VertexBuffer stars2; private static VertexBuffer stars3; + private static VertexBuffer stars4; private static VertexBuffer nebulas1; private static VertexBuffer nebulas2; private static VertexBuffer horizon; @@ -50,43 +53,52 @@ public class WorldRendererMixin { private static Vector3f axis1; private static Vector3f axis2; private static Vector3f axis3; + private static Vector3f axis4; private static float time; + private static float time2; + private static float time3; + private static float blind02; + private static float blind06; private static boolean directOpenGL = false; @Shadow @Final - private MinecraftClient client; + private Minecraft minecraft; @Shadow @Final private TextureManager textureManager; @Shadow - private ClientWorld world; + private ClientLevel level; @Shadow private int ticks; @Inject(method = "*", at = @At("TAIL")) - private void onInit(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { - initStars(); + private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { + be_initStars(); Random random = new Random(131); axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis1.normalize(); axis2.normalize(); axis3.normalize(); + axis4.normalize(); directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); } @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { - if (client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { - time = (ticks % 360000) * 0.001F; + private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { + if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { + time = (ticks % 360000) * 0.000017453292F; + time2 = time * 2; + time3 = time * 3; - BackgroundRenderer.setFogBlack(); + FogRenderer.levelFogColor(); RenderSystem.enableTexture(); if (directOpenGL) { @@ -102,51 +114,60 @@ public class WorldRendererMixin { } float blindA = 1F - BackgroundInfo.blindness; + blind02 = blindA * 0.2F; + blind06 = blindA * 0.6F; if (blindA > 0) { - matrices.push(); - matrices.multiply(new Quaternion(0, time, 0, true)); - textureManager.bindTexture(HORIZON); - renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time, 0, false)); + textureManager.bind(HORIZON); + be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + matrices.popPose(); - matrices.push(); - matrices.multiply(new Quaternion(0, -time, 0, true)); - textureManager.bindTexture(NEBULA_1); - renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.2F * blindA); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, -time, 0, false)); + textureManager.bind(NEBULA_1); + be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); - matrices.push(); - matrices.multiply(new Quaternion(0, time * 2, 0, true)); - textureManager.bindTexture(NEBULA_2); - renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.2F * blindA); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time2, 0, false)); + textureManager.bind(NEBULA_2); + be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + textureManager.bind(STARS); + + matrices.pushPose(); + matrices.mulPose(axis3.rotation(time)); + be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis4.rotation(time2)); + be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + matrices.popPose(); } float a = (BackgroundInfo.fog - 1F); if (a > 0) { if (a > 1) a = 1; - textureManager.bindTexture(FOG); - renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); + textureManager.bind(FOG); + be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); } RenderSystem.disableTexture(); if (blindA > 0) { - matrices.push(); - matrices.multiply(new Quaternion(axis1, time * 3, true)); - renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, 0.6F * blindA); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(axis1.rotation(time3)); + be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + matrices.popPose(); - matrices.push(); - matrices.multiply(new Quaternion(axis2, time * 2, true)); - renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, 0.6F * blindA); - matrices.pop(); - - matrices.push(); - matrices.multiply(new Quaternion(axis3, time, true)); - renderBuffer(matrices, stars3, VertexFormats.POSITION, 0.77F, 0.31F, 0.73F, 0.6F * blindA); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(axis2.rotation(time2)); + be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + matrices.popPose(); } RenderSystem.enableTexture(); @@ -156,81 +177,95 @@ public class WorldRendererMixin { } } - private void renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { RenderSystem.color4f(r, g, b, a); buffer.bind(); - format.startDrawing(0L); - buffer.draw(matrices.peek().getModel(), 7); + format.setupBufferState(0L); + buffer.draw(matrices.last().pose(), 7); VertexBuffer.unbind(); - format.endDrawing(); + format.clearBufferState(); } - private void initStars() { - BufferBuilder buffer = Tessellator.getInstance().getBuffer(); - stars1 = buildBuffer(buffer, stars1, 0.1, 0.30, 3500, 41315); - stars2 = buildBuffer(buffer, stars2, 0.1, 0.35, 2000, 35151); - stars3 = buildBuffer(buffer, stars3, 0.1, 0.40, 1500, 61354); - nebulas1 = buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); - nebulas2 = buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); - horizon = buildBufferHorizon(buffer, horizon); - fog = buildBufferFog(buffer, fog); + private void be_initStars() { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); + stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); + stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); + stars4 = be_buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); + nebulas1 = be_buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); + nebulas2 = be_buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); + horizon = be_buildBufferHorizon(buffer, horizon); + fog = be_buildBufferFog(buffer, fog); } - private VertexBuffer buildBuffer(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION); - makeStars(bufferBuilder, minSize, maxSize, count, seed); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + be_makeStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeFarFog(bufferBuilder, minSize, maxSize, count, seed); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeCylinder(bufferBuilder, 16, 50, 100); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeCylinder(bufferBuilder, 16, 50, 70); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + be_makeCylinder(bufferBuilder, 16, 50, 100); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private void makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + be_makeCylinder(bufferBuilder, 16, 50, 70); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, VertexFormats.POSITION); + buffer.begin(7, DefaultVertexFormat.POSITION); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -265,15 +300,63 @@ public class WorldRendererMixin { double ae = 0.0 * q - aa * r; double af = ae * n - ab * o; double ah = ab * n + ae * o; - buffer.vertex(j + af, k + ad, l + ah).next(); + buffer.vertex(j + af, k + ad, l + ah).endVertex(); } } } } - private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, VertexFormats.POSITION_TEXTURE); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + double j = posX * 100.0; + double k = posY * 100.0; + double l = posZ * 100.0; + double m = Math.atan2(posX, posZ); + double n = Math.sin(m); + double o = Math.cos(m); + double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double q = Math.sin(p); + double r = Math.cos(p); + double s = random.nextDouble() * Math.PI * 2.0; + double t = Math.sin(s); + double u = Math.cos(s); + + int pos = 0; + float minV = random.nextInt(4) / 4F; + for (int v = 0; v < 4; ++v) { + double x = (double) ((v & 2) - 1) * size; + double y = (double) ((v + 1 & 2) - 1) * size; + double aa = x * u - y * t; + double ab = y * u + x * t; + double ad = aa * q + 0.0 * r; + double ae = 0.0 * q - aa * r; + double af = ae * n - ab * o; + double ah = ab * n + ae * o; + float texU = (pos >> 1) & 1; + float texV = (((pos + 1) >> 1) & 1) / 4F + minV; + pos ++; + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); + } + } + } + } + + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -316,16 +399,15 @@ public class WorldRendererMixin { float texU = (pos >> 1) & 1; float texV = ((pos + 1) >> 1) & 1; pos ++; - buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); } } } } - private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(7, VertexFormats.POSITION_TEXTURE); - for (int i = 0; i < segments; i ++) - { + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; double px1 = Math.sin(a1) * radius; @@ -336,10 +418,10 @@ public class WorldRendererMixin { float u0 = (float) i / (float) segments; float u1 = (float) (i + 1) / (float) segments; - buffer.vertex(px1, -height, pz1).texture(u0, 0).next(); - buffer.vertex(px1, height, pz1).texture(u0, 1).next(); - buffer.vertex(px2, height, pz2).texture(u1, 1).next(); - buffer.vertex(px2, -height, pz2).texture(u1, 0).next(); + buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); + buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); + buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); + buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java deleted file mode 100644 index 68df0c6b..00000000 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ /dev/null @@ -1,51 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.google.common.collect.Lists; - -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.math.MathHelper; -import ru.betterend.item.EndHammer; -import ru.betterend.util.MHelper; - -@Mixin(AbstractBlock.class) -public abstract class AbstractBlockMixin { - - @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) - public void getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { - if (state.isOf(Blocks.GLOWSTONE)) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem() instanceof EndHammer) { - int min = 3; - int max = 4; - int count = 0; - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); - if (fortune > 0) { - fortune /= Enchantments.FORTUNE.getMaxLevel(); - min = MathHelper.clamp(min + fortune, min, max); - if (min == max) { - info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max))); - info.cancel(); - } - } - count = MHelper.randRange(min, max, MHelper.RANDOM); - info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, count))); - info.cancel(); - } - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java new file mode 100644 index 00000000..fa27a791 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -0,0 +1,28 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import ru.betterend.blocks.basis.EndAnvilBlock; + +@Mixin(AnvilBlock.class) +public class AnvilBlockMixin { + @Inject(method = "damage", at = @At("HEAD"), cancellable = true) + private static void be_damage(BlockState fallingState, CallbackInfoReturnable info) { + if (fallingState.getBlock() instanceof EndAnvilBlock) { + IntegerProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDestructionProperty(); + int destruction = fallingState.getValue(destructionProperty); + try { + BlockState state = fallingState.setValue(destructionProperty, destruction + 1); + info.setReturnValue(state); + } catch (Exception ex) { + info.setReturnValue(null); + } + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java new file mode 100644 index 00000000..cdd7f400 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -0,0 +1,153 @@ +package ru.betterend.mixin.common; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.interfaces.AnvilScreenHandlerExtended; +import ru.betterend.recipe.builders.AnvilRecipe; + +@Mixin(AnvilMenu.class) +public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { + private List be_recipes = Collections.emptyList(); + private AnvilRecipe be_currentRecipe; + private DataSlot anvilLevel; + + public AnvilMenuMixin(int syncId, Inventory playerInventory) { + super(MenuType.ANVIL, syncId, playerInventory, ContainerLevelAccess.NULL); + } + + @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("TAIL")) + public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { + this.anvilLevel = addDataSlot(DataSlot.standalone()); + if (context != ContainerLevelAccess.NULL) { + int level = context.evaluate((world, blockPos) -> { + Block anvilBlock = world.getBlockState(blockPos).getBlock(); + if (anvilBlock instanceof EndAnvilBlock) { + return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); + } + return 1; + }, 1); + anvilLevel.set(level); + } else { + anvilLevel.set(1); + } + } + + @Shadow + public abstract void createResult(); + + @Inject(method = "mayPickup", at = @At("HEAD"), cancellable = true) + protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { + if (be_currentRecipe != null) { + info.setReturnValue(be_currentRecipe.checkHammerDurability(inputSlots, player)); + } + } + + @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) + protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { + if (be_currentRecipe != null) { + inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); + stack = be_currentRecipe.craft(inputSlots, player); + slotsChanged(inputSlots); + access.execute((world, blockPos) -> { + BlockState anvilState = world.getBlockState(blockPos); + if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { + BlockState landingState = AnvilBlock.damage(anvilState); + if (landingState == null) { + world.removeBlock(blockPos, false); + world.levelEvent(1029, blockPos, 0); + } else { + world.setBlock(blockPos, landingState, 2); + world.levelEvent(1030, blockPos, 0); + } + } else { + world.levelEvent(1030, blockPos, 0); + } + }); + info.setReturnValue(stack); + } + } + + @Inject(method = "createResult", at = @At("HEAD"), cancellable = true) + public void be_updateOutput(CallbackInfo info) { + RecipeManager recipeManager = this.player.level.getRecipeManager(); + be_recipes = recipeManager.getRecipesFor(AnvilRecipe.TYPE, inputSlots, player.level); + if (be_recipes.size() > 0) { + int anvilLevel = this.anvilLevel.get(); + be_recipes = be_recipes.stream().filter(recipe -> + anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); + if (be_recipes.size() > 0) { + if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { + be_currentRecipe = be_recipes.get(0); + } + be_updateResult(); + info.cancel(); + } else { + be_currentRecipe = null; + } + } + } + + @Inject(method = "setItemName", at = @At("HEAD"), cancellable = true) + public void be_setNewItemName(String string, CallbackInfo info) { + if (be_currentRecipe != null) { + info.cancel(); + } + } + + @Override + public boolean clickMenuButton(Player player, int id) { + if (id == 0) { + be_previousRecipe(); + return true; + } else if (id == 1) { + be_nextRecipe(); + return true; + } + return super.clickMenuButton(player, id); + } + + private void be_updateResult() { + if (be_currentRecipe == null) return; + resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); + broadcastChanges(); + } + + @Override + public void be_updateCurrentRecipe(AnvilRecipe recipe) { + this.be_currentRecipe = recipe; + be_updateResult(); + } + + @Override + public AnvilRecipe be_getCurrentRecipe() { + return be_currentRecipe; + } + + @Override + public List be_getRecipes() { + return be_recipes; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java deleted file mode 100644 index c8a4aa23..00000000 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ /dev/null @@ -1,92 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.tag.BlockTags; -import net.minecraft.world.World; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; - -@Mixin(AnvilScreenHandler.class) -public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { - - private final World world = this.player.world; - private final RecipeManager recipeManager = this.world.getRecipeManager(); - private AnvilSmithingRecipe currentRecipe; - - public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, - ScreenHandlerContext context) { - super(type, syncId, playerInventory, context); - } - - @Shadow - public abstract void updateResult(); - - @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) - protected void canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { - if (currentRecipe != null) { - ItemStack output = this.currentRecipe.craft(input, player); - if (!output.isEmpty()) { - info.setReturnValue(true); - info.cancel(); - } - } - } - - @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) - protected void onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { - if (currentRecipe != null) { - this.input.getStack(1).decrement(1); - this.updateResult(); - this.context.run((world, blockPos) -> { - BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.creativeMode && anvilState.isIn(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { - BlockState landingState = AnvilBlock.getLandingState(anvilState); - if (landingState == null) { - world.removeBlock(blockPos, false); - world.syncWorldEvent(1029, blockPos, 0); - } else { - world.setBlockState(blockPos, landingState, 2); - world.syncWorldEvent(1030, blockPos, 0); - } - } else { - world.syncWorldEvent(1030, blockPos, 0); - } - - }); - info.setReturnValue(stack); - info.cancel(); - } - } - - @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) - public void updateOutput(CallbackInfo info) { - this.currentRecipe = this.recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, world).orElse(null); - if (currentRecipe != null) { - this.output.setStack(0, currentRecipe.craft(input)); - this.sendContentUpdates(); - info.cancel(); - } - } - - @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) - public void setNewItemName(String string, CallbackInfo info) { - if (currentRecipe != null) { - info.cancel(); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java new file mode 100644 index 00000000..efd97bf5 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import java.util.UUID; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.google.common.collect.Multimap; + +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; + +@Mixin(ArmorItem.class) +public interface ArmorItemAccessor { + @Accessor("ARMOR_MODIFIER_UUID_PER_SLOT") + UUID[] be_getModifiers(); + + @Accessor("defaultModifiers") + Multimap be_getDefaultModifiers(); + + @Accessor("defaultModifiers") + void be_setDefaultModifiers(Multimap attributeModifiers); +} diff --git a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java new file mode 100644 index 00000000..eb1f962b --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import java.util.List; +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; + +@Mixin(BiomeGenerationSettings.class) +public interface BiomeGenerationSettingsAccessor { + @Accessor("features") + List>>> be_getFeatures(); + + @Accessor("features") + void be_setFeatures(List>>> features); + + @Accessor("structureStarts") + List>> be_getStructures(); + + @Accessor("structureStarts") + void be_setStructures(List>> structures); +} diff --git a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java new file mode 100644 index 00000000..ed4ae4d8 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java @@ -0,0 +1,48 @@ +package ru.betterend.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.google.common.collect.Lists; + +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.util.MHelper; + +@Mixin(BlockBehaviour.class) +public abstract class BlockBehaviourMixin { + @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) + public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { + if (state.is(Blocks.GLOWSTONE)) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem() instanceof EndHammerItem) { + int min = 3; + int max = 4; + int count = 0; + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (fortune > 0) { + fortune /= Enchantments.BLOCK_FORTUNE.getMaxLevel(); + min = Mth.clamp(min + fortune, min, max); + if (min == max) { + info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max))); + } + } + count = MHelper.randRange(min, max, MHelper.RANDOM); + info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, count))); + } + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 708b3908..9e866de1 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -1,46 +1,45 @@ package ru.betterend.mixin.common; -import java.util.Random; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.BoneMealItem; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome.Category; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.BonemealUtil; +import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { - private static final Direction[] DIR = BlocksHelper.makeHorizontal(); - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos BE_BLOCK_POS = new MutableBlockPos(); - @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) - private void beOnUse(ItemUsageContext context, CallbackInfoReturnable info) { - World world = context.getWorld(); - BlockPos blockPos = context.getBlockPos(); - if (!world.isClient) { - BlockPos offseted = blockPos.offset(context.getSide()); - boolean endBiome = world.getBiome(offseted).getCategory() == Category.THEEND; + @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) + private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { + Level world = context.getLevel(); + BlockPos blockPos = context.getClickedPos(); + if (!world.isClientSide) { + BlockPos offseted = blockPos.relative(context.getClickedFace()); + boolean endBiome = world.getBiome(offseted).getBiomeCategory() == BiomeCategory.THEEND; - if (world.getBlockState(blockPos).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(blockPos).is(EndTags.END_GROUND)) { boolean consume = false; - if (world.getBlockState(blockPos).isOf(Blocks.END_STONE)) { - BlockState nylium = beGetNylium(world, blockPos); + if (world.getBlockState(blockPos).is(Blocks.END_STONE)) { + BlockState nylium = be_getNylium(world, blockPos); if (nylium != null) { BlocksHelper.setWithoutUpdate(world, blockPos, nylium); consume = true; @@ -48,43 +47,48 @@ public class BoneMealItemMixin { } else { if (!world.getFluidState(offseted).isEmpty() && endBiome) { - consume = beGrowWaterGrass(world, blockPos); + if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { + consume = be_growWaterGrass(world, blockPos); + } } else { - consume = beGrowGrass(world, blockPos); + consume = be_growGrass(world, blockPos); } } if (consume) { - if (!context.getPlayer().isCreative()) - context.getStack().decrement(1); - world.syncWorldEvent(2005, blockPos, 0); - info.setReturnValue(ActionResult.SUCCESS); + if (!context.getPlayer().isCreative()) { + context.getItemInHand().shrink(1); + } + world.levelEvent(2005, blockPos, 0); + info.setReturnValue(InteractionResult.SUCCESS); info.cancel(); } } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { - info.setReturnValue(ActionResult.FAIL); - info.cancel(); + if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { + info.setReturnValue(InteractionResult.FAIL); + info.cancel(); + } } } } - private boolean beGrowGrass(World world, BlockPos pos) { + private boolean be_growGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; for (int i = 0; i < 64; i++) { int x = (int) (pos.getX() + world.random.nextGaussian() * 2); int z = (int) (pos.getZ() + world.random.nextGaussian() * 2); - POS.setX(x); - POS.setZ(z); + BE_BLOCK_POS.setX(x); + BE_BLOCK_POS.setZ(z); for (int y = y1; y >= y2; y--) { - POS.setY(y); - BlockPos down = POS.down(); - if (world.isAir(POS) && !world.isAir(down)) { - BlockState grass = beGetGrassState(world, down); + BE_BLOCK_POS.setY(y); + BlockPos down = BE_BLOCK_POS.below(); + if (world.isEmptyBlock(BE_BLOCK_POS) && !world.isEmptyBlock(down)) { + BlockState grass = be_getGrassState(world, down); if (grass != null) { - BlocksHelper.setWithoutUpdate(world, POS, grass); + BlocksHelper.setWithoutUpdate(world, BE_BLOCK_POS, grass); result = true; } break; @@ -94,22 +98,22 @@ public class BoneMealItemMixin { return result; } - private boolean beGrowWaterGrass(World world, BlockPos pos) { + private boolean be_growWaterGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; for (int i = 0; i < 64; i++) { int x = (int) (pos.getX() + world.random.nextGaussian() * 2); int z = (int) (pos.getZ() + world.random.nextGaussian() * 2); - POS.setX(x); - POS.setZ(z); + BE_BLOCK_POS.setX(x); + BE_BLOCK_POS.setZ(z); for (int y = y1; y >= y2; y--) { - POS.setY(y); - BlockPos down = POS.down(); - if (world.getBlockState(POS).isOf(Blocks.WATER) && world.getBlockState(down).isIn(EndTags.END_GROUND)) { - BlockState grass = beGetWaterGrassState(world, down); + BE_BLOCK_POS.setY(y); + BlockPos down = BE_BLOCK_POS.below(); + if (world.getBlockState(BE_BLOCK_POS).is(Blocks.WATER) && world.getBlockState(down).is(EndTags.END_GROUND)) { + BlockState grass = be_getWaterGrassState(world, down); if (grass != null) { - BlocksHelper.setWithoutUpdate(world, POS, grass); + BlocksHelper.setWithoutUpdate(world, BE_BLOCK_POS, grass); result = true; } break; @@ -119,62 +123,38 @@ public class BoneMealItemMixin { return result; } - private BlockState beGetGrassState(World world, BlockPos pos) { + private BlockState be_getGrassState(Level world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); - if (block == EndBlocks.END_MOSS || block == EndBlocks.END_MYCELIUM) { - return world.random.nextBoolean() ? EndBlocks.CREEPING_MOSS.getDefaultState() : EndBlocks.UMBRELLA_MOSS.getDefaultState(); - } - else if (block == EndBlocks.CAVE_MOSS) { - return EndBlocks.CAVE_GRASS.getDefaultState(); - } - else if (block == EndBlocks.CHORUS_NYLIUM) { - return EndBlocks.CHORUS_GRASS.getDefaultState(); - } - else if (block == EndBlocks.CRYSTAL_MOSS) { - return EndBlocks.CRYSTAL_GRASS.getDefaultState(); - } - else if (block == EndBlocks.SHADOW_GRASS) { - return EndBlocks.SHADOW_PLANT.getDefaultState(); - } - else if (block == EndBlocks.PINK_MOSS) { - return EndBlocks.BUSHY_GRASS.getDefaultState(); - } - return null; + block = BonemealUtil.getGrass(EndBiomes.getBiomeID(world.getBiome(pos)), block, world.getRandom()); + return block == null ? null : block.defaultBlockState(); } - private BlockState beGetWaterGrassState(World world, BlockPos pos) { + private BlockState be_getWaterGrassState(Level world, BlockPos pos) { EndBiome biome = EndBiomes.getFromBiome(world.getBiome(pos)); if (world.random.nextInt(16) == 0) { - return EndBlocks.CHARNIA_RED.getDefaultState(); + return EndBlocks.CHARNIA_RED.defaultBlockState(); } else if (biome == EndBiomes.FOGGY_MUSHROOMLAND || biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.getDefaultState() : EndBlocks.CHARNIA_LIGHT_BLUE.getDefaultState(); + return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState() : EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState(); } else if (biome == EndBiomes.AMBER_LAND) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.getDefaultState() : EndBlocks.CHARNIA_RED.getDefaultState(); + return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.defaultBlockState() : EndBlocks.CHARNIA_RED.defaultBlockState(); } else if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.SHADOW_FOREST) { - return EndBlocks.CHARNIA_PURPLE.getDefaultState(); + return EndBlocks.CHARNIA_PURPLE.defaultBlockState(); } return null; } - private void beShuffle(Random random) { - for (int i = 0; i < 4; i++) { - int j = random.nextInt(4); - Direction d = DIR[i]; - DIR[i] = DIR[j]; - DIR[j] = d; - } - } - - private BlockState beGetNylium(World world, BlockPos pos) { - beShuffle(world.random); - for (Direction dir : DIR) { - BlockState state = world.getBlockState(pos.offset(dir)); - if (BlocksHelper.isEndNylium(state)) + private BlockState be_getNylium(Level world, BlockPos pos) { + Vec3i[] offsets = MHelper.getOffsets(world.getRandom()); + for (Vec3i dir : offsets) { + BlockPos p = pos.offset(dir); + BlockState state = world.getBlockState(p); + if (BlocksHelper.isEndNylium(state) && !world.getBlockState(p.above()).is(EndTags.END_GROUND)) { return state; + } } return null; } diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java deleted file mode 100644 index 17129e52..00000000 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.item.Item; -import net.minecraft.potion.Potion; -import net.minecraft.recipe.BrewingRecipeRegistry; - -@Mixin(BrewingRecipeRegistry.class) -public interface BrewingAccessor { - @Invoker - static void callRegisterPotionRecipe(Potion input, Item item, Potion output) { - throw new AssertionError("@Invoker dummy body called"); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 6c354ff5..cfb4f4b3 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -11,89 +11,100 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusFlowerBlock; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusFlowerBlock.class, priority = 100) public abstract class ChorusFlowerBlockMixin extends Block { - private static final VoxelShape SHAPE_FULL = Block.createCuboidShape(0, 0, 0, 16, 16, 16); - private static final VoxelShape SHAPE_HALF = Block.createCuboidShape(0, 0, 0, 16, 4, 16); + private static final VoxelShape SHAPE_FULL = Block.box(0, 0, 0, 16, 16, 16); + private static final VoxelShape SHAPE_HALF = Block.box(0, 0, 0, 16, 4, 16); - public ChorusFlowerBlockMixin(Settings settings) { + public ChorusFlowerBlockMixin(Properties settings) { super(settings); } - @Shadow @Final - private ChorusPlantBlock plantBlock; + @Shadow + private ChorusPlantBlock plant; - @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { - if (world.getBlockState(pos.down()).isOf(EndBlocks.CHORUS_NYLIUM)) { + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) + private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { + if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { info.setReturnValue(true); info.cancel(); } } @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) - private void beOnTick(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo info) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - BlockPos up = pos.up(); - if (world.isAir(up) && up.getY() < 256) { - int i = state.get(ChorusFlowerBlock.AGE); + private void be_randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { + if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + BlockPos up = pos.above(); + if (world.isEmptyBlock(up) && up.getY() < 256) { + int i = state.getValue(ChorusFlowerBlock.AGE); if (i < 5) { - this.grow(world, up, i + 1); - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); + this.placeGrownFlower(world, up, i + 1); + if (GeneratorOptions.changeChorusPlant()) { + BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(BlocksHelper.ROOTS, true)); + } + else { + BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); + } info.cancel(); } } } } - @Inject(method = "generate", at = @At("RETURN"), cancellable = true) - private static void beOnGenerate(WorldAccess world, BlockPos pos, Random random, int size, CallbackInfo info) { + @Inject(method = "generatePlant", at = @At("RETURN"), cancellable = true) + private static void be_generatePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); - if (state.isOf(Blocks.CHORUS_PLANT)) { - BlocksHelper.setWithoutUpdate(world, pos, state.with(BlocksHelper.ROOTS, true)); + if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { + BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlocksHelper.ROOTS, true)); } } @Shadow - private static boolean isSurroundedByAir(WorldView world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } + private static boolean allNeighborsEmpty(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } @Shadow - private void grow(World world, BlockPos pos, int age) {} + private void placeGrownFlower(Level world, BlockPos pos, int age) {} @Shadow - private void die(World world, BlockPos pos) {} + private void placeDeadFlower(Level world, BlockPos pos) {} @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + if (GeneratorOptions.changeChorusPlant()) { + return state.getValue(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; + } + else { + return super.getShape(state, world, pos, context); + } } - @Inject(method = "die", at = @At("HEAD"), cancellable = true) - private void beOnDie(World world, BlockPos pos, CallbackInfo info) { - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(Blocks.CHORUS_PLANT) || down.isIn(EndTags.GEN_TERRAIN)) { - world.setBlockState(pos, this.getDefaultState().with(Properties.AGE_5, 5), 2); - world.syncWorldEvent(1034, pos, 0); + @Inject(method = "placeDeadFlower", at = @At("HEAD"), cancellable = true) + private void be_placeDeadFlower(Level world, BlockPos pos, CallbackInfo info) { + BlockState down = world.getBlockState(pos.below()); + if (down.is(Blocks.CHORUS_PLANT) || down.is(EndTags.GEN_TERRAIN)) { + world.setBlock(pos, this.defaultBlockState().setValue(BlockStateProperties.AGE_5, 5), 2); + world.levelEvent(1034, pos, 0); } info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index f133d166..c6f1bdcd 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -6,89 +6,117 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { - public ChorusPlantBlockMixin(Settings settings) { + public ChorusPlantBlockMixin(Properties settings) { super(settings); } @Inject(method = "*", at = @At("TAIL")) - private void beOnInit(AbstractBlock.Settings settings, CallbackInfo info) { - this.setDefaultState(this.getDefaultState().with(BlocksHelper.ROOTS, false)); + private void beOnInit(BlockBehaviour.Properties settings, CallbackInfo info) { + if (GeneratorOptions.changeChorusPlant()) { + this.registerDefaultState(this.defaultBlockState().setValue(BlocksHelper.ROOTS, false)); + } } - @Inject(method = "appendProperties", at = @At("TAIL")) - private void beAddProperties(StateManager.Builder builder, CallbackInfo info) { - builder.add(BlocksHelper.ROOTS); + @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) + private void be_createBlockStateDefinition(StateDefinition.Builder builder, CallbackInfo info) { + GeneratorOptions.init(); + if (GeneratorOptions.changeChorusPlant()) { + builder.add(BlocksHelper.ROOTS); + } } - - @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) - private void beConnectionProperties(BlockView world, BlockPos pos, CallbackInfoReturnable info) { + + @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { + BlockPos pos = ctx.getClickedPos(); + Level world = ctx.getLevel(); BlockState plant = info.getReturnValue(); - if (plant.isOf(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - info.setReturnValue(plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true)); + if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, true).setValue(BlockStateProperties.DOWN, true)); + } + else { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); + } + info.cancel(); + } + } + + @Inject(method = "Lnet/minecraft/world/level/block/ChorusPlantBlock;getStateForPlacement" + + "(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)" + + "Lnet/minecraft/world/level/block/state/BlockState;", + at = @At("RETURN"), cancellable = true) + private void be_getStateForPlacement(BlockGetter blockGetter, BlockPos blockPos, CallbackInfoReturnable info) { + BlockState plant = info.getReturnValue(); + if (plant.is(Blocks.CHORUS_PLANT)) { + if (blockGetter.getBlockState(blockPos.below()).is(EndTags.END_GROUND)) { + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true).setValue(BlocksHelper.ROOTS, true)); + } + else { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); + } info.cancel(); } else { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, false)); + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, false)); + } info.cancel(); } } } - @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(EndBlocks.CHORUS_NYLIUM) || down.isOf(Blocks.END_STONE)) { + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) + private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { + BlockState down = world.getBlockState(pos.below()); + if (down.is(EndBlocks.CHORUS_NYLIUM) || down.is(Blocks.END_STONE)) { info.setReturnValue(true); info.cancel(); } } - @Inject(method = "getStateForNeighborUpdate", at = @At("RETURN"), cancellable = true) - private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { + @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) + private void be_updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); - if (plant.isOf(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - plant = plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true); + if (plant.is(Blocks.CHORUS_PLANT)) { + if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + if (GeneratorOptions.changeChorusPlant()) { + plant = plant.setValue(BlockStateProperties.DOWN, true).setValue(BlocksHelper.ROOTS, true); + } + else { + plant = plant.setValue(BlockStateProperties.DOWN, true); + } info.cancel(); } else { - plant = plant.with(BlocksHelper.ROOTS, false); + if (GeneratorOptions.changeChorusPlant()) { + plant = plant.setValue(BlocksHelper.ROOTS, false); + } info.cancel(); } info.setReturnValue(plant); info.cancel(); } } - - @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) - private void beGetPlacementState(ItemPlacementContext ctx, CallbackInfoReturnable info) { - BlockPos pos = ctx.getBlockPos(); - World world = ctx.getWorld(); - BlockState plant = info.getReturnValue(); - if (ctx.canPlace() && plant.isOf(Blocks.CHORUS_PLANT) && world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, true).with(Properties.DOWN, true)); - info.cancel(); - } - } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 4f696af9..bcc4191f 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -7,31 +7,36 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusFlowerBlock; -import net.minecraft.block.ConnectingBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.ChorusPlantFeature; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { - @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { - if (structureWorldAccess.isAir(blockPos) && structureWorldAccess.getBlockState(blockPos.down()).isOf(EndBlocks.CHORUS_NYLIUM)) { - ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { + ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); - if (bottom.isOf(Blocks.CHORUS_PLANT)) { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); + if (bottom.is(Blocks.CHORUS_PLANT)) { + if ((GeneratorOptions.changeChorusPlant())) { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(BlocksHelper.ROOTS, true).setValue(PipeBlock.DOWN, true)); + } + else { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(PipeBlock.DOWN, true)); + } } info.setReturnValue(true); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java new file mode 100644 index 00000000..9733e648 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -0,0 +1,46 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import ru.betterend.interfaces.IBiomeArray; + +@Mixin(ChunkBiomeContainer.class) +public class ChunkBiomeContainerMixin implements IBiomeArray { + @Final + @Shadow + private Biome[] biomes; + + @Final + @Shadow + private static int WIDTH_BITS; + + @Final + @Shadow + public static int HORIZONTAL_MASK; + + @Final + @Shadow + public static int VERTICAL_MASK; + + @Override + public void be_setBiome(Biome biome, BlockPos pos) { + int biomeX = pos.getX() >> 2; + int biomeY = pos.getY() >> 2; + int biomeZ = pos.getZ() >> 2; + int index = be_getArrayIndex(biomeX, biomeY, biomeZ); + biomes[index] = biome; + } + + private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { + int i = biomeX & HORIZONTAL_MASK; + int j = Mth.clamp(biomeY, 0, VERTICAL_MASK); + int k = biomeZ & HORIZONTAL_MASK; + return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index e5bf69a9..1d754b20 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -3,13 +3,13 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.block.ComposterBlock; -import net.minecraft.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.ComposterBlock; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { @Invoker - static void callRegisterCompostableItem(float levelIncreaseChance, ItemConvertible item) { + static void callAdd(float levelIncreaseChance, ItemLike item) { throw new AssertionError("@Invoker dummy body called"); } } diff --git a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java new file mode 100644 index 00000000..11c7f94e --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -0,0 +1,29 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.level.block.CraftingTableBlock; + +@Mixin(CraftingMenu.class) +public abstract class CraftingMenuMixin { + @Final + @Shadow + private ContainerLevelAccess access; + + @Inject(method = "stillValid", at = @At("HEAD"), cancellable = true) + private void be_stillValid(Player player, CallbackInfoReturnable info) { + if (access.evaluate((world, pos) -> { + return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; + }, true)) { + info.setReturnValue(true); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java deleted file mode 100644 index ac54037a..00000000 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.block.CraftingTableBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.screen.CraftingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; - -@Mixin(CraftingScreenHandler.class) -public abstract class CraftingScreenHandlerMixin -{ - @Shadow - @Final - private ScreenHandlerContext context; - - @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) - private void canUse(PlayerEntity player, CallbackInfoReturnable info) { - info.setReturnValue(context.run((world, pos) -> { - return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; - }, true)); - info.cancel(); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 0c462a2c..5e0ac980 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -5,21 +5,27 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import net.minecraft.world.gen.chunk.NoiseChunkGenerator; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import ru.betterend.world.generator.BetterEndBiomeSource; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { - @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) - private static void replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { - info.setReturnValue(new NoiseChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { - return (ChunkGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.END); - })); - info.cancel(); + @Inject(method = "defaultEndGenerator", at = @At("HEAD"), cancellable = true) + private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { + info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, + () -> chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END))); + } + + @Inject(method = "createDragonFight", at = @At("HEAD"), cancellable = true) + private void be_hasEnderDragonFight(CallbackInfoReturnable info) { + if (!GeneratorOptions.hasDragonFights()) { + info.setReturnValue(false); + } } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java new file mode 100644 index 00000000..311b79fe --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -0,0 +1,140 @@ +package ru.betterend.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.core.Registry; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import ru.betterend.registry.EndTags; + +@Mixin(EnchantmentMenu.class) +public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { + @Final + @Shadow + private Container enchantSlots; + + @Final + @Shadow + private ContainerLevelAccess access; + + @Final + @Shadow + private Random random; + + @Final + @Shadow + private DataSlot enchantmentSeed; + + @Shadow + @Final + public int[] costs; + + @Shadow + @Final + public int[] enchantClue; + + @Shadow + @Final + public int[] levelClue; + + protected EnchantmentMenuMixin(MenuType type, int syncId) { + super(type, syncId); + } + + @Inject(method = "slotsChanged", at = @At("HEAD"), cancellable = true) + private void be_slotsChanged(Container inventory, CallbackInfo info) { + if (inventory == this.enchantSlots) { + ItemStack itemStack = inventory.getItem(0); + if (!itemStack.isEmpty() && itemStack.isEnchantable()) { + this.access.execute((world, blockPos) -> { + int i = 0; + + int j; + for (j = -1; j <= 1; ++j) { + for (int k = -1; k <= 1; ++k) { + if ((j != 0 || k != 0) && world.isEmptyBlock(blockPos.offset(k, 0, j)) && world.isEmptyBlock(blockPos.offset(k, 1, j))) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j * 2)).is(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k * 2, 1, j * 2)).is(EndTags.BOOKSHELVES)) { + ++i; + } + + if (k != 0 && j != 0) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j)).is(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k * 2, 1, j)).is(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k, 0, j * 2)).is(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k, 1, j * 2)).is(EndTags.BOOKSHELVES)) { + ++i; + } + } + } + } + } + + random.setSeed(enchantmentSeed.get()); + + for (j = 0; j < 3; ++j) { + costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); + enchantClue[j] = -1; + levelClue[j] = -1; + if (costs[j] < j + 1) { + costs[j] = 0; + } + } + + for (j = 0; j < 3; ++j) { + if (this.costs[j] > 0) { + List list = this.getEnchantmentList(itemStack, j, this.costs[j]); + if (list != null && !list.isEmpty()) { + EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); + enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); + levelClue[j] = enchantmentLevelEntry.level; + } + } + } + + broadcastChanges(); + }); + } + else { + for (int i = 0; i < 3; ++i) { + costs[i] = 0; + enchantClue[i] = -1; + levelClue[i] = -1; + } + } + info.cancel(); + } + } + + @Shadow + private List getEnchantmentList(ItemStack stack, int slot, int level) { + return null; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java deleted file mode 100644 index 669666ea..00000000 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java +++ /dev/null @@ -1,140 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; -import java.util.Random; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.EnchantmentLevelEntry; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.EnchantmentScreenHandler; -import net.minecraft.screen.Property; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.util.registry.Registry; -import ru.betterend.registry.EndTags; - -@Mixin(EnchantmentScreenHandler.class) -public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { - @Shadow - @Final - private Inventory inventory; - - @Shadow - @Final - private ScreenHandlerContext context; - - @Shadow - @Final - private Random random; - - @Shadow - @Final - private Property seed; - - @Shadow - @Final - public int[] enchantmentPower; - - @Shadow - @Final - public int[] enchantmentId; - - @Shadow - @Final - public int[] enchantmentLevel; - - protected EnchantmentScreenHandlerMixin(ScreenHandlerType type, int syncId) { - super(type, syncId); - } - - @Inject(method = "onContentChanged", at = @At("HEAD"), cancellable = true) - private void beOnContentChanged(Inventory inventory, CallbackInfo info) { - if (inventory == this.inventory) { - ItemStack itemStack = inventory.getStack(0); - if (!itemStack.isEmpty() && itemStack.isEnchantable()) { - this.context.run((world, blockPos) -> { - int i = 0; - - int j; - for (j = -1; j <= 1; ++j) { - for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && world.isAir(blockPos.add(k, 0, j)) && world.isAir(blockPos.add(k, 1, j))) { - if (world.getBlockState(blockPos.add(k * 2, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - - if (world.getBlockState(blockPos.add(k * 2, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - - if (k != 0 && j != 0) { - if (world.getBlockState(blockPos.add(k * 2, 0, j)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - - if (world.getBlockState(blockPos.add(k * 2, 1, j)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - - if (world.getBlockState(blockPos.add(k, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - - if (world.getBlockState(blockPos.add(k, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { - ++i; - } - } - } - } - } - - this.random.setSeed((long) this.seed.get()); - - for (j = 0; j < 3; ++j) { - this.enchantmentPower[j] = EnchantmentHelper.calculateRequiredExperienceLevel(this.random, j, i, itemStack); - this.enchantmentId[j] = -1; - this.enchantmentLevel[j] = -1; - if (this.enchantmentPower[j] < j + 1) { - this.enchantmentPower[j] = 0; - } - } - - for (j = 0; j < 3; ++j) { - if (this.enchantmentPower[j] > 0) { - List list = this.generateEnchantments(itemStack, j, this.enchantmentPower[j]); - if (list != null && !list.isEmpty()) { - EnchantmentLevelEntry enchantmentLevelEntry = (EnchantmentLevelEntry) list.get(this.random.nextInt(list.size())); - this.enchantmentId[j] = Registry.ENCHANTMENT.getRawId(enchantmentLevelEntry.enchantment); - this.enchantmentLevel[j] = enchantmentLevelEntry.level; - } - } - } - - this.sendContentUpdates(); - }); - } - else { - for (int i = 0; i < 3; ++i) { - this.enchantmentPower[i] = 0; - this.enchantmentId[i] = -1; - this.enchantmentLevel[i] = -1; - } - } - info.cancel(); - } - } - - @Shadow - private List generateEnchantments(ItemStack stack, int slot, int level) { - return null; - } -} diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java new file mode 100644 index 00000000..e91f8949 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -0,0 +1,43 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.feature.EndCityFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(EndCityFeature.class) +public class EndCityFeatureMixin { + @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) + private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + if (GeneratorOptions.useNewGenerator()) { + int chance = GeneratorOptions.getEndCityFailChance(); + if (chance == 0) { + info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.cancel(); + } + else if (chunkRandom.nextInt(chance) == 0){ + info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.cancel(); + } + else { + info.setReturnValue(false); + info.cancel(); + } + } + } + + @Shadow + private static int getYPositionForFeature(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + return 0; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java new file mode 100644 index 00000000..e96ded09 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -0,0 +1,72 @@ +package ru.betterend.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import ru.betterend.BetterEnd; +import ru.betterend.util.StructureHelper; +import ru.betterend.util.WorldDataUtil; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(EndPodiumFeature.class) +public class EndPodiumFeatureMixin { + @Final + @Shadow + private boolean active; + + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { + if (!GeneratorOptions.hasPortal()) { + info.setReturnValue(false); + info.cancel(); + } + else if (GeneratorOptions.replacePortal()) { + blockPos = be_updatePos(blockPos, world); + StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(active ? "portal/end_portal_active" : "portal/end_portal_inactive")); + BlockPos size = structure.getSize(); + blockPos = blockPos.offset(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); + structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); + info.setReturnValue(true); + info.cancel(); + } + } + + @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) + private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { + return be_updatePos(blockPos, world); + } + + private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { + if (GeneratorOptions.useNewGenerator()) { + BlockPos pos = GeneratorOptions.getPortalPos(); + if (pos.equals(BlockPos.ZERO)) { + int y = world.getChunk(blockPos).getHeight(Types.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()); + if (y < 1) { + y = 65; + } + pos = new BlockPos(pos.getX(), y, pos.getZ()); + GeneratorOptions.setPortalPos(pos); + WorldDataUtil.getRootTag().put("portal", NbtUtils.writeBlockPos(pos)); + WorldDataUtil.saveFile(); + } + return pos; + } + return blockPos; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java new file mode 100644 index 00000000..4102fef9 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import ru.betterend.effects.EndEnchantments; +import ru.betterend.effects.EndStatusEffects; + +@Mixin(EnderMan.class) +public abstract class EnderManMixin { + @Inject(method = "isLookingAtMe", at = @At("HEAD"), cancellable = true) + private void be_isLookingAtMe(Player player, CallbackInfoReturnable info) { + if (player.isCreative() || player.hasEffect(EndStatusEffects.END_VEIL) || + EnchantmentHelper.getItemEnchantmentLevel(EndEnchantments.END_VEIL, player.getItemBySlot(EquipmentSlot.HEAD)) > 0) { + info.setReturnValue(false); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java deleted file mode 100644 index 5bd9b493..00000000 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.player.PlayerEntity; -import ru.betterend.effects.EndEnchantments; -import ru.betterend.effects.EndStatusEffects; - -@Mixin(EndermanEntity.class) -public abstract class EndermanEntityMixin { - - @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) - private void isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { - if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || - EnchantmentHelper.getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { - info.setReturnValue(false); - info.cancel(); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 3710312a..4f9372b8 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -5,112 +5,89 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.phys.Vec3; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - - private BlockPos beExitPos; - private long beCooldown; - @Shadow - public float yaw; + public float yRot; @Shadow - public float pitch; + public float xRot; @Shadow public boolean removed; @Shadow - public World world; + public Level level; @Final @Shadow - public abstract void detach(); + public abstract void unRide(); @Shadow - public abstract Vec3d getVelocity(); + public abstract Vec3 getDeltaMovement(); @Shadow public abstract EntityType getType(); @Shadow - public abstract void copyFrom(Entity original); - - @Shadow - public abstract Entity moveToWorld(ServerWorld destination); - - @Shadow - protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); - - @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { - if (!removed && beExitPos != null && world instanceof ServerWorld) { - this.detach(); - this.world.getProfiler().push("changeDimension"); - this.world.getProfiler().push("reposition"); - TeleportTarget teleportTarget = this.getTeleportTarget(destination); + protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); + + private BlockPos exitPos; + + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) + public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { + if (!removed && be_canTeleport() && level instanceof ServerLevel) { + unRide(); + level.getProfiler().push("changeDimension"); + level.getProfiler().push("reposition"); + PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { - this.world.getProfiler().swap("reloading"); - Entity entity = this.getType().create(destination); + level.getProfiler().popPush("reloading"); + Entity entity = getType().create(destination); if (entity != null) { - entity.copyFrom(Entity.class.cast(this)); - entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z, teleportTarget.yaw, entity.pitch); - entity.setVelocity(teleportTarget.velocity); - destination.onDimensionChanged(entity); + entity.restoreFrom(Entity.class.cast(this)); + entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); + entity.setDeltaMovement(teleportTarget.speed); + destination.addFromAnotherDimension(entity); } - this.removed = true; - this.world.getProfiler().pop(); - ((ServerWorld) this.world).resetIdleTimeout(); - destination.resetIdleTimeout(); - this.world.getProfiler().pop(); - this.beExitPos = null; + removed = true; + level.getProfiler().pop(); + ((ServerLevel) level).resetEmptyTime(); + destination.resetEmptyTime(); + level.getProfiler().pop(); + be_resetExitPos(); info.setReturnValue(entity); - info.cancel(); } } } - @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { - if (beExitPos != null) { - info.setReturnValue(new TeleportTarget(new Vec3d(beExitPos.getX() + 0.5D, beExitPos.getY(), beExitPos.getZ() + 0.5D), getVelocity(), yaw, pitch)); - info.cancel(); + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) + protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { + if (be_canTeleport()) { + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); } } - - @Inject(method = "baseTick", at = @At("TAIL")) - public void baseTick(CallbackInfo info) { - if (hasCooldown()) { - this.beCooldown--; - } - } - + @Override - public long beGetCooldown() { - return this.beCooldown; + public void be_setExitPos(BlockPos pos) { + this.exitPos = pos.immutable(); } @Override - public void beSetCooldown(long time) { - this.beCooldown = time; + public void be_resetExitPos() { + this.exitPos = null; } @Override - public void beSetExitPos(BlockPos pos) { - this.beExitPos = pos; - } - - @Override - public BlockPos beGetExitPos() { - return this.beExitPos; + public boolean be_canTeleport() { + return this.exitPos != null; } } diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java deleted file mode 100644 index f7b16376..00000000 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; - -@Mixin(GenerationSettings.class) -public interface GenerationSettingsAccessor { - @Accessor("features") - List>>> getFeatures(); - - @Accessor("features") - void setFeatures(List>>> features); - - @Accessor("structureFeatures") - List>> getStructures(); - - @Accessor("structureFeatures") - void setStructures(List>> structures); -} diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java deleted file mode 100644 index dee0f41a..00000000 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; -import java.util.Random; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.ServerWorldAccess; - -@Mixin(HostileEntity.class) -public class HostileEntityMixin { - @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { - boolean canSpawn = info.getReturnValue(); - if (canSpawn && spawnReason == SpawnReason.NATURAL && type == EntityType.ENDERMAN) { - Box box = new Box(pos).expand(16); - List entities = serverWorldAccess.getEntitiesByClass(EndermanEntity.class, box, (entity) -> { return true; }); - info.setReturnValue(entities.size() < 6); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java b/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java deleted file mode 100644 index 50d5451b..00000000 --- a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.ai.pathing.LandPathNodeMaker; -import net.minecraft.entity.ai.pathing.PathNodeType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import ru.betterend.registry.EndBlocks; - -@Mixin(LandPathNodeMaker.class) -public class LandPathNodeMakerMixin { - @Inject(method = "getCommonNodeType", at = @At(value = "HEAD"), cancellable = true) - private static void beModifyPathNodes(BlockView blockView, BlockPos blockPos, CallbackInfoReturnable info) { - BlockState blockState = blockView.getBlockState(blockPos); - if (blockState.isOf(EndBlocks.NEEDLEGRASS) || blockState.isOf(EndBlocks.MURKWEED)) { - beCactusDamage(info); - } - } - - private static void beCactusDamage(CallbackInfoReturnable info) { - info.setReturnValue(PathNodeType.DAMAGE_CACTUS); - info.cancel(); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 954e0276..35cc80c6 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -3,44 +3,163 @@ package ru.betterend.mixin.common; import java.util.Collection; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.item.Item; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import ru.betterend.item.ArmoredElytra; @Mixin(LivingEntity.class) -public abstract class LivingEntityMixin { +public abstract class LivingEntityMixin extends Entity { + + public LivingEntityMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Shadow + protected int fallFlyTicks; + + @Shadow + public abstract boolean hasEffect(MobEffect mobEffect); + + @Shadow + public abstract ItemStack getItemBySlot(EquipmentSlot equipmentSlot); + + @Shadow + public abstract void calculateEntityAnimation(LivingEntity livingEntity, boolean b); + + @Shadow + protected abstract SoundEvent getFallDamageSound(int i); + + @Shadow + public abstract boolean isFallFlying(); private Entity lastAttacker; - - @Inject(method = "damage", at = @At("HEAD")) - public void damage(DamageSource source, float amount, CallbackInfoReturnable info) { - this.lastAttacker = source.getAttacker(); + + @Inject(method = "hurt", at = @At("HEAD")) + public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable info) { + this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) - private float increaseKnockback(float value, double x, double z) { + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) + private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; - value += this.getKnockback(attacker.getMainHandStack().getItem()); + value += this.be_getKnockback(attacker.getMainHandItem().getItem()); } return value; } - - private double getKnockback(Item tool) { + + @Inject(method = "updateFallFlying", at = @At("HEAD"), cancellable = true) + private void be_updateFallFlying(CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (!level.isClientSide && itemStack.getItem() instanceof ArmoredElytra) { + boolean isFlying = getSharedFlag(7); + if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) { + if (ElytraItem.isFlyEnabled(itemStack)) { + if ((fallFlyTicks + 1) % 20 == 0) { + itemStack.hurtAndBreak(1, LivingEntity.class.cast(this), (livingEntity) -> { + livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST); + }); + } + isFlying = true; + } else { + isFlying = false; + } + } else { + isFlying = false; + } + setSharedFlag(7, isFlying); + info.cancel(); + } + } + + @Inject(method = "travel", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/LivingEntity;isFallFlying()Z", + shift = Shift.AFTER), cancellable = true) + public void be_travel(Vec3 vec3, CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (isFallFlying() && itemStack.getItem() instanceof ArmoredElytra) { + Vec3 moveDelta = getDeltaMovement(); + if (moveDelta.y > -0.5D) { + fallDistance = 1.0F; + } + + Vec3 lookAngle = getLookAngle(); + double d = 0.08D; + float rotX = xRot * 0.017453292F; + double k = Math.sqrt(lookAngle.x * lookAngle.x + lookAngle.z * lookAngle.z); + double l = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double lookLen = lookAngle.length(); + float n = Mth.cos(rotX); + n = (float) (n * n * Math.min(1.0D, lookLen / 0.4D)); + moveDelta = getDeltaMovement().add(0.0D, d * (-1.0D + (double) n * 0.75D), 0.0D); + double coef; + if (moveDelta.y < 0.0D && k > 0.0D) { + coef = moveDelta.y * -0.1D * (double) n; + moveDelta = moveDelta.add(lookAngle.x * coef / k, coef, lookAngle.z * coef / k); + } + + if (rotX < 0.0F && k > 0.0D) { + coef = l * (double) (-Mth.sin(rotX)) * 0.04D; + moveDelta = moveDelta.add(-lookAngle.x * coef / k, coef * 3.2D, -lookAngle.z * coef / k); + } + + if (k > 0.0D) { + moveDelta = moveDelta.add((lookAngle.x / k * l - moveDelta.x) * 0.1D, 0.0D, (lookAngle.z / k * l - moveDelta.z) * 0.1D); + } + moveDelta = moveDelta.multiply(0.9900000095367432D, 0.9800000190734863D, 0.9900000095367432D); + double movementFactor = ((ArmoredElytra) itemStack.getItem()).getMovementFactor(); + moveDelta = moveDelta.multiply(movementFactor, 1.0D, movementFactor); + setDeltaMovement(moveDelta); + move(MoverType.SELF, moveDelta); + if (!level.isClientSide) { + if (horizontalCollision) { + coef = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double r = l - coef; + float dmg = (float) (r * 10.0D - 3.0D); + if (dmg > 0.0F) { + playSound(getFallDamageSound((int) dmg), 1.0F, 1.0F); + hurt(DamageSource.FLY_INTO_WALL, dmg); + } + } + if (onGround) { + setSharedFlag(7, false); + } + } + + calculateEntityAnimation(LivingEntity.class.cast(this), this instanceof FlyingAnimal); + info.cancel(); + } + } + + private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; - Collection modifiers = tool.getAttributeModifiers(EquipmentSlot.MAINHAND) - .get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); + Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_KNOCKBACK); if (modifiers.size() > 0) { - return modifiers.iterator().next().getValue(); + return modifiers.iterator().next().getAmount(); } return 0.0D; } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 14b87a78..1ae3f8d9 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -1,8 +1,10 @@ package ru.betterend.mixin.common; import java.util.Collection; +import java.util.Map; import java.util.concurrent.CompletableFuture; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -11,31 +13,89 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.resource.ServerResourceManager; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerResources; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.ServerLevelData; +import net.minecraft.world.level.storage.WorldData; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBiomes; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Shadow - private ServerResourceManager serverResourceManager; + private ServerResources resources; + + @Final + @Shadow + private Map, ServerLevel> levels; + + @Final + @Shadow + protected WorldData worldData; @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) - private void beOnReload(Collection collection, CallbackInfoReturnable> info) { - beInjectRecipes(); + private void be_reloadResources(Collection collection, CallbackInfoReturnable> info) { + be_injectRecipes(); } - @Inject(method = "loadWorld", at = @At(value = "RETURN"), cancellable = true) - private void beOnLoadWorld(CallbackInfo info) { - beInjectRecipes(); - EndBiomes.initRegistry((MinecraftServer) (Object) this); + @Inject(method = "loadLevel", at = @At(value = "RETURN"), cancellable = true) + private void be_loadLevel(CallbackInfo info) { + be_injectRecipes(); + EndBiomes.initRegistry(MinecraftServer.class.cast(this)); + } + + @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) + private final void be_overworld(CallbackInfoReturnable info) { + if (GeneratorOptions.swapOverworldToEnd()) { + ServerLevel world = levels.get(Level.END); + if (world == null) { + world = levels.get(Level.OVERWORLD); + } + info.setReturnValue(world); + info.cancel(); + } + } + + @Inject(method = "createLevels", at = @At(value = "TAIL")) + private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd()) { + ServerLevel world = levels.get(Level.END); + if (world == null) { + world = levels.get(Level.OVERWORLD); + } + this.getPlayerList().setLevel(world); + ServerLevelData serverWorldProperties = worldData.overworldData(); + net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings(); + boolean bl = generatorOptions.isDebug(); + setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); + } + } + + @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) + private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { + info.cancel(); + } + } + + @Shadow + private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} + + @Shadow + public PlayerList getPlayerList() { + return null; } - private void beInjectRecipes() { + private void be_injectRecipes() { if (FabricLoader.getInstance().isModLoaded("kubejs")) { - RecipeManagerAccessor accessor = (RecipeManagerAccessor) serverResourceManager.getRecipeManager(); - accessor.setRecipes(EndRecipeManager.getMap(accessor.getRecipes())); + RecipeManagerAccessor accessor = (RecipeManagerAccessor) resources.getRecipeManager(); + accessor.be_setRecipes(EndRecipeManager.getMap(accessor.be_getRecipes())); } } } diff --git a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java new file mode 100644 index 00000000..b2d77c7c --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java @@ -0,0 +1,30 @@ +package ru.betterend.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; + +@Mixin(Monster.class) +public class MonsterMixin { + @Inject(method = "checkMonsterSpawnRules", at = @At(value = "RETURN"), cancellable = true) + private static void be_checkMonsterSpawnRules(EntityType type, ServerLevelAccessor serverWorldAccess, MobSpawnType spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { + boolean canSpawn = info.getReturnValue(); + if (canSpawn && spawnReason == MobSpawnType.NATURAL && type == EntityType.ENDERMAN) { + AABB box = new AABB(pos).inflate(16); + List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { return true; }); + info.setReturnValue(entities.size() < 6); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java new file mode 100644 index 00000000..8d59913e --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -0,0 +1,42 @@ +package ru.betterend.mixin.common; + +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.StructureSettings; +import ru.betterend.world.generator.GeneratorOptions; +import ru.betterend.world.generator.TerrainGenerator; + +@Mixin(NoiseBasedChunkGenerator.class) +public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { + @Final + @Shadow + protected Supplier settings; + + public NoiseBasedChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { + super(populationSource, biomeSource, structuresConfig, worldSeed); + } + + @Inject(method = "(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/world/level/biome/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) + private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { + TerrainGenerator.initNoise(seed); + } + + @Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) + private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { + if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java new file mode 100644 index 00000000..08f2d54d --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -0,0 +1,27 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; +import ru.betterend.events.PlayerAdvancementsEvents; + +@Mixin(PlayerAdvancements.class) +public abstract class PlayerAdvancementsMixin { + @Shadow + private ServerPlayer player; + + @Inject(method = "award", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", + shift = Shift.AFTER)) + public void be_award(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(player, advancement, criterionName); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java deleted file mode 100644 index e00fa670..00000000 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Optional; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityMixin { - private static Direction[] HORIZONTAL; - - @Inject(method = "findRespawnPosition", at = @At(value = "HEAD"), cancellable = true) - private static void statueRespawn(ServerWorld world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { - BlockState blockState = world.getBlockState(pos); - if (blockState.isOf(EndBlocks.RESPAWN_OBELISK)) { - info.setReturnValue(beObeliskRespawnPosition(world, pos, blockState)); - info.cancel(); - } - } - - private static Optional beObeliskRespawnPosition(ServerWorld world, BlockPos pos, BlockState state) { - if (state.get(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { - pos = pos.down(2); - } - else if (state.get(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { - pos = pos.down(); - } - if (HORIZONTAL == null) { - HORIZONTAL = BlocksHelper.makeHorizontal(); - } - MHelper.shuffle(HORIZONTAL, world.getRandom()); - for (Direction dir: HORIZONTAL) { - BlockPos p = pos.offset(dir); - BlockState state2 = world.getBlockState(p); - if (!state2.getMaterial().blocksMovement() && state2.getCollisionShape(world, pos).isEmpty()) { - return Optional.of(Vec3d.of(p).add(0.5, 0, 0.5)); - } - } - return Optional.empty(); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java new file mode 100644 index 00000000..408fb3fa --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -0,0 +1,258 @@ +package ru.betterend.mixin.common; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.authlib.GameProfile; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Dynamic; + +import io.netty.buffer.Unpooled; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.core.RegistryAccess; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.Connection; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.game.ClientboundLoginPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket; +import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerScoreboard; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.GameProfileCache; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelData; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(PlayerList.class) +public class PlayerListMixin { + @Final + @Shadow + private static Logger LOGGER; + + @Final + @Shadow + private MinecraftServer server; + + @Final + @Shadow + private RegistryAccess.RegistryHolder registryHolder; + + @Shadow + private int viewDistance; + + @Final + @Shadow + private List players; + + @Final + @Shadow + private Map playersByUUID; + + @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) + public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd()) { + GameProfile gameProfile = player.getGameProfile(); + GameProfileCache userCache = this.server.getProfileCache(); + GameProfile gameProfile2 = userCache.get(gameProfile.getId()); + String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); + userCache.add(gameProfile); + CompoundTag compoundTag = this.load(player); + ResourceKey var23; + if (compoundTag != null) { + DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); + Logger var10001 = LOGGER; + var10001.getClass(); + var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); + } + else { + var23 = Level.END; + } + + ResourceKey registryKey = var23; + ServerLevel serverWorld = this.server.getLevel(registryKey); + ServerLevel serverWorld3; + if (serverWorld == null) { + LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); + serverWorld3 = this.server.overworld(); + } + else { + serverWorld3 = serverWorld; + } + + player.setLevel(serverWorld3); + player.gameMode.setLevel((ServerLevel) player.level); + String string2 = "local"; + if (connection.getRemoteAddress() != null) { + string2 = connection.getRemoteAddress().toString(); + } + + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); + LevelData worldProperties = serverWorld3.getLevelData(); + this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); + ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); + GameRules gameRules = serverWorld3.getGameRules(); + boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); + boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); + serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), + worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, + serverWorld3.isDebug(), serverWorld3.isFlat())); + serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); + serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); + serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); + serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); + serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); + this.sendPlayerPermissionLevel(player); + player.getStats().markAllDirty(); + player.getRecipeBook().sendInitialRecipeBook(player); + this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); + this.server.invalidateStatus(); + TranslatableComponent mutableText2; + if (player.getGameProfile().getName().equalsIgnoreCase(string)) { + mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); + } + else { + mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); + } + + this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); + serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); + this.players.add(player); + this.playersByUUID.put(player.getUUID(), player); + this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); + + for (int i = 0; i < this.players.size(); ++i) { + player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); + } + + serverWorld3.addNewPlayer(player); + this.server.getCustomBossEvents().onPlayerConnect(player); + this.sendLevelInfo(player, serverWorld3); + if (!this.server.getResourcePack().isEmpty()) { + player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); + } + + Iterator var24 = player.getActiveEffects().iterator(); + + while (var24.hasNext()) { + MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); + serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); + } + + if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { + CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); + Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { + return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; + }); + if (entity != null) { + UUID uUID2; + if (compoundTag2.hasUUID("Attach")) { + uUID2 = compoundTag2.getUUID("Attach"); + } + else { + uUID2 = null; + } + + Iterator var21; + Entity entity3; + if (entity.getUUID().equals(uUID2)) { + player.startRiding(entity, true); + } + else { + var21 = entity.getIndirectPassengers().iterator(); + + while (var21.hasNext()) { + entity3 = (Entity) var21.next(); + if (entity3.getUUID().equals(uUID2)) { + player.startRiding(entity3, true); + break; + } + } + } + + if (!player.isPassenger()) { + LOGGER.warn("Couldn't reattach entity to player"); + serverWorld3.despawn(entity); + var21 = entity.getIndirectPassengers().iterator(); + + while (var21.hasNext()) { + entity3 = (Entity) var21.next(); + serverWorld3.despawn(entity3); + } + } + } + } + + player.initMenu(); + info.cancel(); + } + } + + @Shadow + public CompoundTag load(ServerPlayer player) { + return null; + } + + @Shadow + private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} + + @Shadow + public void sendPlayerPermissionLevel(ServerPlayer player) {} + + @Shadow + public int getPlayerCount() { + return 0; + } + + @Shadow + public MinecraftServer getServer() { + return null; + } + + @Shadow + protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} + + @Shadow + public void broadcastMessage(Component message, ChatType type, UUID senderUuid) {} + + @Shadow + public void broadcastAll(Packet packet) {} + + @Shadow + public void sendLevelInfo(ServerPlayer player, ServerLevel world) {} +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java new file mode 100644 index 00000000..292644d1 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -0,0 +1,79 @@ +package ru.betterend.mixin.common; + +import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +@Mixin(Player.class) +public abstract class PlayerMixin extends LivingEntity { + + protected PlayerMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + private static Direction[] horizontal; + + @Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At(value = "HEAD"), cancellable = true) + private static void be_findRespawnPositionAndUseSpawnBlock(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { + BlockState blockState = world.getBlockState(pos); + if (blockState.is(EndBlocks.RESPAWN_OBELISK)) { + info.setReturnValue(be_obeliskRespawnPosition(world, pos, blockState)); + info.cancel(); + } + } + + @Inject(method = "tryToStartFallFlying", at = @At("HEAD"), cancellable = true) + public void be_tryToStartFlying(CallbackInfoReturnable info) { + if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack)) { + setSharedFlag(7, true); + info.setReturnValue(true); + } + } + } + + private static Optional be_obeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { + if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { + pos = pos.below(2); + } + else if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { + pos = pos.below(); + } + if (horizontal == null) { + horizontal = BlocksHelper.makeHorizontal(); + } + MHelper.shuffle(horizontal, world.getRandom()); + for (Direction dir: horizontal) { + BlockPos p = pos.relative(dir); + BlockState state2 = world.getBlockState(p); + if (!state2.getMaterial().blocksMotion() && state2.getCollisionShape(world, pos).isEmpty()) { + return Optional.of(Vec3.atLowerCornerOf(p).add(0.5, 0, 0.5)); + } + } + return Optional.empty(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java new file mode 100644 index 00000000..49366687 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java @@ -0,0 +1,16 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionBrewing; + +@Mixin(PotionBrewing.class) +public interface PotionBrewingAccessor { + @Invoker + static void callAddMix(Potion input, Item item, Potion output) { + throw new AssertionError("@Invoker dummy body called"); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java index deaa0d66..0035a588 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java @@ -5,16 +5,16 @@ import java.util.Map; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; @Mixin(RecipeManager.class) public interface RecipeManagerAccessor { @Accessor("recipes") - Map, Map>> getRecipes(); + Map, Map>> be_getRecipes(); @Accessor("recipes") - void setRecipes(Map, Map>> recipes); + void be_setRecipes(Map, Map>> recipes); } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index 0528bc52..02e33c4b 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -15,35 +15,41 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.gson.JsonElement; -import net.minecraft.inventory.Inventory; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.recipe.RecipeType; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.World; +import net.minecraft.Util; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.Container; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import ru.betterend.recipe.EndRecipeManager; @Mixin(RecipeManager.class) -public class RecipeManagerMixin { +public abstract class RecipeManagerMixin { @Shadow - private Map, Map>> recipes; + private Map, Map>> recipes; @Inject(method = "apply", at = @At(value = "RETURN")) - private void beSetRecipes(Map map, ResourceManager resourceManager, Profiler profiler, CallbackInfo info) { + private void be_apply(Map map, ResourceManager resourceManager, ProfilerFiller profiler, CallbackInfo info) { recipes = EndRecipeManager.getMap(recipes); } @Shadow - private > Map> getAllOfType(RecipeType type) { + private > Map> byType(RecipeType type) { return null; } + /** + * @author paulevs + * @reason Remove conflicts with vanilla tags + * Change recipe order to show mod recipes first, helps when block have vanilla tag + * (example - mod stone with vanilla tags and furnace from that stone) + */ @Overwrite - public > Optional getFirstMatch(RecipeType type, C inventory, World world) { - Collection> values = getAllOfType(type).values(); + public > Optional getRecipeFor(RecipeType type, C inventory, Level world) { + Collection> values = byType(type).values(); List> list = new ArrayList>(values); list.sort((v1, v2) -> { boolean b1 = v1.getId().getNamespace().equals("minecraft"); @@ -52,7 +58,7 @@ public class RecipeManagerMixin { }); return list.stream().flatMap((recipe) -> { - return Util.stream(type.get(recipe, world, inventory)); + return Util.toStream(type.tryMatch(recipe, world, inventory)); }).findFirst(); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java new file mode 100644 index 00000000..ee5c0d69 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -0,0 +1,101 @@ +package ru.betterend.mixin.common; + +import java.io.File; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.metadata.ModMetadata; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.world.level.CustomSpawner; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.ServerLevelData; +import ru.betterend.BetterEnd; +import ru.betterend.util.DataFixerUtil; +import ru.betterend.util.WorldDataUtil; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(ServerLevel.class) +public class ServerLevelMixin { + private static final int DEV_VERSION = be_getVersionInt("63.63.63"); + private static final int FIX_VERSION = DEV_VERSION; + private static String lastWorld = null; + + @Inject(method = "*", at = @At("TAIL")) + private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + if (lastWorld != null && lastWorld.equals(session.getLevelId())) { + return; + } + + lastWorld = session.getLevelId(); + + ServerLevel world = ServerLevel.class.cast(this); + File dir = session.getDimensionPath(world.dimension()); + if (!new File(dir, "level.dat").exists()) { + dir = dir.getParentFile(); + } + File data = new File(dir, "data/betterend_data.nbt"); + + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); + int version = BetterEnd.isDevEnvironment() ? DEV_VERSION : be_getVersionInt(meta.getVersion().toString()); + + WorldDataUtil.load(data); + CompoundTag root = WorldDataUtil.getRootTag(); + int dataVersion = be_getVersionInt(root.getString("version")); + GeneratorOptions.setPortalPos(NbtUtils.readBlockPos(root.getCompound("portal"))); + + if (dataVersion < version) { + if (version < FIX_VERSION) { + DataFixerUtil.fixData(data.getParentFile()); + } + root.putString("version", be_getVersionString(version)); + WorldDataUtil.saveFile(); + } + } + + @Inject(method = "getSharedSpawnPos", at = @At("HEAD"), cancellable = true) + private void be_getSharedSpawnPos(CallbackInfoReturnable info) { + if (GeneratorOptions.changeSpawn()) { + if (ServerLevel.class.cast(this).dimension() == Level.END) { + info.setReturnValue(GeneratorOptions.getSpawn()); + info.cancel(); + } + } + } + + private static int be_getVersionInt(String version) { + if (version.isEmpty()) { + return 0; + } + try { + String[] values = version.split("\\."); + return Integer.parseInt(values[0]) << 12 | Integer.parseInt(values[1]) << 6 | Integer.parseInt(values[1]); + } + catch (Exception e) { + return 0; + } + } + + private static String be_getVersionString(int version) { + int a = (version >> 12) & 63; + int b = (version >> 6) & 63; + int c = version & 63; + return String.format(Locale.ROOT, "%d.%d.%d", a, b, c); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java deleted file mode 100644 index 4be1ac7d..00000000 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.betterend.mixin.common; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.LiteralText; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.entities.ESignBlockEntity; - -@Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin { - @Shadow - private static final Logger LOGGER = LogManager.getLogger(); - - @Shadow - public ServerPlayerEntity player; - - @Inject(method = "onSignUpdate", at = @At(value = "HEAD"), cancellable = true) - private void signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ServerPlayNetworkHandler) (Object) this, (ServerWorld) this.player.getServerWorld()); - this.player.updateLastActionTime(); - ServerWorld serverWorld = this.player.getServerWorld(); - BlockPos blockPos = packet.getPos(); - if (serverWorld.isChunkLoaded(blockPos)) { - BlockState blockState = serverWorld.getBlockState(blockPos); - BlockEntity blockEntity = serverWorld.getBlockEntity(blockPos); - if (blockEntity instanceof ESignBlockEntity) { - ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; - if (!signBlockEntity.isEditable() || signBlockEntity.getEditor() != this.player) { - LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString()); - return; - } - - String[] strings = packet.getText(); - - for (int i = 0; i < strings.length; ++i) { - signBlockEntity.setTextOnRow(i, new LiteralText(Formatting.strip(strings[i]))); - } - - signBlockEntity.markDirty(); - serverWorld.updateListeners(blockPos, blockState, blockState, 3); - - info.cancel(); - } - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java deleted file mode 100644 index 4128a8c4..00000000 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.BlockPos; -import ru.betterend.interfaces.TeleportingEntity; - -@Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin implements TeleportingEntity { - - private long beCooldown; - - @Inject(method = "tick", at = @At("TAIL")) - public void baseTick(CallbackInfo info) { - if (hasCooldown()) { - this.beCooldown--; - } - } - - @Override - public long beGetCooldown() { - return this.beCooldown; - } - - @Override - public void beSetCooldown(long time) { - this.beCooldown = time; - } - - @Override - public void beSetExitPos(BlockPos pos) {} - - @Override - public BlockPos beGetExitPos() { - return null; - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java new file mode 100644 index 00000000..a4d0ce6a --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -0,0 +1,143 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.mojang.authlib.GameProfile; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.phys.Vec3; +import ru.betterend.interfaces.TeleportingEntity; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(ServerPlayer.class) +public abstract class ServerPlayerMixin extends Player implements TeleportingEntity { + @Shadow + public ServerGamePacketListenerImpl connection; + @Final + @Shadow + public ServerPlayerGameMode gameMode; + @Final + @Shadow + public MinecraftServer server; + @Shadow + private boolean isChangingDimension; + @Shadow + private float lastSentHealth; + @Shadow + private int lastSentFood; + @Shadow + private int lastSentExp; + + private BlockPos exitPos; + + public ServerPlayerMixin(Level world, BlockPos pos, float yaw, GameProfile profile) { + super(world, pos, yaw, profile); + } + + @Inject(method = "createEndPlatform", at = @At("HEAD"), cancellable = true) + private void be_createEndSpawnPlatform(ServerLevel world, BlockPos centerPos, CallbackInfo info) { + if (!GeneratorOptions.generateObsidianPlatform()) { + info.cancel(); + } + } + + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) + protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { + if (be_canTeleport()) { + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); + } + } + + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) + public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { + if (be_canTeleport() && level instanceof ServerLevel) { + isChangingDimension = true; + ServerLevel serverWorld = getLevel(); + LevelData worldProperties = destination.getLevelData(); + ServerPlayer player = ServerPlayer.class.cast(this); + connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), + gameMode.getGameModeForPlayer(),gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); + connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + PlayerList playerManager = server.getPlayerList(); + playerManager.sendPlayerPermissionLevel(player); + serverWorld.removePlayerImmediately(player); + removed = false; + PortalInfo teleportTarget = findDimensionEntryPoint(destination); + if (teleportTarget != null) { + serverWorld.getProfiler().push("moving"); + serverWorld.getProfiler().pop(); + serverWorld.getProfiler().push("placing"); + setLevel(destination); + destination.addDuringPortalTeleport(player); + setRot(teleportTarget.yRot, teleportTarget.xRot); + moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); + serverWorld.getProfiler().pop(); + triggerDimensionChangeTriggers(serverWorld); + gameMode.setLevel(destination); + connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); + playerManager.sendLevelInfo(player, destination); + playerManager.sendAllPlayerInfo(player); + + for (MobEffectInstance statusEffectInstance : getActiveEffects()) { + connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); + } + + connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); + lastSentExp = -1; + lastSentHealth = -1.0F; + lastSentFood = -1; + } + be_resetExitPos(); + info.setReturnValue(player); + } + } + + @Shadow + abstract ServerLevel getLevel(); + + @Shadow + abstract void triggerDimensionChangeTriggers(ServerLevel origin); + + @Shadow + @Override + protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); + + @Override + public void be_setExitPos(BlockPos pos) { + this.exitPos = pos.immutable(); + } + + @Override + public void be_resetExitPos() { + this.exitPos = null; + } + + @Override + public boolean be_canTeleport() { + return this.exitPos != null; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java similarity index 57% rename from src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 3f16413c..5d5ba94f 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -3,16 +3,16 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; -@Mixin(SlimeEntity.class) -public class SlimeEntityMixin implements ISlime { +@Mixin(Slime.class) +public class SlimeMixin implements ISlime { @Shadow protected void setSize(int size, boolean heal) {} @Override - public void setSlimeSize(int size, boolean heal) { + public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } } diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java new file mode 100644 index 00000000..699b1250 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -0,0 +1,163 @@ +package ru.betterend.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.SpikeFeature; +import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import ru.betterend.BetterEnd; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.StructureHelper; +import ru.betterend.util.WorldDataUtil; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(SpikeFeature.class) +public class SpikeFeatureMixin { + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { + if (!GeneratorOptions.hasPillars()) { + info.setReturnValue(false); + } + } + + @Inject(method = "placeSpike", at = @At("HEAD"), cancellable = true) + private void be_placeSpike(ServerLevelAccessor world, Random random, SpikeConfiguration config, SpikeFeature.EndSpike spike, CallbackInfo info) { + int x = spike.getCenterX(); + int z = spike.getCenterZ(); + int radius = spike.getRadius(); + int minY = 0; + + long lx = (long) x; + long lz = (long) z; + if (lx * lx + lz * lz < 10000) { + String pillarID = String.format("%d_%d", x, z); + CompoundTag pillar = WorldDataUtil.getCompoundTag("pillars"); + boolean haveValue = pillar.contains(pillarID); + minY = haveValue ? pillar.getInt(pillarID) : world.getChunk(x >> 4, z >> 4).getHeight(Types.WORLD_SURFACE, x & 15, z); + if (!haveValue) { + pillar.putInt(pillarID, minY); + WorldDataUtil.saveFile(); + } + } + else { + minY = world.getChunk(x >> 4, z >> 4).getHeight(Types.WORLD_SURFACE, x & 15, z); + } + + int maxY = minY + spike.getHeight() - 64; + + if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { + radius--; + StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); + StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); + BlockPos side = base.getSize(); + BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); + minY = pos1.getY() + side.getY(); + side = top.getSize(); + BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1)); + maxY = pos2.getY(); + + StructurePlaceSettings data = new StructurePlaceSettings(); + base.placeInWorldChunk(world, pos1, data, random); + top.placeInWorldChunk(world, pos2, data, random); + + int r2 = radius * radius + 1; + MutableBlockPos mut = new MutableBlockPos(); + for (int px = -radius; px <= radius; px++) { + mut.setX(x + px); + int x2 = px * px; + for (int pz = -radius; pz <= radius; pz++) { + mut.setZ(z + pz); + int z2 = pz * pz; + if (x2 + z2 <= r2) { + for (int py = minY; py < maxY; py++) { + mut.setY(py); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN); + } + else { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + } + } + } + } + } + } + } + else { + minY -= 15; + int r2 = radius * radius + 1; + MutableBlockPos mut = new MutableBlockPos(); + for (int px = -radius; px <= radius; px++) { + mut.setX(x + px); + int x2 = px * px; + for (int pz = -radius; pz <= radius; pz++) { + mut.setZ(z + pz); + int z2 = pz * pz; + if (x2 + z2 <= r2) { + for (int py = minY; py < maxY; py++) { + mut.setY(py); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + } + } + } + } + } + mut.setX(x); + mut.setZ(z); + mut.setY(maxY); + BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); + + EndCrystal crystal = EntityType.END_CRYSTAL.create(world.getLevel()); + crystal.setBeamTarget(config.getCrystalBeamTarget()); + crystal.setInvulnerable(config.isCrystalInvulnerable()); + crystal.moveTo(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); + world.addFreshEntity(crystal); + + if (spike.isGuarded()) { + for (int px = -2; px <= 2; ++px) { + boolean bl = Mth.abs(px) == 2; + for (int pz = -2; pz <= 2; ++pz) { + boolean bl2 = Mth.abs(pz) == 2; + for (int py = 0; py <= 3; ++py) { + boolean bl3 = py == 3; + if (bl || bl2 || bl3) { + boolean bl4 = px == -2 || px == 2 || bl3; + boolean bl5 = pz == -2 || pz == 2 || bl3; + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.defaultBlockState().setValue(IronBarsBlock.NORTH, bl4 && pz != -2)).setValue(IronBarsBlock.SOUTH, bl4 && pz != 2)).setValue(IronBarsBlock.WEST, bl5 && px != -2)).setValue(IronBarsBlock.EAST, bl5 && px != 2); + BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + } + } + } + } + } + } + + info.cancel(); + } + + private boolean be_radiusInRange(int radius) { + return radius > 1 && radius < 6; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java deleted file mode 100644 index b5fbf4ed..00000000 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.resource.ResourceManager; -import net.minecraft.tag.Tag; -import net.minecraft.tag.TagGroupLoader; -import net.minecraft.util.Identifier; -import ru.betterend.util.TagHelper; - -@Mixin(TagGroupLoader.class) -public class TagGroupLoaderMixin { - - @Shadow - private String entryType; - - @Inject(method = "prepareReload", at = @At("RETURN"), cancellable = true) - public void prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { - CompletableFuture> future = info.getReturnValue(); - info.setReturnValue(CompletableFuture.supplyAsync(() -> { - Map map = future.join(); - TagHelper.apply(entryType, map); - return map; - })); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java new file mode 100644 index 00000000..46b477ec --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -0,0 +1,27 @@ +package ru.betterend.mixin.common; + +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagLoader; +import ru.betterend.util.TagHelper; + +@Mixin(TagLoader.class) +public class TagLoaderMixin { + @Shadow + private String name; + + @ModifyArg(method = "prepare", at = @At(value = "INVOKE", + target = "Ljava/util/concurrent/CompletableFuture;supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;")) + public Supplier> be_modifyTags(Supplier> supplier, Executor executor) { + return () -> TagHelper.apply(name, supplier.get()); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java new file mode 100644 index 00000000..da2c05e6 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -0,0 +1,38 @@ +package ru.betterend.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.impl.biome.InternalBiomeData; +import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import ru.betterend.interfaces.IBiomeList; + +@Mixin(value = WeightedBiomePicker.class, remap = false) +public class WeightedBiomePickerMixin implements IBiomeList { + private final List> biomes = Lists.newArrayList(); + + @Inject(method = "addBiome", at = @At("TAIL")) + private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { + if (be_isCorrectPicker(WeightedBiomePicker.class.cast(this))) { + biomes.add(biome); + } + } + + @Override + public List> getBiomes() { + return biomes; + } + + private boolean be_isCorrectPicker(WeightedBiomePicker picker) { + return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); + } +} diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index 9a601f44..0106d7de 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -2,19 +2,19 @@ package ru.betterend.noise; import java.util.Random; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; import ru.betterend.util.MHelper; public class VoronoiNoise { private static final Random RANDOM = new Random(); final int seed; - final double scale; - final double separation; + + public VoronoiNoise() { + this(0); + } - public VoronoiNoise(int seed, double side, double separation) { + public VoronoiNoise(int seed) { this.seed = seed; - this.scale = 1.0 / side; - this.separation = MathHelper.clamp(separation, 0, 1); } private int getSeed(int x, int y, int z) { @@ -22,38 +22,119 @@ public class VoronoiNoise { h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - - public double sample(float x, float y, float z) { - return sample(MHelper.floor(x), MHelper.floor(y), MHelper.floor(z)); - } - public double sample(int x, int y, int z) { - double posX = x * scale; - double posY = y * scale; - double posZ = z * scale; - int posXI = MHelper.floor(posX); - int posYI = MHelper.floor(posY); - int posZI = MHelper.floor(posZ); - double distance = Double.MAX_VALUE; - for (int px = -1; px < 2; px++) { - double pointX = posXI + px; - for (int py = -1; py < 2; py++) { - double pointY = posYI + py; - for (int pz = -1; pz < 2; pz++) { - double pointZ = posZI + pz; - RANDOM.setSeed(getSeed(posXI + px, posYI + py, posZI + pz)); - - double posXN = pointX + RANDOM.nextDouble() * separation; - double posYN = pointY + RANDOM.nextDouble() * separation; - double posZN = pointZ + RANDOM.nextDouble() * separation; - - double dist2 = MHelper.lengthSqr(posXN - posX, posYN - posY, posZN - posZ); - if (dist2 < distance) { - distance = dist2; + public double sample(double x, double y, double z) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; } } } } - return distance; + + return Math.sqrt(d); + } + + public Random getRandom(double x, double y, double z) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + + int posX = 0; + int posY = 0; + int posZ = 0; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; + posX = pox; + posY = poy; + posZ = poz; + } + } + } + } + + posX += ix; + posY += iy; + posZ += iz; + + int seed = MHelper.getSeed(posY, posX, posZ); + RANDOM.setSeed(seed); + + return RANDOM; + } + + public BlockPos[] getPos(double x, double y, double z, double scale) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + float selX = 0; + float selY = 0; + float selZ = 0; + float selXPre = 0; + float selYPre = 0; + float selZPre = 0; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; + selXPre = selX; + selYPre = selY; + selZPre = selZ; + selX = pointX; + selY = pointY; + selZ = pointZ; + } + } + } + } + + BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, (iz + (double) selZ) * scale); + BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, (iz + (double) selZPre) * scale); + return new BlockPos[] {p1, p2}; } } diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java new file mode 100644 index 00000000..fc1f68d8 --- /dev/null +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -0,0 +1,81 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class FireflyParticle extends SimpleAnimatedParticle { + private double preVX; + private double preVY; + private double preVZ; + private double nextVX; + private double nextVY; + private double nextVZ; + + protected FireflyParticle(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); + this.setAlpha(0); + + preVX = random.nextGaussian() * 0.02; + preVY = random.nextGaussian() * 0.02; + preVZ = random.nextGaussian() * 0.02; + + nextVX = random.nextGaussian() * 0.02; + nextVY = random.nextGaussian() * 0.02; + nextVZ = random.nextGaussian() * 0.02; + } + + @Override + public void tick() { + int ticks = this.age & 31; + if (ticks == 0) { + preVX = nextVX; + preVY = nextVY; + preVZ = nextVZ; + nextVX = random.nextGaussian() * 0.02; + nextVY = random.nextGaussian() * 0.02; + nextVZ = random.nextGaussian() * 0.02; + } + double delta = (double) ticks / 31.0; + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + + if (this.age <= 60) { + this.setAlpha(this.age / 60F); + } + else if (this.age > lifetime - 60) { + this.setAlpha((lifetime - this.age) / 60F); + } + + super.tick(); + } + + @Environment(EnvType.CLIENT) + public static class FireflyParticleFactory implements ParticleProvider { + private final SpriteSet sprites; + + public FireflyParticleFactory(SpriteSet sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { + return new FireflyParticle(world, x, y, z, sprites, 1, 1, 1); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java index 6abe69f1..1481b70b 100644 --- a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java +++ b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java @@ -2,13 +2,13 @@ package ru.betterend.particle; import java.util.Locale; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.FriendlyByteBuf; import ru.betterend.registry.EndParticles; -public class GlowingSphereParticleEffect implements ParticleEffect { +public class GlowingSphereParticleEffect implements ParticleOptions { private final float red; private final float green; private final float blue; @@ -25,15 +25,15 @@ public class GlowingSphereParticleEffect implements ParticleEffect { } @Override - public void write(PacketByteBuf buf) { + public void writeToNetwork(FriendlyByteBuf buf) { buf.writeFloat(this.red); buf.writeFloat(this.green); buf.writeFloat(this.blue); } @Override - public String asString() { - return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(this.getType()), this.red, this.green, this.blue); + public String writeToString() { + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getKey(this.getType()), this.red, this.green, this.blue); } public float getRed() { diff --git a/src/main/java/ru/betterend/particle/InfusionParticle.java b/src/main/java/ru/betterend/particle/InfusionParticle.java index 3df16b65..8bdac965 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticle.java +++ b/src/main/java/ru/betterend/particle/InfusionParticle.java @@ -2,60 +2,60 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; -public class InfusionParticle extends SpriteBillboardParticle { +public class InfusionParticle extends TextureSheetParticle { - private final SpriteProvider spriteProvider; + private final SpriteSet spriteProvider; - public InfusionParticle(ClientWorld clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteProvider spriteProvider) { + public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteSet spriteProvider) { super(clientWorld, x, y, z, 0.0, 0.0, 0.0); - this.setSpriteForAge(spriteProvider); + this.setSpriteFromAge(spriteProvider); this.spriteProvider = spriteProvider; this.setColor(palette[0], palette[1], palette[2]); - this.setColorAlpha(palette[3]); - this.velocityX = velocityX * 0.1D; - this.velocityY = velocityY * 0.1D; - this.velocityZ = velocityZ * 0.1D; - this.maxAge = (int) (3.0F / (this.random.nextFloat() * 0.9F + 0.1F)); - this.scale *= 0.9F; + this.setAlpha(palette[3]); + this.xd = velocityX * 0.1D; + this.yd = velocityY * 0.1D; + this.zd = velocityZ * 0.1D; + this.lifetime = (int) (3.0F / (this.random.nextFloat() * 0.9F + 0.1F)); + this.quadSize *= 0.9F; } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Override public void tick() { - this.prevPosX = this.x; - this.prevPosY = this.y; - this.prevPosZ = this.z; - if (this.age++ >= this.maxAge) { - this.markDead(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); } else { - this.setSpriteForAge(spriteProvider); - double velocityX = 2.0D * this.velocityX * this.random.nextDouble(); - double velocityY = 3.0D * this.velocityY * this.random.nextDouble(); - double velocityZ = 2.0D * this.velocityZ * this.random.nextDouble(); + this.setSpriteFromAge(spriteProvider); + double velocityX = 2.0D * this.xd * this.random.nextDouble(); + double velocityY = 3.0D * this.yd * this.random.nextDouble(); + double velocityZ = 2.0D * this.zd * this.random.nextDouble(); this.move(velocityX, velocityY, velocityZ); } } @Environment(EnvType.CLIENT) - public static class InfusionFactory implements ParticleFactory { - private final SpriteProvider spriteProvider; + public static class InfusionFactory implements ParticleProvider { + private final SpriteSet spriteProvider; - public InfusionFactory(SpriteProvider spriteProvider) { + public InfusionFactory(SpriteSet spriteProvider) { this.spriteProvider = spriteProvider; } - public Particle createParticle(InfusionParticleType particleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { return new InfusionParticle(clientWorld, d, e, f, g, h, i, particleType.getPalette(), this.spriteProvider); } } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 498dfde8..9ab3f67b 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -6,32 +6,32 @@ import com.mojang.serialization.Codec; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.command.argument.ItemStackArgument; -import net.minecraft.command.argument.ItemStringReader; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.commands.arguments.item.ItemInput; +import net.minecraft.commands.arguments.item.ItemParser; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; import ru.betterend.registry.EndParticles; import ru.betterend.util.ColorUtil; -public class InfusionParticleType extends ParticleType implements ParticleEffect { +public class InfusionParticleType extends ParticleType implements ParticleOptions { public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> { return new InfusionParticleType(EndParticles.INFUSION, itemStack); }, infusionParticleType -> { return infusionParticleType.itemStack; }); - public static final ParticleEffect.Factory PARAMETERS_FACTORY = new ParticleEffect.Factory() { - public InfusionParticleType read(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { + public static final ParticleOptions.Deserializer PARAMETERS_FACTORY = new ParticleOptions.Deserializer() { + public InfusionParticleType fromCommand(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { stringReader.expect(' '); - ItemStringReader itemStringReader = new ItemStringReader(stringReader, false).consume(); - ItemStack itemStack = new ItemStackArgument(itemStringReader.getItem(), itemStringReader.getTag()).createStack(1, false); + ItemParser itemStringReader = new ItemParser(stringReader, false).parse(); + ItemStack itemStack = new ItemInput(itemStringReader.getItem(), itemStringReader.getNbt()).createItemStack(1, false); return new InfusionParticleType(particleType, itemStack); } - public InfusionParticleType read(ParticleType particleType, PacketByteBuf packetByteBuf) { - return new InfusionParticleType(particleType, packetByteBuf.readItemStack()); + public InfusionParticleType fromNetwork(ParticleType particleType, FriendlyByteBuf packetByteBuf) { + return new InfusionParticleType(particleType, packetByteBuf.readItem()); } }; @@ -60,17 +60,17 @@ public class InfusionParticleType extends ParticleType imp } @Override - public void write(PacketByteBuf buffer) { - buffer.writeItemStack(itemStack); + public void writeToNetwork(FriendlyByteBuf buffer) { + buffer.writeItem(itemStack); } @Override - public String asString() { - return Registry.PARTICLE_TYPE.getId(this).toString(); + public String writeToString() { + return Registry.PARTICLE_TYPE.getKey(this).toString(); } @Override - public Codec getCodec() { + public Codec codec() { return CODEC; } } diff --git a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java index be4164ed..b1216424 100644 --- a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java @@ -2,18 +2,18 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleBlackSpore extends AnimatedParticle { +public class ParticleBlackSpore extends SimpleAnimatedParticle { private double preVX; private double preVY; private double preVZ; @@ -21,14 +21,14 @@ public class ParticleBlackSpore extends AnimatedParticle { private double nextVY; private double nextVZ; - protected ParticleBlackSpore(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + protected ParticleBlackSpore(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); + setSprite(sprites.get(random)); - this.maxAge = MHelper.randRange(30, 60, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + this.lifetime = MHelper.randRange(30, 60, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); - this.setColorAlpha(0); + this.setAlpha(0); preVX = random.nextGaussian() * 0.015; preVY = 0; @@ -53,39 +53,39 @@ public class ParticleBlackSpore extends AnimatedParticle { double delta = (double) ticks / 15.0; if (this.age <= 15) { - this.setColorAlpha(this.age / 15F); + this.setAlpha(this.age / 15F); } - else if (this.age >= this.maxAge - 15) { - this.setColorAlpha((this.maxAge - this.age) / 15F); + else if (this.age >= this.lifetime - 15) { + this.setAlpha((this.lifetime - this.age) / 15F); } - if (this.age >= this.maxAge) { - this.markDead(); + if (this.age >= this.lifetime) { + this.remove(); } - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryBlackSpore implements ParticleFactory { + public static class FactoryBlackSpore implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryBlackSpore(SpriteProvider sprites) { + public FactoryBlackSpore(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleBlackSpore(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGeyser.java b/src/main/java/ru/betterend/particle/ParticleGeyser.java index 47df964c..f51913dd 100644 --- a/src/main/java/ru/betterend/particle/ParticleGeyser.java +++ b/src/main/java/ru/betterend/particle/ParticleGeyser.java @@ -2,77 +2,77 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.particles.SimpleParticleType; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleGeyser extends SpriteBillboardParticle { - private Mutable mut = new Mutable(); +public class ParticleGeyser extends TextureSheetParticle { + private MutableBlockPos mut = new MutableBlockPos(); private boolean changeDir = false; private boolean check = true; - protected ParticleGeyser(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, SpriteProvider sprites) { + protected ParticleGeyser(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, SpriteSet sprites) { super(world, x, y, z, vx, vy, vz); - setSprite(sprites); - this.maxAge = MHelper.randRange(400, 800, random); - this.scale = MHelper.randRange(0.5F, 1.0F, random); - this.velocityX = vx; - this.velocityZ = vz; - this.prevPosY = y - 0.125; + pickSprite(sprites); + this.lifetime = MHelper.randRange(400, 800, random); + this.quadSize = MHelper.randRange(0.5F, 1.0F, random); + this.xd = vx; + this.zd = vz; + this.yo = y - 0.125; } @Override public void tick() { - if (this.prevPosY == this.y || this.age > this.maxAge) { - this.markDead(); + if (this.yo == this.y || this.age > this.lifetime) { + this.remove(); } else { - if (this.age >= this.maxAge - 200) { - this.setColorAlpha((this.maxAge - this.age) / 200F); + if (this.age >= this.lifetime - 200) { + this.setAlpha((this.lifetime - this.age) / 200F); } - this.scale += 0.005F; - this.velocityY = 0.125; + this.quadSize += 0.005F; + this.yd = 0.125; if (changeDir) { changeDir = false; check = false; - this.velocityX += MHelper.randRange(-0.2, 0.2, random); - this.velocityZ += MHelper.randRange(-0.2, 0.2, random); + this.xd += MHelper.randRange(-0.2, 0.2, random); + this.zd += MHelper.randRange(-0.2, 0.2, random); } else if (check) { - changeDir = world.getBlockState(mut.set(x, y, z)).getFluidState().isEmpty(); - this.velocityX = 0; - this.velocityZ = 0; + changeDir = level.getBlockState(mut.set(x, y, z)).getFluidState().isEmpty(); + this.xd = 0; + this.zd = 0; } } super.tick(); } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryGeyser implements ParticleFactory { + public static class FactoryGeyser implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryGeyser(SpriteProvider sprites) { + public FactoryGeyser(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGeyser(world, x, y, z, 0, 0.125, 0, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java index f7ac89bb..09f5bd02 100644 --- a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java +++ b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java @@ -2,17 +2,17 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleGlowingSphere extends AnimatedParticle { +public class ParticleGlowingSphere extends SimpleAnimatedParticle { private int ticks; private double preVX; private double preVY; @@ -21,13 +21,13 @@ public class ParticleGlowingSphere extends AnimatedParticle { private double nextVY; private double nextVZ; - protected ParticleGlowingSphere(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { + protected ParticleGlowingSphere(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setTargetColor(15916745); - this.setSpriteForAge(spriteProvider); + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; @@ -52,24 +52,24 @@ public class ParticleGlowingSphere extends AnimatedParticle { } double delta = (double) ticks / 30.0; - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryGlowingSphere implements ParticleFactory { + public static class FactoryGlowingSphere implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryGlowingSphere(SpriteProvider sprites) { + public FactoryGlowingSphere(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGlowingSphere(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java new file mode 100644 index 00000000..496bc106 --- /dev/null +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -0,0 +1,70 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class ParticleJungleSpore extends SimpleAnimatedParticle { + + protected ParticleJungleSpore(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); + this.setAlpha(0); + } + + @Override + public void tick() { + super.tick(); + + int ticks = this.age % 30; + if (ticks == 0) { + this.xd = random.nextGaussian() * 0.02; + this.yd = random.nextFloat() * 0.02 + 0.02; + this.zd = random.nextGaussian() * 0.02; + ticks = 0; + } + + if (this.age <= 30) { + float delta = ticks / 30F; + this.setAlpha(delta); + } + else if (this.age >= this.lifetime) { + this.setAlpha(0); + } + else if (this.age >= this.lifetime - 30) { + this.setAlpha((this.lifetime - this.age) / 30F); + } + else { + this.setAlpha(1); + } + + this.yd -= 0.001F; + this.xd *= 0.99F; + this.zd *= 0.99F; + } + + @Environment(EnvType.CLIENT) + public static class FactoryJungleSpore implements ParticleProvider { + private final SpriteSet sprites; + + public FactoryJungleSpore(SpriteSet sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { + return new ParticleJungleSpore(world, x, y, z, sprites, 1, 1, 1); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/particle/ParticleSnowflake.java b/src/main/java/ru/betterend/particle/ParticleSnowflake.java index 1cfccec9..f7e389e4 100644 --- a/src/main/java/ru/betterend/particle/ParticleSnowflake.java +++ b/src/main/java/ru/betterend/particle/ParticleSnowflake.java @@ -2,18 +2,18 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleSnowflake extends SpriteBillboardParticle { +public class ParticleSnowflake extends TextureSheetParticle { private int ticks; private double preVX; private double preVY; @@ -22,13 +22,13 @@ public class ParticleSnowflake extends SpriteBillboardParticle { private double nextVY; private double nextVZ; - protected ParticleSnowflake(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + protected ParticleSnowflake(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); + pickSprite(sprites); - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.2F, random); - this.setColorAlpha(0F); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.2F, random); + this.setAlpha(0F); preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; @@ -57,39 +57,39 @@ public class ParticleSnowflake extends SpriteBillboardParticle { double delta = (double) ticks / 200.0; if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); + this.setAlpha(this.age / 40F); } - else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - if (this.age >= this.maxAge) { - this.markDead(); + if (this.age >= this.lifetime) { + this.remove(); } - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySnowflake implements ParticleFactory { + public static class FactorySnowflake implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactorySnowflake(SpriteProvider sprites) { + public FactorySnowflake(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSnowflake(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleSulphur.java b/src/main/java/ru/betterend/particle/ParticleSulphur.java index 3f0cf51d..288bc830 100644 --- a/src/main/java/ru/betterend/particle/ParticleSulphur.java +++ b/src/main/java/ru/betterend/particle/ParticleSulphur.java @@ -2,18 +2,18 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleSulphur extends SpriteBillboardParticle { +public class ParticleSulphur extends TextureSheetParticle { private int ticks; private double preVX; private double preVY; @@ -22,14 +22,14 @@ public class ParticleSulphur extends SpriteBillboardParticle { private double nextVY; private double nextVZ; - protected ParticleSulphur(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + protected ParticleSulphur(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); + pickSprite(sprites); - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); - this.setColorAlpha(0); + this.setAlpha(0); preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; @@ -58,39 +58,39 @@ public class ParticleSulphur extends SpriteBillboardParticle { double delta = (double) ticks / 200.0; if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); + this.setAlpha(this.age / 40F); } - else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - if (this.age >= this.maxAge) { - this.markDead(); + if (this.age >= this.lifetime) { + this.remove(); } - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySulphur implements ParticleFactory { + public static class FactorySulphur implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactorySulphur(SpriteProvider sprites) { + public FactorySulphur(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSulphur(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java index 27e9a496..abf2c9d7 100644 --- a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java +++ b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java @@ -2,23 +2,23 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleTenaneaPetal extends SpriteBillboardParticle { - private static BlockColorProvider provider; +public class ParticleTenaneaPetal extends TextureSheetParticle { + private static BlockColor provider; private double preVX; private double preVY; @@ -27,22 +27,22 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { private double nextVY; private double nextVZ; - protected ParticleTenaneaPetal(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + protected ParticleTenaneaPetal(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); + pickSprite(sprites); if (provider == null) { IColorProvider block = (IColorProvider) EndBlocks.TENANEA_FLOWERS; provider = block.getProvider(); } int color = provider.getColor(null, null, new BlockPos(x, y, z), 0); - this.colorRed = ((color >> 16) & 255) / 255F; - this.colorGreen = ((color >> 8) & 255) / 255F; - this.colorBlue = ((color) & 255) / 255F; + this.rCol = ((color >> 16) & 255) / 255F; + this.gCol = ((color >> 8) & 255) / 255F; + this.bCol = ((color) & 255) / 255F; - this.maxAge = MHelper.randRange(120, 200, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setColorAlpha(0); + this.lifetime = MHelper.randRange(120, 200, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setAlpha(0); preVX = 0; preVY = 0; @@ -54,7 +54,7 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { } @Override - public int getColorMultiplier(float tint) { + public int getLightColor(float tint) { return 15728880; } @@ -72,39 +72,39 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { double delta = (double) ticks / 63.0; if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); + this.setAlpha(this.age / 40F); } - else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - if (this.age >= this.maxAge) { - this.markDead(); + if (this.age >= this.lifetime) { + this.remove(); } - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryTenaneaPetal implements ParticleFactory { + public static class FactoryTenaneaPetal implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryTenaneaPetal(SpriteProvider sprites) { + public FactoryTenaneaPetal(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleTenaneaPetal(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java index 7268fcf5..4df6155e 100644 --- a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java +++ b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java @@ -2,16 +2,16 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; -public class PaticlePortalSphere extends AnimatedParticle { +public class PaticlePortalSphere extends SimpleAnimatedParticle { private int ticks; private double preVX; private double preVY; @@ -20,14 +20,14 @@ public class PaticlePortalSphere extends AnimatedParticle { private double nextVY; private double nextVZ; - public PaticlePortalSphere(ClientWorld world, double x, double y, double z, SpriteProvider spriteProvider) { + public PaticlePortalSphere(ClientLevel world, double x, double y, double z, SpriteSet spriteProvider) { super(world, x, y, z, spriteProvider, 0); - setSprite(spriteProvider.getSprite(random)); - this.maxAge = MHelper.randRange(20, 80, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + setSprite(spriteProvider.get(random)); + this.lifetime = MHelper.randRange(20, 80, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(0xFEBBD5); - this.setTargetColor(0xBBFEE4); - this.setSpriteForAge(spriteProvider); + this.setFadeColor(0xBBFEE4); + this.setSpriteFromAge(spriteProvider); preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; @@ -52,24 +52,24 @@ public class PaticlePortalSphere extends AnimatedParticle { } double delta = (double) ticks / 30.0; - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryPortalSphere implements ParticleFactory { + public static class FactoryPortalSphere implements ParticleProvider { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryPortalSphere(SpriteProvider sprites) { + public FactoryPortalSphere(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new PaticlePortalSphere(world, x, y, z, sprites); } } diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java new file mode 100644 index 00000000..ceab0088 --- /dev/null +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -0,0 +1,92 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class SmaragdantParticle extends SimpleAnimatedParticle { + private double preVX; + private double preVY; + private double preVZ; + private double nextVX; + private double nextVY; + private double nextVZ; + + protected SmaragdantParticle(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.get(random)); + + this.lifetime = MHelper.randRange(60, 120, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setColor(1, 1, 1); + this.setAlpha(0); + + preVX = random.nextGaussian() * 0.01; + preVY = random.nextGaussian() * 0.01; + preVZ = random.nextGaussian() * 0.01; + + nextVX = random.nextGaussian() * 0.01; + nextVY = random.nextGaussian() * 0.01; + nextVZ = random.nextGaussian() * 0.01; + } + + @Override + public void tick() { + int ticks = this.age & 31; + if (ticks == 0) { + preVX = nextVX; + preVY = nextVY; + preVZ = nextVZ; + nextVX = random.nextGaussian() * 0.015; + nextVY = random.nextFloat() * 0.02 + 0.01; + nextVZ = random.nextGaussian() * 0.015; + } + double delta = (double) ticks / 31.0; + + if (this.age <= 31) { + this.setAlpha(this.age / 31F); + } + else if (this.age >= this.lifetime - 31) { + this.setAlpha((this.lifetime - this.age) / 31F); + } + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + + super.tick(); + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + @Environment(EnvType.CLIENT) + public static class SmaragdantParticleFactory implements ParticleProvider { + + private final SpriteSet sprites; + + public SmaragdantParticleFactory(SpriteSet sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { + return new SmaragdantParticle(world, x, y, z, 1, 1, 1, sprites); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/patterns/BlockPatterned.java b/src/main/java/ru/betterend/patterns/BlockPatterned.java index 182b695b..f1ca3f48 100644 --- a/src/main/java/ru/betterend/patterns/BlockPatterned.java +++ b/src/main/java/ru/betterend/patterns/BlockPatterned.java @@ -1,14 +1,14 @@ -package ru.betterend.patterns; - -import java.io.Reader; - -import net.minecraft.util.Identifier; - -public interface BlockPatterned extends Patterned { - default String getStatesPattern(Reader data) { - return null; - } - default Identifier statePatternId() { - return null; - } -} +package ru.betterend.patterns; + +import java.io.Reader; + +import net.minecraft.resources.ResourceLocation; + +public interface BlockPatterned extends Patterned { + default String getStatesPattern(Reader data) { + return null; + } + default ResourceLocation statePatternId() { + return null; + } +} diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 0da7c155..f3f452e0 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -1,135 +1,162 @@ -package ru.betterend.patterns; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; - -import com.google.common.collect.Maps; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; - -public class Patterns { - - //Blockstates - public final static Identifier STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); - public final static Identifier STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); - public final static Identifier STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); - public final static Identifier STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); - public final static Identifier STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); - public final static Identifier STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); - public final static Identifier STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); - public final static Identifier STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); - public final static Identifier STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); - public final static Identifier STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); - public final static Identifier STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); - public final static Identifier STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); - public final static Identifier STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); - public final static Identifier STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); - public final static Identifier STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); - public final static Identifier STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); - public final static Identifier STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); - public final static Identifier STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); - public final static Identifier STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); - - //Models Block - public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); - public final static Identifier BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); - public final static Identifier BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); - public final static Identifier BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); - public final static Identifier BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); - public final static Identifier BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); - public final static Identifier BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); - public final static Identifier BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); - public final static Identifier BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); - public final static Identifier BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); - public final static Identifier BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); - public final static Identifier BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); - public final static Identifier BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); - public final static Identifier BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); - public final static Identifier BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); - public final static Identifier BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); - public final static Identifier BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); - public final static Identifier BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); - public final static Identifier BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); - public final static Identifier BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); - public final static Identifier BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); - public final static Identifier BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); - public final static Identifier BLOCK_SAPLING = BetterEnd.makeID("patterns/block/sapling.json"); - public final static Identifier BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); - public final static Identifier BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); - public final static Identifier BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); - public final static Identifier BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); - public final static Identifier BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); - public final static Identifier BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); - public final static Identifier BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); - public final static Identifier BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); - public final static Identifier BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); - public final static Identifier BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); - public final static Identifier BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); - public final static Identifier BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); - public final static Identifier BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); - public final static Identifier BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); - public final static Identifier BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); - public final static Identifier BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_COLORED_FLOOR = BetterEnd.makeID("models/block/bulb_lantern_colored_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_COLORED_CEIL = BetterEnd.makeID("models/block/bulb_lantern_colored_ceil.json"); - public final static Identifier BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); - public final static Identifier BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); - - //Models Item - public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); - public final static Identifier ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); - public final static Identifier ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); - public final static Identifier ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); - public final static Identifier ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); - public final static Identifier ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); - public final static Identifier ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); - public final static Identifier ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); - - public static String createJson(Reader data, String parent, String block) { - try (BufferedReader buffer = new BufferedReader(data)) { - return buffer.lines().collect(Collectors.joining()) - .replace("%parent%", parent) - .replace("%block%", block); - } catch (Exception ex) { - return null; - } - } - - public static String createJson(Identifier patternId, String parent, String block) { - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); - try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); - } catch (Exception ex) { - return null; - } - } - - public static String createJson(Identifier patternId, String texture) { - Map textures = Maps.newHashMap(); - textures.put("%texture%", texture); - return createJson(patternId, textures); - } - - public static String createJson(Identifier patternId, Map textures) { - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); - try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining()); - for (Entry texture : textures.entrySet()) { - json = json.replace(texture.getKey(), texture.getValue()); - } - return json; - } catch (Exception ex) { - return null; - } - } -} +package ru.betterend.patterns; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import com.google.common.collect.Maps; + +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import ru.betterend.BetterEnd; + +public class Patterns { + + //Blockstates + public final static ResourceLocation STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); + public final static ResourceLocation STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); + public final static ResourceLocation STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); + public final static ResourceLocation STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); + public final static ResourceLocation STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); + public final static ResourceLocation STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); + public final static ResourceLocation STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); + public final static ResourceLocation STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); + public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); + public final static ResourceLocation STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); + public final static ResourceLocation STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); + public final static ResourceLocation STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); + public final static ResourceLocation STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); + public final static ResourceLocation STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); + public final static ResourceLocation STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); + public final static ResourceLocation STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); + public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); + public final static ResourceLocation STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); + public final static ResourceLocation STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); + public final static ResourceLocation STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); + public final static ResourceLocation STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); + public final static ResourceLocation STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); + public final static ResourceLocation STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); + public final static ResourceLocation STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); + public final static ResourceLocation STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); + public final static ResourceLocation STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); + public final static ResourceLocation STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); + public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); + public final static ResourceLocation STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); + + //Models Block + public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); + public final static ResourceLocation BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); + public final static ResourceLocation BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); + public final static ResourceLocation BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); + public final static ResourceLocation BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); + public final static ResourceLocation BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); + public final static ResourceLocation BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); + public final static ResourceLocation BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); + public final static ResourceLocation BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); + public final static ResourceLocation BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); + public final static ResourceLocation BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); + public final static ResourceLocation BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); + public final static ResourceLocation BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); + public final static ResourceLocation BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); + public final static ResourceLocation BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); + public final static ResourceLocation BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); + public final static ResourceLocation BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); + public final static ResourceLocation BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); + public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); + public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); + public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); + public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); + public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); + public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); + public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); + public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); + public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); + public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); + public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); + public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); + public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); + public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); + public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); + public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); + public final static ResourceLocation BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); + public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); + public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); + public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); + public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); + public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); + public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); + public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); + public final static ResourceLocation BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); + public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); + public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); + + //Models Item + public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); + public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); + public final static ResourceLocation ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); + public final static ResourceLocation ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); + public final static ResourceLocation ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); + public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); + public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); + public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); + + public static String createItemGenerated(String name) { + return createJson(ITEM_GENERATED, name); + } + + public static String createJson(Reader data, String parent, String block) { + try (BufferedReader buffer = new BufferedReader(data)) { + return buffer.lines().collect(Collectors.joining()) + .replace("%parent%", parent) + .replace("%block%", block); + } catch (Exception ex) { + return null; + } + } + + public static String createJson(ResourceLocation patternId, String parent, String block) { + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); + try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { + return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); + } catch (Exception ex) { + return null; + } + } + + public static String createJson(ResourceLocation patternId, String texture) { + Map textures = Maps.newHashMap(); + textures.put("%texture%", texture); + return createJson(patternId, textures); + } + + public static String createJson(ResourceLocation patternId, Map textures) { + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); + try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { + String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) + .lines().collect(Collectors.joining()); + for (Entry texture : textures.entrySet()) { + json = json.replace(texture.getKey(), texture.getValue()); + } + return json; + } catch (Exception ex) { + return null; + } + } +} diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index b3927ce4..9d6dfc88 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -1,8 +1,9 @@ package ru.betterend.recipe; -import net.minecraft.block.Blocks; -import net.minecraft.item.Items; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class AlloyingRecipes { @@ -21,19 +22,25 @@ public class AlloyingRecipes { .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) .setOutput(Items.NETHERITE_SCRAP, 3) .setExpiriense(6F) - .setSmeltTime(500) + .setSmeltTime(1000) .build(); AlloyingRecipe.Builder.create("terminite_ingot") .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndItems.TERMINITE_INGOT, 1) + .setOutput(EndBlocks.TERMINITE.ingot, 1) .setExpiriense(2.5F) .setSmeltTime(450) .build(); AlloyingRecipe.Builder.create("aeternium_ingot") - .setInput(EndItems.TERMINITE_INGOT, Items.NETHERITE_INGOT) + .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) .setOutput(EndItems.AETERNIUM_INGOT, 1) .setExpiriense(4.5F) - .setSmeltTime(600) + .setSmeltTime(850) + .build(); + AlloyingRecipe.Builder.create("terminite_ingot_thallasium") + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) .build(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java new file mode 100644 index 00000000..0e110e83 --- /dev/null +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -0,0 +1,67 @@ +package ru.betterend.recipe; + +import net.minecraft.world.item.Items; +import ru.betterend.item.material.EndToolMaterial; +import ru.betterend.recipe.builders.AnvilRecipe; +import ru.betterend.registry.EndItems; + +public class AnvilRecipes { + public static void register() { + AnvilRecipe.Builder.create("ender_pearl_to_dust") + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(4) + .setDamage(5) + .build(); + AnvilRecipe.Builder.create("ender_shard_to_dust") + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(0) + .setDamage(3) + .build(); + + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); + AnvilRecipe.Builder.create("aeternium_axe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_pickaxe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_shovel_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hoe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hammer_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_sword_blade") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + } +} diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 72e37c7d..288fd16e 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -1,35 +1,47 @@ package ru.betterend.recipe; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import ru.betterend.BetterEnd; -import ru.betterend.item.GuideBook; +import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; public class CraftingRecipes { public static void register() { - GridRecipe.make("ender_pearl_to_block", EndBlocks.ENDER_BLOCK) + if (BetterEnd.hasGuideBook()) { + GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) + .setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST) + .addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS) + .build(); + } + + GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK) .setShape("OO", "OO") .addMaterial('O', Items.ENDER_PEARL) .build(); - GridRecipe.make("ender_block_to_pearl", Items.ENDER_PEARL) + GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL) .addMaterial('#', EndBlocks.ENDER_BLOCK) .setOutputCount(4) .setList("#") .build(); GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER) - .setShape("###", "V V", "###") + .setShape("T#T", "V V", "T#T") .addMaterial('#', Blocks.END_STONE_BRICKS) - .addMaterial('V', Items.BUCKET) + .addMaterial('T', EndBlocks.THALLASIUM.ingot) + .addMaterial('V', EndTags.FURNACES) .build(); registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE); @@ -45,29 +57,7 @@ public class CraftingRecipes { .addMaterial('#', Blocks.OBSIDIAN) .build(); - String material = "terminite"; - GridRecipe.make(material + "_block", EndBlocks.TERMINITE_BLOCK) - .setShape("III", "III", "III") - .addMaterial('I', EndItems.TERMINITE_INGOT) - .build(); - GridRecipe.make(material + "_block_to_ingot", EndItems.TERMINITE_INGOT) - .addMaterial('#', EndBlocks.TERMINITE_BLOCK) - .setOutputCount(9) - .setList("#") - .build(); - - registerHelmet(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HELMET); - registerChestplate(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_CHESTPLATE); - registerLeggings(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_LEGGINGS); - registerBoots(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_BOOTS); - registerShovel(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_SHOVEL); - registerSword(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_SWORD); - registerPickaxe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_PICKAXE); - registerAxe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_AXE); - registerHoe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HOE); - registerHammer(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HAMMER); - - material = "aeternium"; + String material = "aeternium"; GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK) .setShape("III", "III", "III") .addMaterial('I', EndItems.AETERNIUM_INGOT) @@ -78,26 +68,10 @@ public class CraftingRecipes { .setList("#") .build(); - registerHelmet(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HELMET); - registerChestplate(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_CHESTPLATE); - registerLeggings(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_LEGGINGS); - registerBoots(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_BOOTS); - registerShovel(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_SHOVEL); - registerSword(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_SWORD); - registerPickaxe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_PICKAXE); - registerAxe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_AXE); - registerHoe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HOE); - registerHammer(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HAMMER); - - registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); - registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); - registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); - registerHammer("netherite", Items.NETHERITE_INGOT, EndItems.NETHERITE_HAMMER); - GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); - GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); + GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT).build(); GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED).setOutputCount(3).build(); @@ -117,8 +91,9 @@ public class CraftingRecipes { registerLantern("blackstone_lantern", EndBlocks.BLACKSTONE_LANTERN, Blocks.BLACKSTONE_SLAB); GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); - GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.AMBER_GEM).build(); - GridRecipe.make("bulb_lantern", EndBlocks.BULB_LANTERN).addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).setShape("C", "I", "#").addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM).build(); + GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.AMBER_BLOCK).build(); + GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); @@ -128,26 +103,18 @@ public class CraftingRecipes { GridRecipe.make("sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY) .setList("JWSB") .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES) .build(); GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) - .setList("JWSB").addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) .addMaterial('S', Items.SUGAR) .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) .build(); - if (BetterEnd.hasGuideBook()) { - GridRecipe.make("guide_book", GuideBook.GUIDE_BOOK) - .setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST) - .addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS) - .build(); - } - GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB").addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL).addMaterial('B', Items.BONE_MEAL).build(); GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##").addMaterial('#', EndBlocks.EMERALD_ICE).build(); @@ -166,6 +133,83 @@ public class CraftingRecipes { .addMaterial('S', EndItems.ETERNAL_CRYSTAL) .addMaterial('A', EndBlocks.AMBER_BLOCK) .build(); + + GridRecipe.make("hopper", Blocks.HOPPER) + .setShape("I I", "ICI", " I ") + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); + + GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) + .setShape("S", "C", "S") + .addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); + + GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); + GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); + + GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE) + .setList("L") + .addMaterial('L', Items.LEATHER) + .setOutputCount(3) + .build(); + GridRecipe.make("stripes_to_leather", Items.LEATHER) + .setList("SSS") + .addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); + GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) + .setList("SL") + .addMaterial('S', Items.STICK) + .addMaterial('L', EndItems.LEATHER_STRIPE) + .build(); + + GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); + + GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); + + GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + + GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); + + registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); + registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); + registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); + + GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); + GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); + GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); + + GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); + GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ").addMaterial('P', EndBlocks.CAVE_PUMPKIN).addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); + + GridRecipe.make("neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK).setShape("##", "##").addMaterial('#', EndBlocks.NEON_CACTUS).build(); + GridRecipe.make("neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB).setShape("###").setOutputCount(6).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); + GridRecipe.make("neon_cactus_block_stairs", EndBlocks.NEON_CACTUS_BLOCK_STAIRS).setShape("# ", "## ", "###").setOutputCount(4).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); + + GridRecipe.make("tag_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_cauldron", Blocks.CAULDRON).setShape("I I", "I I", "III").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_hopper", Blocks.HOPPER).setShape("I I", "ICI", " I ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('C', EndTags.ITEM_CHEST).build(); + GridRecipe.make("tag_piston", Blocks.PISTON).setShape("WWW", "CIC", "CDC").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('D', Items.REDSTONE).addMaterial('C', Items.COBBLESTONE).build(); + GridRecipe.make("tag_rail", Blocks.RAIL).setShape("I I", "ISI", "I I").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('S', Items.STICK).build(); + GridRecipe.make("tag_stonecutter", Blocks.STONECUTTER).setShape(" I ", "SSS").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('S', Items.STONE).build(); + + GridRecipe.make("tag_bucket", Items.BUCKET).setShape("I I", " I ").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_compass", Items.COMPASS).setShape(" I ", "IDI", " I ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('D', Items.REDSTONE).build(); + GridRecipe.make("tag_minecart", Items.MINECART).setShape("I I", "III").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_shield", Items.SHIELD).setShape("WIW", "WWW", " W ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('W', ItemTags.PLANKS).build(); } private static void registerLantern(String name, Block lantern, Block slab) { @@ -185,80 +229,12 @@ public class CraftingRecipes { .setOutputCount(2) .build(); } - - private static void registerHelmet(String name, Item material, Item result) { - GridRecipe.make(name + "_helmet", result) - .setShape("III", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerChestplate(String name, Item material, Item result) { - GridRecipe.make(name + "_chestplate", result) - .setShape("I I", "III", "III") - .addMaterial('I', material) - .build(); - } - - private static void registerLeggings(String name, Item material, Item result) { - GridRecipe.make(name + "_leggings", result) - .setShape("III", "I I", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerBoots(String name, Item material, Item result) { - GridRecipe.make(name + "_boots", result) - .setShape("I I", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerShovel(String name, Item material, Item result) { - GridRecipe.make(name + "_shovel", result) - .setShape("I", "#", "#") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerSword(String name, Item material, Item result) { - GridRecipe.make(name + "_sword", result) - .setShape(new String[] { "I", "I", "#" }) - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerPickaxe(String name, Item material, Item result) { - GridRecipe.make(name + "_pickaxe", result) - .setShape("III", " # ", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerAxe(String name, Item material, Item result) { - GridRecipe.make(name + "_axe", result) - .setShape("II", "#I", "# ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerHoe(String name, Item material, Item result) { - GridRecipe.make(name + "_hoe", result) - .setShape("II", "# ", "# ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - + private static void registerHammer(String name, Item material, Item result) { GridRecipe.make(name + "_hammer", result) - .setShape("I I", "I#I", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); + .setShape("I I", "I#I", " # ") + .addMaterial('I', material) + .addMaterial('#', Items.STICK) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/recipe/EndRecipeManager.java index 8a91076c..d6699142 100644 --- a/src/main/java/ru/betterend/recipe/EndRecipeManager.java +++ b/src/main/java/ru/betterend/recipe/EndRecipeManager.java @@ -5,18 +5,18 @@ import java.util.Map.Entry; import com.google.common.collect.Maps; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; import ru.betterend.BetterEnd; public class EndRecipeManager { - private static final Map, Map>> RECIPES = Maps.newHashMap(); + private static final Map, Map>> RECIPES = Maps.newHashMap(); public static void addRecipe(RecipeType type, Recipe recipe) { - Map> list = RECIPES.get(type); + Map> list = RECIPES.get(type); if (list == null) { list = Maps.newHashMap(); RECIPES.put(type, list); @@ -25,32 +25,32 @@ public class EndRecipeManager { } @SuppressWarnings("unchecked") - public static > T getRecipe(RecipeType type, Identifier id) { + public static > T getRecipe(RecipeType type, ResourceLocation id) { if (RECIPES.containsKey(type)) { return (T) RECIPES.get(type).get(id); } return null; } - public static Map, Map>> getMap(Map, Map>> recipes) { - Map, Map>> result = Maps.newHashMap(); + public static Map, Map>> getMap(Map, Map>> recipes) { + Map, Map>> result = Maps.newHashMap(); for (RecipeType type : recipes.keySet()) { - Map> typeList = Maps.newHashMap(); + Map> typeList = Maps.newHashMap(); typeList.putAll(recipes.get(type)); result.put(type, typeList); } for (RecipeType type : RECIPES.keySet()) { - Map> list = RECIPES.get(type); + Map> list = RECIPES.get(type); if (list != null) { - Map> typeList = result.get(type); + Map> typeList = result.get(type); if (typeList == null) { typeList = Maps.newHashMap(); result.put(type, typeList); } - for (Entry> entry : list.entrySet()) { - Identifier id = entry.getKey(); + for (Entry> entry : list.entrySet()) { + ResourceLocation id = entry.getKey(); if (!typeList.containsKey(id)) typeList.put(id, entry.getValue()); } @@ -65,7 +65,7 @@ public class EndRecipeManager { } public static > RecipeType registerType(String type) { - Identifier recipeTypeId = BetterEnd.makeID(type); + ResourceLocation recipeTypeId = BetterEnd.makeID(type); return Registry.register(Registry.RECIPE_TYPE, recipeTypeId, new RecipeType() { public String toString() { return type; diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 91bac180..50ecab0d 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -1,6 +1,7 @@ package ru.betterend.recipe; -import net.minecraft.block.Blocks; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -9,7 +10,11 @@ public class FurnaceRecipes { public static void register() { FurnaceRecipe.make("end_lily_leaf_dried", EndItems.END_LILY_LEAF, EndItems.END_LILY_LEAF_DRIED).build(); FurnaceRecipe.make("end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS).build(); - FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); - FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); + FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).buildFoodlike(); + FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).buildFoodlike(); + FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); + FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); + FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).buildFoodlike(); + FurnaceRecipe.make("bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED).buildFoodlike(); } } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index f365e231..64569b97 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -1,6 +1,12 @@ package ru.betterend.recipe; -import net.minecraft.item.Items; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -32,7 +38,7 @@ public class InfusionRecipes { .build(); InfusionRecipe.Builder.create("crystalite_helmet") - .setInput(EndItems.TERMINITE_HELMET) + .setInput(EndBlocks.TERMINITE.helmet) .setOutput(EndItems.CRYSTALITE_HELMET) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) @@ -40,7 +46,7 @@ public class InfusionRecipes { .setTime(150) .build(); InfusionRecipe.Builder.create("crystalite_chestplate") - .setInput(EndItems.TERMINITE_CHESTPLATE) + .setInput(EndBlocks.TERMINITE.chestplate) .setOutput(EndItems.CRYSTALITE_CHESTPLATE) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(1, EndItems.CRYSTAL_SHARDS) @@ -50,7 +56,7 @@ public class InfusionRecipes { .setTime(300) .build(); InfusionRecipe.Builder.create("crystalite_leggings") - .setInput(EndItems.TERMINITE_LEGGINGS) + .setInput(EndBlocks.TERMINITE.leggings) .setOutput(EndItems.CRYSTALITE_LEGGINGS) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) @@ -59,12 +65,527 @@ public class InfusionRecipes { .setTime(225) .build(); InfusionRecipe.Builder.create("crystalite_boots") - .setInput(EndItems.TERMINITE_BOOTS) + .setInput(EndBlocks.TERMINITE.boots) .setOutput(EndItems.CRYSTALITE_BOOTS) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) .addCatalyst(6, EndItems.CRYSTAL_SHARDS) .setTime(150) .build(); + + InfusionRecipe.Builder.create("enchanted_petal") + .setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); + + InfusionRecipe.Builder.create("protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD) + .addCatalyst(6, Items.BLAZE_ROD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("feather_falling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FEATHER) + .addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("blast_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN) + .addCatalyst(6, Blocks.OBSIDIAN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("projectile_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SCUTE) + .addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("respiration_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL) + .addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("aqua_affinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS) + .addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("thorns_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS) + .addCatalyst(4, Blocks.CACTUS) + .addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("depth_strider_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD) + .addCatalyst(4, EndBlocks.END_LILY_SEED) + .addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("frost_walker_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("soul_speed_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sharpness_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("smite_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("bane_of_arthropods_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT) + .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("knockback_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE) + .addCatalyst(4, Blocks.PISTON) + .addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_aspect_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.MAGMA_CREAM) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("looting_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sweeping_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("efficiency_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("silk_touch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("unbreaking_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND) + .addCatalyst(4, Items.DIAMOND) + .addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fortune_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.RABBIT_FOOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("power_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("punch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("flame_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("infinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("luck_of_sea_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("lure_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("loyalty_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("impaling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("riptide_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("channeling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("multishot_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("quick_charge_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ) + .addCatalyst(4, Items.GLOWSTONE_DUST) + .addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("piercing_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("mending_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE) + .addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + } + + private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { + ItemStack book = new ItemStack(Items.ENCHANTED_BOOK); + EnchantedBookItem.addEnchantment(book, new EnchantmentInstance(enchantment, level)); + return book; } } diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 369236f2..4f1117c2 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -1,22 +1,92 @@ -package ru.betterend.recipe; - -import net.minecraft.item.Items; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; -import ru.betterend.registry.EndItems; - -public class SmithingRecipes { - public static void register() { - AnvilSmithingRecipe.Builder.create("ender_pearl_to_dust") - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST, 1) - .setLevel(4) - .setDamage(5) - .build(); - AnvilSmithingRecipe.Builder.create("ender_shard_to_dust") - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST, 1) - .setLevel(2) - .setDamage(3) - .build(); - } -} +package ru.betterend.recipe; + +import net.minecraft.world.item.Items; +import ru.betterend.recipe.builders.SmithingTableRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class SmithingRecipes { + + public static void register() { + SmithingTableRecipe.create("aeternium_sword_handle") + .setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndBlocks.TERMINITE.ingot) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + + SmithingTableRecipe.create("aeternium_sword") + .setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE) + .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) + .build(); + SmithingTableRecipe.create("aeternium_pickaxe") + .setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_axe") + .setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_shovel") + .setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hoe") + .setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hammer") + .setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + + SmithingTableRecipe.create("netherite_hammer") + .setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER) + .setAddition(Items.NETHERITE_INGOT) + .build(); + + SmithingTableRecipe.create("aeternium_helmet") + .setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndBlocks.TERMINITE.helmet) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_chestplate") + .setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_leggings") + .setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_boots") + .setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndBlocks.TERMINITE.boots) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + + SmithingTableRecipe.create("thallasium_anvil_updrade") + .setResult(EndBlocks.TERMINITE.anvil) + .setBase(EndBlocks.THALLASIUM.anvil) + .setAddition(EndBlocks.TERMINITE.block) + .build(); + SmithingTableRecipe.create("terminite_anvil_updrade") + .setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvil) + .setAddition(EndBlocks.AETERNIUM_BLOCK) + .build(); + + SmithingTableRecipe.create("armored_elytra") + .setResult(EndItems.ARMORED_ELYTRA) + .setBase(Items.ELYTRA) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + } +} diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 4441c93f..465a3ec1 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -5,35 +5,37 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBlocks; +import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -public class AlloyingRecipe implements Recipe { +public class AlloyingRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "alloying"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); protected final RecipeType type; - protected final Identifier id; + protected final ResourceLocation id; protected final Ingredient primaryInput; protected final Ingredient secondaryInput; protected final ItemStack output; @@ -41,7 +43,7 @@ public class AlloyingRecipe implements Recipe { protected final float experience; protected final int smeltTime; - public AlloyingRecipe(Identifier id, String group, Ingredient primaryInput, Ingredient secondaryInput, ItemStack output, float experience, int smeltTime) { + public AlloyingRecipe(ResourceLocation id, String group, Ingredient primaryInput, Ingredient secondaryInput, ItemStack output, float experience, int smeltTime) { this.group = group; this.id = id; this.primaryInput = primaryInput; @@ -61,8 +63,8 @@ public class AlloyingRecipe implements Recipe { } @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); defaultedList.add(primaryInput); defaultedList.add(secondaryInput); @@ -70,28 +72,28 @@ public class AlloyingRecipe implements Recipe { } @Override - public boolean matches(Inventory inv, World world) { - return this.primaryInput.test(inv.getStack(0)) && this.secondaryInput.test(inv.getStack(1)) || - this.primaryInput.test(inv.getStack(1)) && this.secondaryInput.test(inv.getStack(0)); + public boolean matches(Container inv, Level world) { + return this.primaryInput.test(inv.getItem(0)) && this.secondaryInput.test(inv.getItem(1)) || + this.primaryInput.test(inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); } @Override - public ItemStack craft(Inventory inv) { + public ItemStack assemble(Container inv) { return this.output.copy(); } @Override - public boolean fits(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } @Override - public ItemStack getOutput() { + public ItemStack getResultItem() { return this.output; } @Override - public Identifier getId() { + public ResourceLocation getId() { return this.id; } @@ -112,14 +114,15 @@ public class AlloyingRecipe implements Recipe { } @Environment(EnvType.CLIENT) - public ItemStack getRecipeKindIcon() { + public ItemStack getToastSymbol() { return new ItemStack(EndBlocks.END_STONE_SMELTER); } public static class Builder { private final static Builder INSTANCE = new Builder(); + private static boolean exist; - public static Builder create(Identifier id) { + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.group = String.format("%s_%s", GROUP, id); INSTANCE.primaryInput = null; @@ -127,6 +130,7 @@ public class AlloyingRecipe implements Recipe { INSTANCE.output = null; INSTANCE.experience = 0.0F; INSTANCE.smeltTime = 350; + exist = Configs.RECIPE_CONFIG.getBoolean("alloying", id.getPath(), true); return INSTANCE; } @@ -135,7 +139,7 @@ public class AlloyingRecipe implements Recipe { return create(BetterEnd.makeID(id)); } - private Identifier id; + private ResourceLocation id; private Ingredient primaryInput; private Ingredient secondaryInput; private ItemStack output; @@ -151,33 +155,33 @@ public class AlloyingRecipe implements Recipe { return this; } - public Builder setPrimaryInput(ItemConvertible... inputs) { - for (ItemConvertible item : inputs) { + public Builder setPrimaryInput(ItemLike... inputs) { + for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); } - this.primaryInput = Ingredient.ofItems(inputs); + this.primaryInput = Ingredient.of(inputs); return this; } - public Builder setSecondaryInput(ItemConvertible... inputs) { - for (ItemConvertible item : inputs) { + public Builder setSecondaryInput(ItemLike... inputs) { + for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); } - this.secondaryInput = Ingredient.ofItems(inputs); + this.secondaryInput = Ingredient.of(inputs); return this; } public Builder setPrimaryInput(Tag input) { - this.primaryInput = Ingredient.fromTag(input); + this.primaryInput = Ingredient.of(input); return this; } public Builder setSecondaryInput(Tag input) { - this.secondaryInput = Ingredient.fromTag(input); + this.secondaryInput = Ingredient.of(input); return this; } - public Builder setInput(ItemConvertible primaryInput, ItemConvertible secondaryInput) { + public Builder setInput(ItemLike primaryInput, ItemLike secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; @@ -189,7 +193,7 @@ public class AlloyingRecipe implements Recipe { return this; } - public Builder setOutput(ItemConvertible output, int amount) { + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; @@ -206,54 +210,56 @@ public class AlloyingRecipe implements Recipe { } public void build() { - if (primaryInput == null) { - BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); - return; + if (exist) { + if (primaryInput == null) { + BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(secondaryInput == null) { + BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); + return; + } + if(output == null) { + BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Alloying recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } - if(secondaryInput == null) { - BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); - return; - } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); - return; - } - if (EndRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Alloying recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); - return; - } - EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } } public static class Serializer implements RecipeSerializer { @Override - public AlloyingRecipe read(Identifier id, JsonObject json) { - JsonArray ingredients = JsonHelper.getArray(json, "ingredients"); + public AlloyingRecipe fromJson(ResourceLocation id, JsonObject json) { + JsonArray ingredients = GsonHelper.getAsJsonArray(json, "ingredients"); Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0)); Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1)); - String resultStr = JsonHelper.getString(json, "result"); - String group = JsonHelper.getString(json, "group", ""); - Identifier resultId = new Identifier(resultStr); - ItemStack output = new ItemStack(Registry.ITEM.getOrEmpty(resultId).orElseThrow(() -> { - return new IllegalStateException("Item: " + resultStr + " does not exists!"); - })); - float experience = JsonHelper.getFloat(json, "experience", 0.0F); - int smeltTime = JsonHelper.getInt(json, "smelttime", 350); + String group = GsonHelper.getAsString(json, "group", ""); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); + ItemStack output = ItemUtil.fromJsonRecipe(result); + if (output == null) { + throw new IllegalStateException("Output item does not exists!"); + } + float experience = GsonHelper.getAsFloat(json, "experience", 0.0F); + int smeltTime = GsonHelper.getAsInt(json, "smelttime", 350); return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime); } @Override - public AlloyingRecipe read(Identifier id, PacketByteBuf packetBuffer) { - String group = packetBuffer.readString(32767); - Ingredient primary = Ingredient.fromPacket(packetBuffer); - Ingredient secondary = Ingredient.fromPacket(packetBuffer); - ItemStack output = packetBuffer.readItemStack(); + public AlloyingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { + String group = packetBuffer.readUtf(32767); + Ingredient primary = Ingredient.fromNetwork(packetBuffer); + Ingredient secondary = Ingredient.fromNetwork(packetBuffer); + ItemStack output = packetBuffer.readItem(); float experience = packetBuffer.readFloat(); int smeltTime = packetBuffer.readVarInt(); @@ -261,11 +267,11 @@ public class AlloyingRecipe implements Recipe { } @Override - public void write(PacketByteBuf packetBuffer, AlloyingRecipe recipe) { - packetBuffer.writeString(recipe.group); - recipe.primaryInput.write(packetBuffer); - recipe.secondaryInput.write(packetBuffer); - packetBuffer.writeItemStack(recipe.output); + public void toNetwork(FriendlyByteBuf packetBuffer, AlloyingRecipe recipe) { + packetBuffer.writeUtf(recipe.group); + recipe.primaryInput.toNetwork(packetBuffer); + recipe.secondaryInput.toNetwork(packetBuffer); + packetBuffer.writeItem(recipe.output); packetBuffer.writeFloat(recipe.experience); packetBuffer.writeVarInt(recipe.smeltTime); } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java new file mode 100644 index 00000000..5feda8ab --- /dev/null +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -0,0 +1,309 @@ +package ru.betterend.recipe.builders; + +import java.util.Objects; + +import com.google.gson.JsonObject; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; +import ru.betterend.recipe.EndRecipeManager; +import ru.betterend.registry.EndTags; +import ru.betterend.util.ItemUtil; +import ru.betterend.util.RecipeHelper; + +public class AnvilRecipe implements Recipe, BetterEndRecipe { + + public final static String GROUP = "smithing"; + public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); + public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + + private final ResourceLocation id; + private final Ingredient input; + private final ItemStack output; + private final int damage; + private final int toolLevel; + private final int anvilLevel; + private final int inputCount; + + public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { + this.id = identifier; + this.input = input; + this.output = output; + this.toolLevel = toolLevel; + this.anvilLevel = anvilLevel; + this.inputCount = inputCount; + this.damage = damage; + } + + @Override + public RecipeSerializer getSerializer() { + return SERIALIZER; + } + + @Override + public ItemStack getResultItem() { + return this.output; + } + + @Override + public boolean matches(Container craftingInventory, Level world) { + return this.matches(craftingInventory); + } + + @Override + public ItemStack assemble(Container craftingInventory) { + return this.output.copy(); + } + + public ItemStack craft(Container craftingInventory, Player player) { + if (!player.isCreative()) { + if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; + ItemStack hammer = craftingInventory.getItem(1); + hammer.hurtAndBreak(this.damage, player, entity -> + entity.broadcastBreakEvent((InteractionHand) null)); + } + return this.assemble(craftingInventory); + } + + public boolean checkHammerDurability(Container craftingInventory, Player player) { + if (player.isCreative()) return true; + ItemStack hammer = craftingInventory.getItem(1); + int damage = hammer.getDamageValue() + this.damage; + return damage < hammer.getMaxDamage(); + } + + public boolean matches(Container craftingInventory) { + ItemStack hammer = craftingInventory.getItem(1); + if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { + return false; + } + ItemStack material = craftingInventory.getItem(0); + int materialCount = material.getCount(); + int level = ((TieredItem) hammer.getItem()).getTier().getLevel(); + return this.input.test(craftingInventory.getItem(0)) && + materialCount >= this.inputCount && + level >= this.toolLevel; + } + + public int getDamage() { + return this.damage; + } + + public int getInputCount() { + return this.inputCount; + } + + public int getAnvilLevel() { + return this.anvilLevel; + } + + @Override + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); + defaultedList.add(Ingredient.of(EndTags.HAMMERS.getValues().stream().filter(hammer -> + ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); + defaultedList.add(input); + + return defaultedList; + } + + @Override + @Environment(EnvType.CLIENT) + public boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return TYPE; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AnvilRecipe that = (AnvilRecipe) o; + return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); + } + + @Override + public int hashCode() { + return Objects.hash(id, input, output, damage, toolLevel); + } + + @Override + public String toString() { + return "AnvilRecipe [" + id + "]"; + } + + public static class Builder { + private final static Builder INSTANCE = new Builder(); + + public static Builder create(String id) { + return create(BetterEnd.makeID(id)); + } + + public static Builder create(ResourceLocation id) { + INSTANCE.id = id; + INSTANCE.input = null; + INSTANCE.output = null; + INSTANCE.inputCount = 1; + INSTANCE.toolLevel = 1; + INSTANCE.anvilLevel = 1; + INSTANCE.damage = 1; + INSTANCE.alright = true; + + return INSTANCE; + } + + private ResourceLocation id; + private Ingredient input; + private ItemStack output; + private int inputCount = 1; + private int toolLevel = 1; + private int anvilLevel = 1; + private int damage = 1; + private boolean alright; + + private Builder() {} + + public Builder setInput(ItemLike... inputItems) { + this.alright &= RecipeHelper.exists(inputItems); + this.setInput(Ingredient.of(inputItems)); + return this; + } + + public Builder setInput(Tag inputTag) { + this.setInput(Ingredient.of(inputTag)); + return this; + } + + public Builder setInput(Ingredient ingredient) { + this.input = ingredient; + return this; + } + + public Builder setInputCount(int count) { + this.inputCount = count; + return this; + } + + public Builder setOutput(ItemLike output) { + return this.setOutput(output, 1); + } + + public Builder setOutput(ItemLike output, int amount) { + this.alright &= RecipeHelper.exists(output); + this.output = new ItemStack(output, amount); + return this; + } + + public Builder setToolLevel(int level) { + this.toolLevel = level; + return this; + } + + public Builder setAnvilLevel(int level) { + this.anvilLevel = level; + return this; + } + + public Builder setDamage(int damage) { + this.damage = damage; + return this; + } + + public void build() { + if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { + if (input == null) { + BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(output == null) { + BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Anvil recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); + } + } + } + + public static class Serializer implements RecipeSerializer { + @Override + public AnvilRecipe fromJson(ResourceLocation id, JsonObject json) { + Ingredient input = Ingredient.fromJson(json.get("input")); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); + ItemStack output = ItemUtil.fromJsonRecipe(result); + if (output == null) { + throw new IllegalStateException("Output item does not exists!"); + } + int inputCount = GsonHelper.getAsInt(json, "inputCount", 1); + int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); + int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); + int damage = GsonHelper.getAsInt(json, "damage", 1); + + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); + } + + @Override + public AnvilRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { + Ingredient input = Ingredient.fromNetwork(packetBuffer); + ItemStack output = packetBuffer.readItem(); + int inputCount = packetBuffer.readVarInt(); + int toolLevel = packetBuffer.readVarInt(); + int anvilLevel = packetBuffer.readVarInt(); + int damage = packetBuffer.readVarInt(); + + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); + } + + @Override + public void toNetwork(FriendlyByteBuf packetBuffer, AnvilRecipe recipe) { + recipe.input.toNetwork(packetBuffer); + packetBuffer.writeItem(recipe.output); + packetBuffer.writeVarInt(recipe.inputCount); + packetBuffer.writeVarInt(recipe.toolLevel); + packetBuffer.writeVarInt(recipe.anvilLevel); + packetBuffer.writeVarInt(recipe.damage); + } + } +} diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java deleted file mode 100644 index 6620d5bd..00000000 --- a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java +++ /dev/null @@ -1,241 +0,0 @@ -package ru.betterend.recipe.builders; - -import com.google.gson.JsonObject; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolItem; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; -import ru.betterend.BetterEnd; -import ru.betterend.recipe.EndRecipeManager; -import ru.betterend.registry.EndTags; -import ru.betterend.util.RecipeHelper; - -public class AnvilSmithingRecipe implements Recipe { - - public final static String GROUP = "smithing"; - public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); - public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); - - private final Identifier id; - private final Ingredient input; - private final ItemStack output; - private final int damage; - private final int level; - - public AnvilSmithingRecipe(Identifier identifier, Ingredient input, ItemStack output, int level, int damage) { - this.id = identifier; - this.input = input; - this.output = output; - this.level = level; - this.damage = damage; - } - - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } - - @Override - public ItemStack getOutput() { - return this.output; - } - - @Override - public boolean matches(Inventory craftingInventory, World world) { - return this.matches(craftingInventory); - } - - @Override - public ItemStack craft(Inventory craftingInventory) { - return this.output.copy(); - } - - public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { - if (!player.isCreative()) { - ItemStack hammer = craftingInventory.getStack(0); - int damage = hammer.getDamage() + this.damage; - if (damage >= hammer.getMaxDamage()) return ItemStack.EMPTY; - hammer.damage(this.damage, player, entity -> { - entity.sendEquipmentBreakStatus(null); - }); - } - return this.craft(craftingInventory); - } - - public boolean matches(Inventory craftingInventory) { - ItemStack hammer = craftingInventory.getStack(0); - if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { - return false; - } - int level = ((ToolItem) hammer.getItem()).getMaterial().getMiningLevel(); - return level >= this.level && this.input.test(craftingInventory.getStack(1)); - } - - public int getDamage() { - return this.damage; - } - - @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); - defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> { - return ((ToolItem) hammer).getMaterial().getMiningLevel() >= level; - }).map(ItemStack::new))); - defaultedList.add(input); - - return defaultedList; - } - - @Override - @Environment(EnvType.CLIENT) - public boolean fits(int width, int height) { - return true; - } - - @Override - public Identifier getId() { - return this.id; - } - - @Override - public RecipeType getType() { - return TYPE; - } - - @Override - public boolean isIgnoredInRecipeBook() { - return true; - } - - public static class Builder { - private final static Builder INSTANCE = new Builder(); - - public static Builder create(String id) { - return create(BetterEnd.makeID(id)); - } - - public static Builder create(Identifier id) { - INSTANCE.id = id; - INSTANCE.input = null; - INSTANCE.output = null; - INSTANCE.level = 1; - INSTANCE.damage = 1; - - return INSTANCE; - } - - private Identifier id; - private Ingredient input; - private ItemStack output; - private int level = 1; - private int damage = 1; - private boolean alright = true; - - private Builder() {} - - public Builder setInput(ItemConvertible... inputItems) { - for (ItemConvertible item : inputItems) { - this.alright &= RecipeHelper.exists(item); - } - this.setInput(Ingredient.ofItems(inputItems)); - return this; - } - - public Builder setInput(Tag inputTag) { - this.setInput(Ingredient.fromTag(inputTag)); - return this; - } - - public Builder setInput(Ingredient ingredient) { - this.input = ingredient; - return this; - } - - public Builder setOutput(ItemConvertible output, int amount) { - this.alright &= RecipeHelper.exists(output); - this.output = new ItemStack(output, amount); - return this; - } - - public Builder setLevel(int level) { - this.level = level; - return this; - } - - public Builder setDamage(int damage) { - this.damage = damage; - return this; - } - - public void build() { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if (EndRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredient or output not exists.", id); - return; - } - EndRecipeManager.addRecipe(TYPE, new AnvilSmithingRecipe(id, input, output, level, damage)); - } - } - - public static class Serializer implements RecipeSerializer { - @Override - public AnvilSmithingRecipe read(Identifier id, JsonObject json) { - Ingredient input = Ingredient.fromJson(JsonHelper.getObject(json, "input")); - String resultStr = JsonHelper.getString(json, "result"); - Identifier resultId = new Identifier(resultStr); - ItemStack output = new ItemStack(Registry.ITEM.getOrEmpty(resultId).orElseThrow(() -> { - return new IllegalStateException("Item: " + resultStr + " does not exists!"); - })); - int level = JsonHelper.getInt(json, "level", 1); - int damage = JsonHelper.getInt(json, "damage", 1); - - return new AnvilSmithingRecipe(id, input, output, level, damage); - } - - @Override - public AnvilSmithingRecipe read(Identifier id, PacketByteBuf packetBuffer) { - Ingredient input = Ingredient.fromPacket(packetBuffer); - ItemStack output = packetBuffer.readItemStack(); - int level = packetBuffer.readVarInt(); - int damage = packetBuffer.readVarInt(); - - return new AnvilSmithingRecipe(id, input, output, level, damage); - } - - @Override - public void write(PacketByteBuf packetBuffer, AnvilSmithingRecipe recipe) { - recipe.input.write(packetBuffer); - packetBuffer.writeItemStack(recipe.output); - packetBuffer.writeVarInt(recipe.level); - packetBuffer.writeVarInt(recipe.damage); - } - } -} diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 455cbb64..ea441729 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -1,21 +1,25 @@ package ru.betterend.recipe.builders; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.SmeltingRecipe; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.CampfireCookingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.item.crafting.SmokingRecipe; +import net.minecraft.world.level.ItemLike; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; public class FurnaceRecipe { private static final FurnaceRecipe INSTANCE = new FurnaceRecipe(); - private ItemConvertible input; - private ItemConvertible output; - private boolean exist = true; + private ItemLike input; + private ItemLike output; + private boolean exist; private String group; private String name; private int count; @@ -24,7 +28,7 @@ public class FurnaceRecipe { private FurnaceRecipe() {} - public static FurnaceRecipe make(String name, ItemConvertible input, ItemConvertible output) { + public static FurnaceRecipe make(String name, ItemLike input, ItemLike output) { INSTANCE.name = name; INSTANCE.group = ""; INSTANCE.input = input; @@ -32,7 +36,7 @@ public class FurnaceRecipe { INSTANCE.count = 1; INSTANCE.time = 200; INSTANCE.xp = 0; - INSTANCE.exist = RecipeHelper.exists(output) && RecipeHelper.exists(input); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) && RecipeHelper.exists(input); return INSTANCE; } @@ -57,13 +61,40 @@ public class FurnaceRecipe { } public void build() { + build(false, false, false); + } + + public void buildWithBlasting() { + build(true, false, false); + } + + public void buildFoodlike() { + build(false, true, true); + } + + public void build(boolean blasting, boolean campfire, boolean smoker) { if (exist) { - Identifier id = BetterEnd.makeID(name); - SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time); + ResourceLocation id = BetterEnd.makeID(name); + SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time); EndRecipeManager.addRecipe(RecipeType.SMELTING, recipe); + + if (blasting) { + BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time / 2); + EndRecipeManager.addRecipe(RecipeType.BLASTING, recipe2); + } + + if (campfire) { + CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time * 3); + EndRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2); + } + + if (smoker) { + SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time / 2); + EndRecipeManager.addRecipe(RecipeType.SMOKING, recipe2); + } } else { - BetterEnd.LOGGER.debug("Smelting recipe {} couldn't be added", name); + BetterEnd.LOGGER.debug("Furnace recipe {} couldn't be added", name); } } } diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index e449d596..64d705c5 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -5,18 +5,19 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.CraftingRecipe; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.recipe.ShapelessRecipe; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.level.ItemLike; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; @@ -24,7 +25,7 @@ public class GridRecipe { private static final GridRecipe INSTANCE = new GridRecipe(); private String name; - private ItemConvertible output; + private ItemLike output; private String group; private RecipeType type; @@ -36,7 +37,7 @@ public class GridRecipe { private GridRecipe() {} - public static GridRecipe make(String name, ItemConvertible output) { + public static GridRecipe make(String name, ItemLike output) { INSTANCE.name = name; INSTANCE.output = output; @@ -47,7 +48,7 @@ public class GridRecipe { INSTANCE.materialKeys.clear(); INSTANCE.count = 1; - INSTANCE.exist = RecipeHelper.exists(output); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("grid", name, true) && RecipeHelper.exists(output); return INSTANCE; } @@ -69,18 +70,18 @@ public class GridRecipe { } public GridRecipe addMaterial(char key, Tag value) { - return addMaterial(key, Ingredient.fromTag(value)); + return addMaterial(key, Ingredient.of(value)); } public GridRecipe addMaterial(char key, ItemStack... value) { - return addMaterial(key, Ingredient.ofStacks(Arrays.stream(value))); + return addMaterial(key, Ingredient.of(Arrays.stream(value))); } - public GridRecipe addMaterial(char key, ItemConvertible... values) { - for (ItemConvertible item: values) { + public GridRecipe addMaterial(char key, ItemLike... values) { + for (ItemLike item: values) { exist &= RecipeHelper.exists(item); } - return addMaterial(key, Ingredient.ofItems(values)); + return addMaterial(key, Ingredient.of(values)); } private GridRecipe addMaterial(char key, Ingredient value) { @@ -93,8 +94,8 @@ public class GridRecipe { return this; } - private DefaultedList getMaterials(int width, int height) { - DefaultedList materials = DefaultedList.ofSize(width * height, Ingredient.EMPTY); + private NonNullList getMaterials(int width, int height) { + NonNullList materials = NonNullList.withSize(width * height, Ingredient.EMPTY); int pos = 0; for (String line: shape) { for (int i = 0; i < width; i++) { @@ -111,8 +112,8 @@ public class GridRecipe { int height = shape.length; int width = shape[0].length(); ItemStack result = new ItemStack(output, count); - Identifier id = BetterEnd.makeID(name); - DefaultedList materials = this.getMaterials(width, height); + ResourceLocation id = BetterEnd.makeID(name); + NonNullList materials = this.getMaterials(width, height); CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) : new ShapelessRecipe(id, group, result, materials); EndRecipeManager.addRecipe(type, recipe); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 324e6072..df7e7bfd 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -2,46 +2,51 @@ package ru.betterend.recipe.builders; import java.util.Arrays; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; +import ru.betterend.util.ItemUtil; -public class InfusionRecipe implements Recipe { +public class InfusionRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "infusion"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - private final Identifier id; + private final ResourceLocation id; + private final Ingredient[] catalysts; private Ingredient input; private ItemStack output; private int time = 1; - private Ingredient[] catalysts = new Ingredient[8]; + private String group; - private InfusionRecipe(Identifier id) { + private InfusionRecipe(ResourceLocation id) { this(id, null, null); } - private InfusionRecipe(Identifier id, Ingredient input, ItemStack output) { + private InfusionRecipe(ResourceLocation id, Ingredient input, ItemStack output) { this.id = id; this.input = input; this.output = output; + this.catalysts = new Ingredient[8]; Arrays.fill(catalysts, Ingredient.EMPTY); } @@ -50,44 +55,48 @@ public class InfusionRecipe implements Recipe { } @Override - public boolean matches(InfusionRitual inv, World world) { - boolean valid = this.input.test(inv.getStack(0)); + public boolean matches(InfusionRitual inv, Level world) { + boolean valid = this.input.test(inv.getItem(0)); if (!valid) return false; for (int i = 0; i < 8; i++) { - valid &= this.catalysts[i].test(inv.getStack(i + 1)); + valid &= this.catalysts[i].test(inv.getItem(i + 1)); } return valid; } @Override - public ItemStack craft(InfusionRitual ritual) { + public ItemStack assemble(InfusionRitual ritual) { return this.output.copy(); } @Override - public boolean fits(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); defaultedList.add(input); - for (Ingredient catalyst : catalysts) { - defaultedList.add(catalyst); - } + defaultedList.addAll(Arrays.asList(catalysts)); return defaultedList; } @Override - public ItemStack getOutput() { + public ItemStack getResultItem() { return this.output; } @Override - public Identifier getId() { + public ResourceLocation getId() { return this.id; } + + @Override + @Environment(EnvType.CLIENT) + public String getGroup() { + return this.group; + } @Override public RecipeSerializer getSerializer() { @@ -101,25 +110,28 @@ public class InfusionRecipe implements Recipe { public static class Builder { private final static Builder INSTANCE = new Builder(); + private static boolean exist; public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - public static Builder create(Identifier id) { + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; INSTANCE.time = 1; + exist = Configs.RECIPE_CONFIG.getBoolean("infusion", id.getPath(), true); Arrays.fill(INSTANCE.catalysts, Ingredient.EMPTY); return INSTANCE; } - private Identifier id; + private ResourceLocation id; private Ingredient input; private ItemStack output; + private String group; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; @@ -127,90 +139,121 @@ public class InfusionRecipe implements Recipe { Arrays.fill(catalysts, Ingredient.EMPTY); } - public Builder setInput(ItemConvertible input) { - this.input = Ingredient.ofItems(input); + public Builder setGroup(String group) { + this.group = group; return this; } - public Builder setOutput(ItemConvertible output) { + public Builder setInput(ItemLike input) { + this.input = Ingredient.of(input); + return this; + } + + public Builder setOutput(ItemLike output) { this.output = new ItemStack(output); this.output.setCount(1); return this; } + public Builder setOutput(ItemStack output) { + this.output = output; + this.output.setCount(1); + return this; + } + public Builder setTime(int time) { this.time = time; return this; } - public Builder addCatalyst(int slot, ItemConvertible item) { + public Builder addCatalyst(int slot, ItemLike... items) { if (slot > 7) return this; - this.catalysts[slot] = Ingredient.ofItems(item); + this.catalysts[slot] = Ingredient.of(items); return this; } public void build() { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); - return; + if (exist) { + if (input == null) { + BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (output == null) { + BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + InfusionRecipe recipe = new InfusionRecipe(id, input, output); + recipe.group = group != null ? group : GROUP; + recipe.time = time; + int empty = 0; + for (int i = 0; i < catalysts.length; i++) { + if (catalysts[i].isEmpty()) empty++; + else recipe.catalysts[i] = catalysts[i]; + } + if (empty == catalysts.length) { + BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); + return; + } + EndRecipeManager.addRecipe(TYPE, recipe); } - if (output == null) { - BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - InfusionRecipe recipe = new InfusionRecipe(id, input, output); - recipe.time = time; - int empty = 0; - for (int i = 0; i < catalysts.length; i++) { - if (catalysts[i].isEmpty()) empty++; - else recipe.catalysts[i] = catalysts[i]; - } - if (empty == catalysts.length) { - BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); - return; - } - EndRecipeManager.addRecipe(TYPE, recipe); } } public static class Serializer implements RecipeSerializer { @Override - public InfusionRecipe read(Identifier id, JsonObject json) { + public InfusionRecipe fromJson(ResourceLocation id, JsonObject json) { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromJson(json.get("input")); - Identifier outId = new Identifier(JsonHelper.getString(json, "output")); - recipe.output = new ItemStack(Registry.ITEM.getOrEmpty(outId).orElseThrow(() -> { - return new IllegalStateException("Item: " + outId + " does not exists!"); - })); - recipe.time = JsonHelper.getInt(json, "time", 1); - JsonArray catalysts = JsonHelper.asArray(json, "catalysts"); - for (int i = 0; i < catalysts.size(); i++) { - ItemStack stack = new ItemStack(Registry.ITEM.getOrEmpty(outId).orElse(null)); - recipe.catalysts[i] = Ingredient.ofStacks( - Arrays.stream(new ItemStack[] { stack })); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); + recipe.output = ItemUtil.fromJsonRecipe(result); + if (recipe.output == null) { + throw new IllegalStateException("Output item does not exists!"); } + recipe.group = GsonHelper.getAsString(json, "group", GROUP); + recipe.time = GsonHelper.getAsInt(json, "time", 1); + + JsonObject catalysts = GsonHelper.convertToJsonObject(json, "catalysts"); + ItemStack catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north", "")); + recipe.catalysts[0] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north_east", "")); + recipe.catalysts[1] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "east", "")); + recipe.catalysts[2] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south_east", "")); + recipe.catalysts[3] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south", "")); + recipe.catalysts[4] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south_west", "")); + recipe.catalysts[5] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "west", "")); + recipe.catalysts[6] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north_west", "")); + recipe.catalysts[7] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + return recipe; } @Override - public InfusionRecipe read(Identifier id, PacketByteBuf buffer) { + public InfusionRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { InfusionRecipe recipe = new InfusionRecipe(id); - recipe.input = Ingredient.fromPacket(buffer); - recipe.output = buffer.readItemStack(); + recipe.input = Ingredient.fromNetwork(buffer); + recipe.output = buffer.readItem(); + recipe.group = buffer.readUtf(); recipe.time = buffer.readVarInt(); for (int i = 0; i < 8; i++) { - recipe.catalysts[i] = Ingredient.fromPacket(buffer); + recipe.catalysts[i] = Ingredient.fromNetwork(buffer); } return recipe; } @Override - public void write(PacketByteBuf buffer, InfusionRecipe recipe) { - recipe.input.write(buffer); - buffer.writeItemStack(recipe.output); + public void toNetwork(FriendlyByteBuf buffer, InfusionRecipe recipe) { + recipe.input.toNetwork(buffer); + buffer.writeItem(recipe.output); + buffer.writeUtf(recipe.group); buffer.writeVarInt(recipe.time); for (int i = 0; i < 8; i++) { - recipe.catalysts[i].write(buffer); + recipe.catalysts[i].toNetwork(buffer); } } } diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java new file mode 100644 index 00000000..b48d55f6 --- /dev/null +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -0,0 +1,100 @@ +package ru.betterend.recipe.builders; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.UpgradeRecipe; +import net.minecraft.world.level.ItemLike; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.recipe.EndRecipeManager; +import ru.betterend.util.RecipeHelper; + +public class SmithingTableRecipe { + + private final static SmithingTableRecipe BUILDER = new SmithingTableRecipe(); + private final static RecipeType TYPE = RecipeType.SMITHING; + + public static SmithingTableRecipe create(String name) { + return create(BetterEnd.makeID(name)); + } + + public static SmithingTableRecipe create(ResourceLocation id) { + BUILDER.id = id; + BUILDER.base = null; + BUILDER.addition = null; + BUILDER.result = null; + BUILDER.alright = true; + + return BUILDER; + } + + private ResourceLocation id; + private Ingredient base; + private Ingredient addition; + private ItemStack result; + private boolean alright; + + private SmithingTableRecipe() {} + + public SmithingTableRecipe setResult(ItemLike item) { + return this.setResult(item, 1); + } + + public SmithingTableRecipe setResult(ItemLike item, int count) { + this.alright &= RecipeHelper.exists(item); + this.result = new ItemStack(item, count); + return this; + } + + public SmithingTableRecipe setBase(ItemLike... items) { + this.alright &= RecipeHelper.exists(items); + this.base = Ingredient.of(items); + return this; + } + + public SmithingTableRecipe setBase(Tag tag) { + this.base = (Ingredient.of(tag)); + return this; + } + + public SmithingTableRecipe setAddition(ItemLike... items) { + this.alright &= RecipeHelper.exists(items); + this.addition = Ingredient.of(items); + return this; + } + + public SmithingTableRecipe setAddition(Tag tag) { + this.addition = (Ingredient.of(tag)); + return this; + } + + public void build() { + if (Configs.RECIPE_CONFIG.getBoolean("smithing", id.getPath(), true)) { + if (base == null) { + BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (addition == null) { + BetterEnd.LOGGER.warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(result == null) { + BetterEnd.LOGGER.warning("Result for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredients or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new UpgradeRecipe(id, base, addition, result)); + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index e9d61013..cf48844a 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -1,9 +1,11 @@ package ru.betterend.registry; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import com.google.common.collect.Lists; @@ -16,83 +18,112 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.biome.BiomeKeys; -import net.minecraft.world.biome.layer.util.LayerRandomnessSource; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.biome.Biomes; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.integration.Integrations; +import ru.betterend.interfaces.IBiomeList; import ru.betterend.util.JsonFactory; -import ru.betterend.world.biome.BiomeAmberLand; -import ru.betterend.world.biome.BiomeBlossomingSpires; -import ru.betterend.world.biome.BiomeChorusForest; -import ru.betterend.world.biome.BiomeCrystalMountains; -import ru.betterend.world.biome.BiomeDustWastelands; -import ru.betterend.world.biome.BiomeFoggyMushroomland; -import ru.betterend.world.biome.BiomeIceStarfield; -import ru.betterend.world.biome.BiomeMegalake; -import ru.betterend.world.biome.BiomeMegalakeGrove; -import ru.betterend.world.biome.BiomePaintedMountains; -import ru.betterend.world.biome.BiomeShadowForest; -import ru.betterend.world.biome.BiomeSulphurSprings; -import ru.betterend.world.biome.BiomeUmbrellaJungle; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.generator.BELayerRandomSource; +import ru.betterend.world.biome.air.BiomeIceStarfield; +import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; +import ru.betterend.world.biome.cave.EmptyEndCaveBiome; +import ru.betterend.world.biome.cave.EmptySmaragdantCaveBiome; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.cave.JadeCaveBiome; +import ru.betterend.world.biome.cave.LushAuroraCaveBiome; +import ru.betterend.world.biome.cave.LushSmaragdantCaveBiome; +import ru.betterend.world.biome.land.AmberLandBiome; +import ru.betterend.world.biome.land.BlossomingSpiresBiome; +import ru.betterend.world.biome.land.ChorusForestBiome; +import ru.betterend.world.biome.land.CrystalMountainsBiome; +import ru.betterend.world.biome.land.DragonGraveyardsBiome; +import ru.betterend.world.biome.land.DryShrublandBiome; +import ru.betterend.world.biome.land.DustWastelandsBiome; +import ru.betterend.world.biome.land.FoggyMushroomlandBiome; +import ru.betterend.world.biome.land.GlowingGrasslandsBiome; +import ru.betterend.world.biome.land.LanternWoodsBiome; +import ru.betterend.world.biome.land.MegalakeBiome; +import ru.betterend.world.biome.land.MegalakeGroveBiome; +import ru.betterend.world.biome.land.NeonOasisBiome; +import ru.betterend.world.biome.land.PaintedMountainsBiome; +import ru.betterend.world.biome.land.ShadowForestBiome; +import ru.betterend.world.biome.land.SulphurSpringsBiome; +import ru.betterend.world.biome.land.UmbrellaJungleBiome; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; public class EndBiomes { - private static final HashMap ID_MAP = Maps.newHashMap(); + private static final HashMap ID_MAP = Maps.newHashMap(); private static final HashMap CLIENT = Maps.newHashMap(); - public static final Set FABRIC_VOID = Sets.newHashSet(); - private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); + public static final Set FABRIC_VOID = Sets.newHashSet(); + private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); + public static final BiomePicker CAVE_BIOMES = new BiomePicker(); public static final List SUBBIOMES = Lists.newArrayList(); private static final JsonObject EMPTY_JSON = new JsonObject(); private static Registry biomeRegistry; // Vanilla Land - public static final EndBiome END = registerBiome(BiomeKeys.THE_END, BiomeType.LAND, 1F); - public static final EndBiome END_MIDLANDS = registerSubBiome(BiomeKeys.END_MIDLANDS, END, 0.5F); - public static final EndBiome END_HIGHLANDS = registerSubBiome(BiomeKeys.END_HIGHLANDS, END, 0.5F); + public static final EndBiome END = registerBiome(Biomes.THE_END, BiomeType.LAND, 1F); + public static final EndBiome END_MIDLANDS = registerSubBiome(Biomes.END_MIDLANDS, END, 0.5F); + public static final EndBiome END_HIGHLANDS = registerSubBiome(Biomes.END_HIGHLANDS, END, 0.5F); // Vanilla Void - public static final EndBiome END_BARRENS = registerBiome(BiomeKeys.END_BARRENS, BiomeType.VOID, 1F); - public static final EndBiome SMALL_END_ISLANDS = registerBiome(BiomeKeys.SMALL_END_ISLANDS, BiomeType.VOID, 1); + public static final EndBiome END_BARRENS = registerBiome(Biomes.END_BARRENS, BiomeType.VOID, 1F); + public static final EndBiome SMALL_END_ISLANDS = registerBiome(Biomes.SMALL_END_ISLANDS, BiomeType.VOID, 1); // Better End Land - public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new BiomeFoggyMushroomland(), BiomeType.LAND); - public static final EndBiome CHORUS_FOREST = registerBiome(new BiomeChorusForest(), BiomeType.LAND); - public static final EndBiome DUST_WASTELANDS = registerBiome(new BiomeDustWastelands(), BiomeType.LAND); - public static final EndBiome MEGALAKE = registerBiome(new BiomeMegalake(), BiomeType.LAND); - public static final EndBiome MEGALAKE_GROVE = registerSubBiome(new BiomeMegalakeGrove(), MEGALAKE); - public static final EndBiome CRYSTAL_MOUNTAINS = registerBiome(new BiomeCrystalMountains(), BiomeType.LAND); - public static final EndBiome PAINTED_MOUNTAINS = registerSubBiome(new BiomePaintedMountains(), DUST_WASTELANDS); - public static final EndBiome SHADOW_FOREST = registerBiome(new BiomeShadowForest(), BiomeType.LAND); - public static final EndBiome AMBER_LAND = registerBiome(new BiomeAmberLand(), BiomeType.LAND); - public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); - public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); - public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); + public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); + public static final EndBiome CHORUS_FOREST = registerBiome(new ChorusForestBiome(), BiomeType.LAND); + public static final EndBiome DUST_WASTELANDS = registerBiome(new DustWastelandsBiome(), BiomeType.LAND); + public static final EndBiome MEGALAKE = registerBiome(new MegalakeBiome(), BiomeType.LAND); + public static final EndBiome MEGALAKE_GROVE = registerSubBiome(new MegalakeGroveBiome(), MEGALAKE); + public static final EndBiome CRYSTAL_MOUNTAINS = registerBiome(new CrystalMountainsBiome(), BiomeType.LAND); + public static final EndBiome PAINTED_MOUNTAINS = registerSubBiome(new PaintedMountainsBiome(), DUST_WASTELANDS); + public static final EndBiome SHADOW_FOREST = registerBiome(new ShadowForestBiome(), BiomeType.LAND); + public static final EndBiome AMBER_LAND = registerBiome(new AmberLandBiome(), BiomeType.LAND); + public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BlossomingSpiresBiome(), BiomeType.LAND); + public static final EndBiome SULPHUR_SPRINGS = registerBiome(new SulphurSpringsBiome(), BiomeType.LAND); + public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new UmbrellaJungleBiome(), BiomeType.LAND); + public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); + public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); + public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); + public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); + public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); - public static void register() {} + // Better End Caves + public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); + public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); + public static final EndCaveBiome LUSH_SMARAGDANT_CAVE = registerCaveBiome(new LushSmaragdantCaveBiome()); + public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); + public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); + public static final EndCaveBiome JADE_CAVE = registerCaveBiome(new JadeCaveBiome()); + + public static void register() { + CAVE_BIOMES.rebuild(); + } public static void mutateRegistry(Registry biomeRegistry) { EndBiomes.biomeRegistry = biomeRegistry; LAND_BIOMES.clearMutables(); VOID_BIOMES.clearMutables(); + CAVE_BIOMES.clearMutables(); if (FABRIC_VOID.isEmpty()) { loadFabricAPIBiomes(); @@ -101,9 +132,9 @@ public class EndBiomes { Map configs = Maps.newHashMap(); biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { - Identifier id = biomeRegistry.getId(biome); - if (Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { + if (biome.getBiomeCategory() == BiomeCategory.THEEND) { + ResourceLocation id = biomeRegistry.getKey(biome); + if (!id.getNamespace().equals("ultra_amplified_dimension") && Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { JsonObject config = configs.get(id.getNamespace()); if (config == null) { @@ -134,46 +165,35 @@ public class EndBiomes { } } }); + Integrations.addBiomes(); Configs.BIOME_CONFIG.saveChanges(); - LAND_BIOMES.rebuild(); - VOID_BIOMES.rebuild(); - - LAND_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); - }); - - VOID_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); - }); + rebuildPicker(LAND_BIOMES, biomeRegistry); + rebuildPicker(VOID_BIOMES, biomeRegistry); + rebuildPicker(CAVE_BIOMES, biomeRegistry); SUBBIOMES.forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); CLIENT.clear(); } + private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { + picker.rebuild(); + picker.getBiomes().forEach((endBiome) -> { + endBiome.updateActualBiomes(biomeRegistry); + }); + } + private static void loadFabricAPIBiomes() { - WeightedBiomePicker picker = InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS); - LayerRandomnessSource random = new BELayerRandomSource(); - if (picker != null) { - for (int i = 0; i < 1000; i++) { - RegistryKey key = picker.pickRandom(random); - FABRIC_VOID.add(key.getValue()); - } - } - picker = InternalBiomeData.getEndBiomesMap().get(BiomeKeys.END_BARRENS); - if (picker != null) { - for (int i = 0; i < 1000; i++) { - RegistryKey key = picker.pickRandom(random); - FABRIC_VOID.add(key.getValue()); - } - } + List> biomes = Lists.newArrayList(); + biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); + biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); + biomes.forEach((key) -> FABRIC_VOID.add(key.location())); + if (BetterEnd.isDevEnvironment()) { + System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); FABRIC_VOID.forEach((id) -> { System.out.println(id); @@ -182,6 +202,11 @@ public class EndBiomes { } } + private static List> getBiomes(WeightedBiomePicker picker) { + IBiomeList biomeList = (IBiomeList) (Object) picker; + return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); + } + private static JsonObject loadJsonConfig(String namespace) { InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); if (inputstream != null) { @@ -198,7 +223,7 @@ public class EndBiomes { */ public static void initRegistry(MinecraftServer server) { if (biomeRegistry == null) { - biomeRegistry = server.getRegistryManager().get(Registry.BIOME_KEY); + biomeRegistry = server.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); } } @@ -222,7 +247,7 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getId(biome), biome, fogDensity, genChance, true); + EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, true); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { addToPicker(endBiome, type); } @@ -249,7 +274,7 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getId(biome), biome, fogDensity, genChance, hasCaves); + EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, hasCaves); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { parent.addSubBiome(endBiome); SUBBIOMES.add(endBiome); @@ -266,8 +291,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { - registerBiomeDirect(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); @@ -284,8 +309,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { - registerBiomeDirect(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); addToPicker(biome, type); ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { @@ -298,70 +323,127 @@ public class EndBiomes { return biome; } - public static EndBiome registerBiome(RegistryKey key, BiomeType type, float genChance) { + /** + * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. + * @param biome - {@link EndBiome} instance + * @return registered {@link EndBiome} + */ + public static EndBiome registerSubBiomeIntegration(EndBiome biome) { + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); + SUBBIOMES.add(biome); + SUBBIOMES_UNMUTABLES.add(biome.getID()); + ID_MAP.put(biome.getID(), biome); + addLandBiomeToFabricApi(biome); + } + return biome; + } + + /** + * Link integration sub-biome with parent. + * @param biome - {@link EndBiome} instance + * @param parent - {@link ResourceLocation} parent id + */ + public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + EndBiome parentBiome = ID_MAP.get(parent); + if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { + parentBiome.addSubBiome(biome); + } + } + } + + public static EndBiome registerBiome(ResourceKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } - public static EndBiome registerSubBiome(RegistryKey key, EndBiome parent, float genChance) { + public static EndBiome registerSubBiome(ResourceKey key, EndBiome parent, float genChance) { return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); } private static void addToPicker(EndBiome biome, BiomeType type) { - if (type == BiomeType.LAND) + if (type == BiomeType.LAND) { LAND_BIOMES.addBiome(biome); - else + } + else { VOID_BIOMES.addBiome(biome); + } } - private static void registerBiomeDirect(EndBiome biome) { - if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); - } + private static void registerBiomeDirectly(EndBiome biome) { + Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } private static void addLandBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); - RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_HIGHLANDS, key, weight); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_MIDLANDS, key, weight); + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(Biomes.END_HIGHLANDS, key, weight); + InternalBiomeData.addEndBiomeReplacement(Biomes.END_MIDLANDS, key, weight); } private static void addVoidBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); - RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.SMALL_END_ISLANDS, key, weight); + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(Biomes.SMALL_END_ISLANDS, key, weight); } public static EndBiome getFromBiome(Biome biome) { - return ID_MAP.getOrDefault(biomeRegistry.getId(biome), END); + return ID_MAP.getOrDefault(biomeRegistry.getKey(biome), END); } @Environment(EnvType.CLIENT) public static EndBiome getRenderBiome(Biome biome) { EndBiome endBiome = CLIENT.get(biome); if (endBiome == null) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - Identifier id = minecraft.world.getRegistryManager().get(Registry.BIOME_KEY).getId(biome); + Minecraft minecraft = Minecraft.getInstance(); + ResourceLocation id = minecraft.level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(biome); endBiome = id == null ? END : ID_MAP.getOrDefault(id, END); CLIENT.put(biome, endBiome); } return endBiome; } - public static Identifier getBiomeID(Biome biome) { - Identifier id = biomeRegistry.getId(biome); + public static ResourceLocation getBiomeID(Biome biome) { + ResourceLocation id = biomeRegistry.getKey(biome); return id == null ? END.getID() : id; } - public static EndBiome getBiome(Identifier biomeID) { + public static EndBiome getBiome(ResourceLocation biomeID) { return ID_MAP.getOrDefault(biomeID, END); } + + public static Biome getActualBiome(EndBiome biome) { + Biome actual = biome.getActualBiome(); + if (actual == null) { + biome.updateActualBiomes(biomeRegistry); + actual = biome.getActualBiome(); + } + return actual; + } public static List getModBiomes() { List result = Lists.newArrayList(); result.addAll(EndBiomes.LAND_BIOMES.getBiomes()); result.addAll(EndBiomes.VOID_BIOMES.getBiomes()); + result.addAll(EndBiomes.CAVE_BIOMES.getBiomes()); result.addAll(SUBBIOMES); return result; } + + public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); + CAVE_BIOMES.addBiome(biome); + ID_MAP.put(biome.getID(), biome); + } + return biome; + } + + public static EndCaveBiome getCaveBiome(Random random) { + return (EndCaveBiome) CAVE_BIOMES.getBiome(random); + } + + public static boolean hasBiome(ResourceLocation biomeID) { + return ID_MAP.containsKey(biomeID); + } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 38e9f40c..003777b3 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -4,22 +4,24 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.BlockItem; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.basis.BlockBarrel; -import ru.betterend.blocks.basis.BlockChest; -import ru.betterend.blocks.basis.BlockPedestal; -import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.basis.EndBarrelBlock; +import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; +import ru.betterend.blocks.basis.EndSignBlock; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.blocks.entities.EChestBlockEntity; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.EternalPedestalEntity; @@ -28,21 +30,23 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, - BlockEntityType.Builder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); + BlockEntityType.Builder.of(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", - BlockEntityType.Builder.create(PedestalBlockEntity::new, getPedestals())); + BlockEntityType.Builder.of(PedestalBlockEntity::new, getPedestals())); public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", - BlockEntityType.Builder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); + BlockEntityType.Builder.of(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", - BlockEntityType.Builder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); + BlockEntityType.Builder.of(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); public static final BlockEntityType CHEST = registerBlockEntity("chest", - BlockEntityType.Builder.create(EChestBlockEntity::new, getChests())); + BlockEntityType.Builder.of(EChestBlockEntity::new, getChests())); public static final BlockEntityType BARREL = registerBlockEntity("barrel", - BlockEntityType.Builder.create(EBarrelBlockEntity::new, getBarrels())); + BlockEntityType.Builder.of(EBarrelBlockEntity::new, getBarrels())); public static final BlockEntityType SIGN = registerBlockEntity("sign", - BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); + BlockEntityType.Builder.of(ESignBlockEntity::new, getSigns())); public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", - BlockEntityType.Builder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + BlockEntityType.Builder.of(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + public static final BlockEntityType FURNACE = registerBlockEntity("furnace", + BlockEntityType.Builder.of(EFurnaceBlockEntity::new, getFurnaces())); public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); @@ -55,7 +59,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockChest) { + if (block instanceof EndChestBlock) { result.add(block); } } @@ -68,7 +72,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockBarrel) { + if (block instanceof EndBarrelBlock) { result.add(block); } } @@ -81,7 +85,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockSign) { + if (block instanceof EndSignBlock) { result.add(block); } } @@ -96,7 +100,20 @@ public class EndBlockEntities { Block block = ((BlockItem) item).getBlock(); if (block instanceof EternalPedestal || block instanceof InfusionPedestal) return; - if (block instanceof BlockPedestal) { + if (block instanceof PedestalBlock) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } + + static Block[] getFurnaces() { + List result = Lists.newArrayList(); + EndItems.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof EndFurnaceBlock) { result.add(block); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 12b61fd5..aa3ee5d0 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,125 +1,88 @@ package ru.betterend.registry; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.BlockItem; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.WaterLilyBlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.BetterEnd; -import ru.betterend.blocks.AeterniumBlock; -import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.blocks.BlockAmber; -import ru.betterend.blocks.BlockAncientEmeraldIce; -import ru.betterend.blocks.BlockBlueVine; -import ru.betterend.blocks.BlockBlueVineLantern; -import ru.betterend.blocks.BlockBlueVineSeed; -import ru.betterend.blocks.BlockBrimstone; -import ru.betterend.blocks.BlockBubbleCoral; -import ru.betterend.blocks.BlockBulbVine; -import ru.betterend.blocks.BlockBulbVineSeed; -import ru.betterend.blocks.BlockCharnia; -import ru.betterend.blocks.BlockChorusGrass; -import ru.betterend.blocks.BlockDenseEmeraldIce; -import ru.betterend.blocks.BlockDenseSnow; -import ru.betterend.blocks.BlockDragonTreeSapling; -import ru.betterend.blocks.BlockEmeraldIce; -import ru.betterend.blocks.BlockEndLily; -import ru.betterend.blocks.BlockEndLilySeed; -import ru.betterend.blocks.BlockEndLotusFlower; -import ru.betterend.blocks.BlockEndLotusLeaf; -import ru.betterend.blocks.BlockEndLotusSeed; -import ru.betterend.blocks.BlockEndLotusStem; -import ru.betterend.blocks.BlockEndstoneDust; -import ru.betterend.blocks.BlockGlowingMoss; -import ru.betterend.blocks.BlockGlowingPillarLuminophor; -import ru.betterend.blocks.BlockGlowingPillarRoots; -import ru.betterend.blocks.BlockGlowingPillarSeed; -import ru.betterend.blocks.BlockHelixTreeLeaves; -import ru.betterend.blocks.BlockHelixTreeSapling; -import ru.betterend.blocks.BlockHydralux; -import ru.betterend.blocks.BlockHydraluxPetal; -import ru.betterend.blocks.BlockHydraluxPetalColored; -import ru.betterend.blocks.BlockHydraluxSapling; -import ru.betterend.blocks.BlockHydrothermalVent; -import ru.betterend.blocks.BlockLacugroveSapling; -import ru.betterend.blocks.BlockLanceleaf; -import ru.betterend.blocks.BlockLanceleafSeed; -import ru.betterend.blocks.BlockMengerSponge; -import ru.betterend.blocks.BlockMengerSpongeWet; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.BlockMossyGlowshroomHymenophore; -import ru.betterend.blocks.BlockMossyGlowshroomSapling; -import ru.betterend.blocks.BlockMurkweed; -import ru.betterend.blocks.BlockNeedlegrass; -import ru.betterend.blocks.BlockPath; -import ru.betterend.blocks.BlockPythadendronSapling; -import ru.betterend.blocks.BlockRespawnObelisk; -import ru.betterend.blocks.BlockShadowBerry; -import ru.betterend.blocks.BlockShadowGrass; -import ru.betterend.blocks.BlockSilkMothNest; -import ru.betterend.blocks.BlockSulphurCrystal; -import ru.betterend.blocks.BlockTenaneaFlowers; -import ru.betterend.blocks.BlockTenaneaSapling; -import ru.betterend.blocks.BlockTerrain; -import ru.betterend.blocks.BlockTerrainPlant; -import ru.betterend.blocks.BlockUmbrellaMoss; -import ru.betterend.blocks.BlockUmbrellaMossTall; -import ru.betterend.blocks.BlockUmbrellaTreeMembrane; -import ru.betterend.blocks.BlockVentBubbleColumn; -import ru.betterend.blocks.EndPortalBlock; -import ru.betterend.blocks.EndStoneSmelter; -import ru.betterend.blocks.EnderBlock; -import ru.betterend.blocks.EternalPedestal; -import ru.betterend.blocks.EternalRunedFlavolite; -import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.PedestalVanilla; -import ru.betterend.blocks.RunedFlavolite; -import ru.betterend.blocks.TerminiteBlock; -import ru.betterend.blocks.basis.BlockBulbVineLantern; -import ru.betterend.blocks.basis.BlockBulbVineLanternColored; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockLeaves; -import ru.betterend.blocks.basis.BlockOre; -import ru.betterend.blocks.basis.BlockSimpleLeaves; -import ru.betterend.blocks.basis.BlockStoneLantern; -import ru.betterend.blocks.basis.BlockUnderwaterWallPlant; -import ru.betterend.blocks.basis.BlockVine; -import ru.betterend.blocks.basis.BlockWallMushroom; -import ru.betterend.blocks.basis.BlockWallPlant; +import ru.betterend.blocks.*; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.blocks.basis.EndCropBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; +import ru.betterend.blocks.basis.EndLeavesBlock; +import ru.betterend.blocks.basis.EndOreBlock; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.SimpleLeavesBlock; +import ru.betterend.blocks.basis.StalactiteBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.blocks.basis.TripleTerrainBlock; +import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.blocks.basis.WallMushroomBlock; import ru.betterend.blocks.complex.ColoredMaterial; +import ru.betterend.blocks.complex.CrystalSubblocksMaterial; +import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.config.Configs; +import ru.betterend.interfaces.ISpetialItem; +import ru.betterend.item.EndAnvilItem; +import ru.betterend.item.material.EndArmorMaterial; +import ru.betterend.item.material.EndToolMaterial; public class EndBlocks { // Terrain // - public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new BlockEndstoneDust()); - public static final Block END_MYCELIUM = registerBlock("end_mycelium", new BlockTerrain(MaterialColor.LIGHT_BLUE)); - public static final Block END_MOSS = registerBlock("end_moss", new BlockTerrain(MaterialColor.CYAN)); - public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new BlockTerrain(MaterialColor.MAGENTA)); - public static final Block CAVE_MOSS = registerBlock("cave_moss", new BlockTerrain(MaterialColor.PURPLE)); - public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new BlockTerrain(MaterialColor.PINK)); - public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new BlockShadowGrass()); - public static final Block PINK_MOSS = registerBlock("pink_moss", new BlockTerrain(MaterialColor.PINK)); - public static final Block AMBER_MOSS = registerBlock("amber_moss", new BlockTerrain(MaterialColor.ORANGE)); + public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); + public static final Block END_MYCELIUM = registerBlock("end_mycelium", new EndTerrainBlock(MaterialColor.COLOR_LIGHT_BLUE)); + public static final Block END_MOSS = registerBlock("end_moss", new EndTerrainBlock(MaterialColor.COLOR_CYAN)); + public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new EndTerrainBlock(MaterialColor.COLOR_MAGENTA)); + public static final Block CAVE_MOSS = registerBlock("cave_moss", new TripleTerrainBlock(MaterialColor.COLOR_PURPLE)); + public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new EndTerrainBlock(MaterialColor.COLOR_PINK)); + public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); + public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.COLOR_PINK)); + public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); + public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.COLOR_GREEN)); + public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.COLOR_RED)); + public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); // Roads // - public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); - public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new BlockPath(END_MOSS)); - public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new BlockPath(CHORUS_NYLIUM)); - public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new BlockPath(CAVE_MOSS)); - public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new BlockPath(CRYSTAL_MOSS)); - public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new BlockPath(SHADOW_GRASS)); - public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new BlockPath(PINK_MOSS)); - public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new BlockPath(AMBER_MOSS)); + public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new EndPathBlock(END_MYCELIUM)); + public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new EndPathBlock(END_MOSS)); + public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new EndPathBlock(CHORUS_NYLIUM)); + public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new EndPathBlock(CAVE_MOSS)); + public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new EndPathBlock(CRYSTAL_MOSS)); + public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new EndPathBlock(SHADOW_GRASS)); + public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new EndPathBlock(PINK_MOSS)); + public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); + public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); + public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new EndPathBlock(SANGNUM)); + public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); + + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); + public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", new EndPillarBlock(Blocks.BONE_BLOCK)); + public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", new EndStairsBlock(DRAGON_BONE_BLOCK)); + public static final Block DRAGON_BONE_SLAB = registerBlock("dragon_bone_slab", new EndSlabBlock(DRAGON_BONE_BLOCK)); + public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); - public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); - public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.BROWN); - public static final Block BRIMSTONE = registerBlock("brimstone", new BlockBrimstone()); - public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new BlockSulphurCrystal()); + public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.COLOR_PURPLE); + public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.COLOR_BROWN); + public static final StoneMaterial VIRID_JADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); + public static final StoneMaterial AZURE_JADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.COLOR_LIGHT_BLUE); + public static final StoneMaterial SANDY_JADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.COLOR_YELLOW); + public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); + public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); + public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite()); public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new EternalRunedFlavolite()); @@ -130,160 +93,260 @@ public class EndBlocks { public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", new PedestalVanilla(Blocks.QUARTZ_BLOCK)); public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", new PedestalVanilla(Blocks.PURPUR_BLOCK)); - public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new BlockHydrothermalVent()); - public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new BlockVentBubbleColumn()); + public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new HydrothermalVentBlock()); + public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new VentBubbleColumnBlock()); - public static final Block DENSE_SNOW = registerBlock("dense_snow", new BlockDenseSnow()); - public static final Block EMERALD_ICE = registerBlock("emerald_ice", new BlockEmeraldIce()); - public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new BlockDenseEmeraldIce()); - public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new BlockAncientEmeraldIce()); + public static final Block DENSE_SNOW = registerBlock("dense_snow", new DenseSnowBlock()); + public static final Block EMERALD_ICE = registerBlock("emerald_ice", new EmeraldIceBlock()); + public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); + public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); + + public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); + public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", new StalactiteBlock(CAVE_MOSS)); // Wooden Materials And Trees // - public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new BlockMossyGlowshroomSapling()); - public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new BlockMossyGlowshroomCap()); - public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new BlockMossyGlowshroomHymenophore()); - public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new BlockFur(MOSSY_GLOWSHROOM_SAPLING, 15, 16)); - public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); + public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); + public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); + public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); + public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); + public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.COLOR_GRAY, MaterialColor.WOOD); - public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new BlockPythadendronSapling()); - public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new BlockLeaves(PYTHADENDRON_SAPLING, MaterialColor.MAGENTA)); - public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.MAGENTA, MaterialColor.PURPLE); + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); + public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, MaterialColor.COLOR_PURPLE); - public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new BlockEndLotusSeed()); - public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new BlockEndLotusStem()); - public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new BlockEndLotusLeaf()); - public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new BlockEndLotusFlower()); - public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.LIGHT_BLUE, MaterialColor.CYAN); + public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); + public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); + public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new EndLotusLeafBlock()); + public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new EndLotusFlowerBlock()); + public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, MaterialColor.COLOR_CYAN); - public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new BlockLacugroveSapling()); - public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new BlockLeaves(LACUGROVE_SAPLING, MaterialColor.CYAN)); - public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.BROWN, MaterialColor.YELLOW); + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); + public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_YELLOW); - public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new BlockDragonTreeSapling()); - public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new BlockLeaves(DRAGON_TREE_SAPLING, MaterialColor.MAGENTA)); - public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.BLACK, MaterialColor.MAGENTA); + public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); + public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, MaterialColor.COLOR_MAGENTA); - public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new BlockTenaneaSapling()); - public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new BlockLeaves(TENANEA_SAPLING, MaterialColor.PINK)); - public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new BlockTenaneaFlowers()); - public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new BlockFur(TENANEA_SAPLING, 32)); - public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.BROWN, MaterialColor.PINK); + public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); + public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); + public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); + public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); + public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_PINK); - public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new BlockHelixTreeSapling()); - public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new BlockHelixTreeLeaves()); - public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.GRAY, MaterialColor.ORANGE); + public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); + public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); + public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, MaterialColor.COLOR_ORANGE); - public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new BlockUmbrellaTreeMembrane()); - public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); + public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); + public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, MaterialColor.COLOR_GREEN); + + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); + public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, MaterialColor.COLOR_LIGHT_BLUE); + + public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new TenaneaSaplingBlock()); + public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); + public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); + public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, MaterialColor.COLOR_ORANGE); // Small Plants // - public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockUmbrellaMoss()); - public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new BlockUmbrellaMossTall()); - public static final Block CREEPING_MOSS = registerBlock("creeping_moss", new BlockGlowingMoss(11)); - public static final Block CHORUS_GRASS = registerBlock("chorus_grass", new BlockChorusGrass()); - public static final Block CAVE_GRASS = registerBlock("cave_grass", new BlockTerrainPlant(CAVE_MOSS)); - public static final Block CRYSTAL_GRASS = registerBlock("crystal_grass", new BlockTerrainPlant(CRYSTAL_MOSS)); - public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new BlockTerrainPlant(SHADOW_GRASS)); - public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new BlockTerrainPlant(PINK_MOSS)); - public static final Block AMBER_GRASS = registerBlock("amber_grass", new BlockTerrainPlant(AMBER_MOSS)); + public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); + public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); + public static final Block CREEPING_MOSS = registerBlock("creeping_moss", new GlowingMossBlock(11)); + public static final Block CHORUS_GRASS = registerBlock("chorus_grass", new ChorusGrassBlock()); + public static final Block CAVE_GRASS = registerBlock("cave_grass", new TerrainPlantBlock(CAVE_MOSS)); + public static final Block CRYSTAL_GRASS = registerBlock("crystal_grass", new TerrainPlantBlock(CRYSTAL_MOSS)); + public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new TerrainPlantBlock(SHADOW_GRASS)); + public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new TerrainPlantBlock(PINK_MOSS)); + public static final Block AMBER_GRASS = registerBlock("amber_grass", new TerrainPlantBlock(AMBER_MOSS)); + public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new TwistedUmbrellaMossBlock()); + public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new TwistedUmbrellaMossTallBlock()); + public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new TerrainPlantBlock(JUNGLE_MOSS)); + public static final Block BLOOMING_COOKSONIA = registerBlock("blooming_cooksonia", new TerrainPlantBlock(END_MOSS)); + public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); + public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); + public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); + public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); + public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); + public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); + public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); - public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlockBlueVineSeed()); - public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlockBlueVine()); - public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlockBlueVineLantern()); - public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new BlockFur(BLUE_VINE_SEED, 15, 3)); + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); + public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); + public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); + public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3, false)); - public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new BlockLanceleafSeed()); - public static final Block LANCELEAF = registerBlockNI("lanceleaf", new BlockLanceleaf()); + public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); + public static final Block LANCELEAF = registerBlockNI("lanceleaf", new LanceleafBlock()); - public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new BlockGlowingPillarSeed()); - public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new BlockGlowingPillarRoots()); - public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new BlockGlowingPillarLuminophor()); - public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new BlockFur(GLOWING_PILLAR_SEED, 15, 3)); + public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); + public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new GlowingPillarRootsBlock()); + public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); + public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); - public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BlockBubbleCoral()); - public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new BlockMengerSponge()); - public static final Block MENGER_SPONGE_WET = registerBlock("menger_sponge_wet", new BlockMengerSpongeWet()); - public static final Block CHARNIA_RED = registerBlock("charnia_red", new BlockCharnia()); - public static final Block CHARNIA_PURPLE = registerBlock("charnia_purple", new BlockCharnia()); - public static final Block CHARNIA_ORANGE = registerBlock("charnia_orange", new BlockCharnia()); - public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new BlockCharnia()); - public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new BlockCharnia()); - public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new BlockCharnia()); + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); + public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); - public static final Block END_LILY = registerBlockNI("end_lily", new BlockEndLily()); - public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new BlockEndLilySeed()); + public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); + public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new BlockHydraluxSapling()); - public static final Block HYDRALUX = registerBlockNI("hydralux", new BlockHydralux()); - public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new BlockHydraluxPetal()); - public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(BlockHydraluxPetalColored::new, HYDRALUX_PETAL_BLOCK, true); + public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); + public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); + public static final Block AMARANITA_STEM = registerBlock("amaranita_stem", new AmaranitaStemBlock()); + public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaStemBlock()); + public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); + public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); + public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); + public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); - public static final Block CAVE_BUSH = registerBlock("cave_bush", new BlockSimpleLeaves(MaterialColor.MAGENTA)); + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusPlantBlock()); + public static final Block NEON_CACTUS_BLOCK = registerBlock("neon_cactus_block", new NeonCactusBlock()); + public static final Block NEON_CACTUS_BLOCK_STAIRS = registerBlock("neon_cactus_stairs", new EndStairsBlock(NEON_CACTUS_BLOCK)); + public static final Block NEON_CACTUS_BLOCK_SLAB = registerBlock("neon_cactus_slab", new EndSlabBlock(NEON_CACTUS_BLOCK)); - public static final Block MURKWEED = registerBlock("murkweed", new BlockMurkweed()); - public static final Block NEEDLEGRASS = registerBlock("needlegrass", new BlockNeedlegrass()); + // Crops + public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); + public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); + public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); + //public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); + public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); + + // Water plants + public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); + public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); + public static final Block MENGER_SPONGE_WET = registerBlock("menger_sponge_wet", new MengerSpongeWetBlock()); + public static final Block CHARNIA_RED = registerBlock("charnia_red", new CharniaBlock()); + public static final Block CHARNIA_PURPLE = registerBlock("charnia_purple", new CharniaBlock()); + public static final Block CHARNIA_ORANGE = registerBlock("charnia_orange", new CharniaBlock()); + public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new CharniaBlock()); + public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new CharniaBlock()); + public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new CharniaBlock()); + + public static final Block END_LILY = registerBlockNI("end_lily", new EndLilyBlock()); + public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); + + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + public static final Block HYDRALUX = registerBlockNI("hydralux", new HydraluxBlock()); + public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); + public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); + + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new PondAnemoneBlock()); + + public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); + + public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.COLOR_MAGENTA)); + + public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); + public static final Block NEEDLEGRASS = registerBlock("needlegrass", new NeedlegrassBlock()); // Wall Plants // - public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new BlockWallMushroom(13)); - public static final Block TAIL_MOSS = registerBlock("tail_moss", new BlockWallPlant()); - public static final Block CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant()); - public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new BlockWallPlant()); - public static final Block TUBE_WORM = registerBlock("tube_worm", new BlockUnderwaterWallPlant()); - public static final Block BULB_MOSS = registerBlock("bulb_moss", new BlockWallPlant(12)); - - // Crops // - public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); + public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new WallMushroomBlock(13)); + public static final Block AURANT_POLYPORE = registerBlock("aurant_polypore", new WallMushroomBlock(13)); + public static final Block TAIL_MOSS = registerBlock("tail_moss", new EndWallPlantBlock()); + public static final Block CYAN_MOSS = registerBlock("cyan_moss", new EndWallPlantBlock()); + public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new EndWallPlantBlock()); + public static final Block TUBE_WORM = registerBlock("tube_worm", new EndUnderwaterWallPlantBlock()); + public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); + public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); + public static final Block RUSCUS = registerBlock("ruscus", new EndWallPlantBlock()); // Vines // - public static final Block DENSE_VINE = registerBlock("dense_vine", new BlockVine(15, true)); - public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BlockVine()); - public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BlockBulbVineSeed()); - public static final Block BULB_VINE = registerBlock("bulb_vine", new BlockBulbVine()); + public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); + public static final Block TWISTED_VINE = registerBlock("twisted_vine", new VineBlock()); + public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BulbVineSeedBlock()); + public static final Block BULB_VINE = registerBlock("bulb_vine", new BulbVineBlock()); + public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); + public static final Block RUBINEA = registerBlock("rubinea", new VineBlock()); + public static final Block MAGNULA = registerBlock("magnula", new VineBlock()); + public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); + public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); + public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); // Mob-Related - public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new BlockSilkMothNest()); + public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); + public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); // Ores // - public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(EndItems.ENDER_SHARD, 1, 3, 5)); - public static final Block AMBER_ORE = registerBlock("amber_ore", new BlockOre(EndItems.RAW_AMBER, 1, 2, 4)); + public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); + public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // - public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); + public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.WARPED_WART_BLOCK, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); + public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); + public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); - public static final Block AMBER_BLOCK = registerBlock("amber_block", new BlockAmber()); + public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); + public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); + public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); - public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new BlockRespawnObelisk()); + public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); // Lanterns - public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new BlockStoneLantern(Blocks.ANDESITE)); - public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new BlockStoneLantern(Blocks.DIORITE)); - public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new BlockStoneLantern(Blocks.GRANITE)); - public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new BlockStoneLantern(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new BlockStoneLantern(Blocks.PURPUR_BLOCK)); - public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new BlockStoneLantern(Blocks.END_STONE)); - public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new BlockStoneLantern(Blocks.BLACKSTONE)); + public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); + public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); + public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new StoneLanternBlock(Blocks.GRANITE)); + public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); + public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); + public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); - public static final Block BULB_LANTERN = registerBlock("bulb_lantern", new BlockBulbVineLantern()); - public static final ColoredMaterial BULB_LANTERN_COLORED = new ColoredMaterial(BlockBulbVineLanternColored::new, BULB_LANTERN, false); + public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); + public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); + + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); + public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); // Blocks With Entity // + public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new EndFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); + public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); // Technical public static final Block END_PORTAL_BLOCK = registerBlockNI("end_portal_block", new EndPortalBlock()); public static void register() {} - public static Block registerBlock(Identifier id, Block block) { - if (!Configs.BLOCK_CONFIG.getBoolean(id, "blocks", true)) { + public static Block registerBlock(ResourceLocation id, Block block) { + if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; } Registry.register(Registry.BLOCK, id, block); - EndItems.registerBlockItem(id, new BlockItem(block, EndItems.makeBlockItemSettings())); + int maxCount = 64; + boolean placeOnWater = false; + if (block instanceof ISpetialItem) { + ISpetialItem item = (ISpetialItem) block; + maxCount = item.getStackSize(); + placeOnWater = item.canPlaceOnWater(); + } + Properties item = EndItems.makeBlockItemSettings().stacksTo(maxCount); + if (placeOnWater) { + EndItems.registerBlockItem(id, new WaterLilyBlockItem(block, item)); + } + else { + if (block instanceof EndAnvilBlock) { + EndItems.registerBlockItem(id, new EndAnvilItem(block)); + } + else { + EndItems.registerBlockItem(id, new BlockItem(block, item)); + } + } + if (block.defaultBlockState().getMaterial().isFlammable() && FlammableBlockRegistry.getDefaultInstance().get(block).getBurnChance() == 0) { + FlammableBlockRegistry.getDefaultInstance().add(block, 5, 5); + } return block; } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 1f685f43..11e15d55 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -2,46 +2,60 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EntityType.EntityFactory; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.attribute.DefaultAttributeContainer.Builder; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityType.EntityFactory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityCubozoa; -import ru.betterend.entity.EntityDragonfly; -import ru.betterend.entity.EntityEndFish; -import ru.betterend.entity.EntityEndSlime; -import ru.betterend.entity.EntityShadowWalker; +import ru.betterend.config.Configs; +import ru.betterend.entity.CubozoaEntity; +import ru.betterend.entity.DragonflyEntity; +import ru.betterend.entity.EndFishEntity; +import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.ShadowWalkerEntity; +import ru.betterend.entity.SilkMothEntity; import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; public class EndEntities { - public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityDragonfly::new, EntityDragonfly.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); - public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, EntityEndSlime::new, EntityEndSlime.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); - public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EntityEndFish::new, EntityEndFish.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); - public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, EntityShadowWalker::new, EntityShadowWalker.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); - public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, EntityCubozoa::new, EntityCubozoa.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType DRAGONFLY = register("dragonfly", MobCategory.AMBIENT, 0.6F, 0.5F, DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); + public static final EntityType END_SLIME = register("end_slime", MobCategory.MONSTER, 2F, 2F, EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); + public static final EntityType END_FISH = register("end_fish", MobCategory.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); + public static final EntityType SHADOW_WALKER = register("shadow_walker", MobCategory.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); + public static final EntityType CUBOZOA = register("cubozoa", MobCategory.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType SILK_MOTH = register("silk_moth", MobCategory.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), MHelper.color(242, 220, 236)); public static void register() { - SpawnHelper.restrictionLand(END_SLIME, EntityEndSlime::canSpawn); - SpawnHelper.restrictionWater(END_FISH, EntityEndFish::canSpawn); - SpawnHelper.restrictionLand(SHADOW_WALKER, EntityShadowWalker::canSpawn); - SpawnHelper.restrictionWater(CUBOZOA, EntityCubozoa::canSpawn); + SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); + SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); + SpawnHelper.restrictionWater(END_FISH, EndFishEntity::canSpawn); + SpawnHelper.restrictionLand(SHADOW_WALKER, ShadowWalkerEntity::canSpawn); + SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); + SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } - protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { - EntityType type = Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build()); + protected static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity) { + ResourceLocation id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); + if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { + return Registry.register(Registry.ENTITY_TYPE, id, type); + } return type; } - private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { - EntityType type = Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)).build()); - FabricDefaultAttributeRegistry.register(type, attributes); - EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); + private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + ResourceLocation id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)).build(); + if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { + FabricDefaultAttributeRegistry.register(type, attributes); + EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); + return Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), type); + } return type; } } diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 7c0b0ed5..30384554 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -3,14 +3,15 @@ package ru.betterend.registry; import java.util.function.Function; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.entity.EntityType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.world.entity.EntityType; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; +import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { @@ -20,9 +21,10 @@ public class EndEntitiesRenders { register(EndEntities.END_FISH, RendererEntityEndFish::new); register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); } - private static void register(EntityType type, Function> render) { + private static void register(EntityType type, Function> render) { EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { return render.apply(entityRenderDispatcher); }); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index bf0fdfd2..30337086 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -5,48 +5,73 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; -import net.minecraft.util.Identifier; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import ru.betterend.BetterEnd; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.features.BiomeIslandFeature; import ru.betterend.world.features.BlueVineFeature; -import ru.betterend.world.features.CavePlantFeature; +import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; +import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.features.DoublePlantFeature; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLilyFeature; import ru.betterend.world.features.EndLotusFeature; import ru.betterend.world.features.EndLotusLeafFeature; +import ru.betterend.world.features.FilaluxFeature; import ru.betterend.world.features.GlowPillarFeature; import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; +import ru.betterend.world.features.NeonCactusFeature; +import ru.betterend.world.features.SilkMothNestFeature; +import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.BushWithOuterFeature; +import ru.betterend.world.features.bushes.LargeAmaranitaFeature; +import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; +import ru.betterend.world.features.terrain.BigAuroraCrystalFeature; +import ru.betterend.world.features.terrain.DesertLakeFeature; import ru.betterend.world.features.terrain.EndLakeFeature; +import ru.betterend.world.features.terrain.FallenPillarFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; -import ru.betterend.world.features.terrain.RoundCaveFeature; +import ru.betterend.world.features.terrain.ObsidianBoulderFeature; +import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; +import ru.betterend.world.features.terrain.SingleBlockFeature; +import ru.betterend.world.features.terrain.SmaragdantCrystalFeature; import ru.betterend.world.features.terrain.SpireFeature; +import ru.betterend.world.features.terrain.StalactiteFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; +import ru.betterend.world.features.terrain.caves.RoundCaveFeature; +import ru.betterend.world.features.terrain.caves.TunelCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; +import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; +import ru.betterend.world.features.trees.JellyshroomFeature; import ru.betterend.world.features.trees.LacugroveFeature; +import ru.betterend.world.features.trees.LucerniaFeature; import ru.betterend.world.features.trees.MossyGlowshroomFeature; import ru.betterend.world.features.trees.PythadendronTreeFeature; import ru.betterend.world.features.trees.TenaneaFeature; import ru.betterend.world.features.trees.UmbrellaTreeFeature; +import ru.betterend.world.generator.GeneratorOptions; public class EndFeatures { // Trees // @@ -56,19 +81,26 @@ public class EndFeatures { public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3); public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); - public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 2); + public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); + public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); + public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); + public static final EndFeature LUCERNIA = new EndFeature("lucernia", new LucerniaFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); + public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); + public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); + public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); + public static final EndFeature LUCERNIA_BUSH_RARE = new EndFeature("lucernia_bush_rare", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 1); + public static final EndFeature NEON_CACTUS = new EndFeature("neon_cactus", new NeonCactusFeature(), 2); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); public static final EndFeature BLUE_VINE = new EndFeature("blue_vine", new BlueVineFeature(), 1); public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); - public static final EndFeature CAVE_GRASS = new EndFeature("cave_grass", new CavePlantFeature(EndBlocks.CAVE_GRASS, 7), 7); public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), 2); @@ -79,15 +111,41 @@ public class EndFeatures { public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); + public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); + public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); + public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); + public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); + public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); + public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), 5); + public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); + public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), 5); + public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); + public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); + public static final EndFeature ORANGO = new EndFeature("orango", new SinglePlantFeature(EndBlocks.ORANGO, 5), 6); + public static final EndFeature AERIDIUM = new EndFeature("aeridium", new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); + public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), 5); + public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); + public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); + public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); + public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); + public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); + public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); + public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); + //public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final EndFeature BULB_VINE = new EndFeature("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); + public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); + + // Ceil plants + public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); // Wall Plants // public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); - public static final EndFeature PURPLE_POLYPORE_DENSE = new EndFeature("purple_polypore_dense", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 5), 15); + public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), 15); public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), 15); public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); @@ -96,6 +154,14 @@ public class EndFeatures { public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), 1); public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); + public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); + public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); + public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); + public static final EndFeature RUSCUS = new EndFeature("ruscus", new WallPlantFeature(EndBlocks.RUSCUS, 6), 10); + public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); + + // Sky plants + public static final EndFeature FILALUX = new EndFeature("filalux", new FilaluxFeature(), 1); // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); @@ -105,6 +171,7 @@ public class EndFeatures { public static final EndFeature END_LOTUS = new EndFeature("end_lotus", new EndLotusFeature(7), 5); public static final EndFeature END_LOTUS_LEAF = new EndFeature("end_lotus_leaf", new EndLotusLeafFeature(20), 25); public static final EndFeature HYDRALUX = new EndFeature("hydralux", new HydraluxFeature(5), 5); + public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", new CharniaFeature(EndBlocks.CHARNIA_RED), 10); public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); @@ -114,12 +181,15 @@ public class EndFeatures { public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); + public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", new BiomeIslandFeature()); + public static final EndFeature FLAMAEA = new EndFeature("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); + public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), 20); public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); + public static final EndFeature DESERT_LAKE = EndFeature.makeLakeFeature("desert_lake", new DesertLakeFeature(), 8); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); - public static final EndFeature ROUND_CAVE_RARE = EndFeature.makeRawGenFeature("round_cave_rare", new RoundCaveFeature(), 25); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", new FloatingSpireFeature(), 8); public static final EndFeature GEYSER = EndFeature.makeRawGenFeature("geyser", new GeyserFeature(), 8); @@ -129,38 +199,67 @@ public class EndFeatures { public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", new SurfaceVentFeature(), 4); public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); + public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); + public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); + public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); + public static final EndFeature TUNEL_CAVE = EndFeature.makeChunkFeature("tunel_cave", new TunelCaveFeature()); // Ores // - public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 6, 3, 0, 4, 96); - public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 4, 96); - public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 4, 96, 8); - public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 4, 96, 6); + public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); + public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); + public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); + public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); + public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); // Buildings public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); - public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { - if (id.getNamespace().equals("minecraft")) { - String path = id.getPath(); - if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { - int pos = GenerationStep.Feature.VEGETAL_DECORATION.ordinal(); - if (pos < features.size()) { - List>> list = features.get(pos); - // If only chorus plants are enabled - if (list.size() == 1) { - features.get(pos).clear(); + // Mobs + public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); + + // Caves + public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); + public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature(EndBlocks.SMARAGDANT_CRYSTAL_SHARD); + public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); + public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); + public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); + public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); + public static final DefaultFeature MAGNULA = new VineFeature(EndBlocks.MAGNULA, 8); + public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); + public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); + + public static void registerBiomeFeatures(ResourceLocation id, Biome biome, List>>> features) { + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { + return; + } + + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { + if (id.getNamespace().equals("minecraft")) { + String path = id.getPath(); + if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { + int pos = GenerationStep.Decoration.VEGETAL_DECORATION.ordinal(); + if (pos < features.size()) { + List>> list = features.get(pos); + // If only chorus plants are enabled + if (list.size() == 1) { + features.get(pos).clear(); + } } } } } addFeature(FLAVOLITE_LAYER, features); + addFeature(THALLASIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); if (EndBiomes.getBiome(id).hasCaves()) { - addFeature(ROUND_CAVE_RARE, features); - addFeature(CAVE_GRASS, features); + addFeature(ROUND_CAVE, features); + addFeature(TUNEL_CAVE, features); } EndBiome endBiome = EndBiomes.getBiome(id); @@ -170,6 +269,18 @@ public class EndFeatures { } } + public static void addDefaultFeatures(BiomeDefinition def) { + def.addFeature(FLAVOLITE_LAYER); + def.addFeature(THALLASIUM_ORE); + def.addFeature(ENDER_ORE); + def.addFeature(CRASHED_SHIP); + + if (def.hasCaves()) { + def.addFeature(ROUND_CAVE); + def.addFeature(TUNEL_CAVE); + } + } + private static void addFeature(EndFeature feature, List>>> features) { int index = feature.getFeatureStep().ordinal(); if (features.size() > index) { diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index bb426036..92d98166 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -5,43 +5,52 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.FishBucketItem; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.FoodComponents; -import net.minecraft.item.Item; -import net.minecraft.item.Item.Settings; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.SpawnEggItem; -import net.minecraft.item.SwordItem; -import net.minecraft.item.ToolItem; -import net.minecraft.item.ToolMaterials; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.Tag; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.food.Foods; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.level.block.DispenserBlock; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.item.EndArmorMaterial; -import ru.betterend.item.EndAxe; -import ru.betterend.item.EndHammer; -import ru.betterend.item.EndHoe; -import ru.betterend.item.EndPickaxe; -import ru.betterend.item.EndToolMaterial; -import ru.betterend.item.EternalCrystal; -import ru.betterend.item.ItemSpawnEgg; +import ru.betterend.interfaces.BreakableItem; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.item.DrinkItem; +import ru.betterend.item.EnchantedPetalItem; +import ru.betterend.item.EndArmorItem; +import ru.betterend.item.EndBucketItem; +import ru.betterend.item.EndSpawnEggItem; +import ru.betterend.item.EternalCrystalItem; +import ru.betterend.item.PatternedDiscItem; import ru.betterend.item.PatternedItem; +import ru.betterend.item.material.EndArmorMaterial; +import ru.betterend.item.material.EndToolMaterial; +import ru.betterend.item.tool.EndAxeItem; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndHoeItem; +import ru.betterend.item.tool.EndPickaxeItem; +import ru.betterend.item.tool.EndShovelItem; +import ru.betterend.item.tool.EndSwordItem; import ru.betterend.tab.CreativeTabs; import ru.betterend.util.TagHelper; @@ -52,7 +61,6 @@ public class EndItems { // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); - public final static Item TERMINITE_INGOT = registerItem("terminite_ingot"); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot"); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf"); public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried"); @@ -63,122 +71,148 @@ public class EndItems { public final static Item CRYSTALLINE_SULPHUR = registerItem("crystalline_sulphur"); public final static Item HYDRALUX_PETAL = registerItem("hydralux_petal"); public final static Item GELATINE = registerItem("gelatine"); + public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystalItem()); + public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetalItem()); + public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); + public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); + public final static Item SILK_FIBER = registerItem("silk_fiber"); + public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); + public final static Item SILK_MOTH_MATRIX = registerItem("silk_moth_matrix"); + + // Music Discs + public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, EndSounds.STRANGE_AND_ALIEN); // Armor // - public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item TERMINITE_CHESTPLATE = registerItem("terminite_chestplate", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item TERMINITE_LEGGINGS = registerItem("terminite_leggings", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item TERMINITE_BOOTS = registerItem("terminite_boots", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.FEET, makeItemSettings())); - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings())); - public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings())); - + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireResistant())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item ARMORED_ELYTRA = registerItem("elytra_armored", new ArmoredElytra("elytra_armored", AETERNIUM_INGOT, 700, 0.96D, true)); + // Tools // - public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new SwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); - public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxe(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); - public static final ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxe(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoe(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammer(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new ShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new SwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings())); - public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings())); - public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxe(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoe(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammer(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings())); - public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammer(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammer(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammer(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammer(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings())); + public static final TieredItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireResistant())); + + // Toolparts // + public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); + public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); + public final static Item AETERNIUM_AXE_HEAD = registerItem("aeternium_axe_head"); + public final static Item AETERNIUM_HOE_HEAD = registerItem("aeternium_hoe_head"); + public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); + public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); + public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); + + // Hammers // + public static final TieredItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(Tiers.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final TieredItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final TieredItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final TieredItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(Tiers.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F); - public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON); - public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON); - public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); - public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); - public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + public final static Item END_FISH_RAW = registerFood("end_fish_raw", Foods.SALMON); + public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", Foods.COOKED_SALMON); + public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new EndBucketItem()); + public final static Item BUCKET_CUBOZOA = registerItem("bucket_cubozoa", new EndBucketItem()); + public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); + public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); + public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", Foods.APPLE); + public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); + public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); + public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", Foods.MUSHROOM_STEW); + public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", Foods.MUSHROOM_STEW); + public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", Foods.PUMPKIN_PIE); - // Other // - public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); + // Drinks // + public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); - protected static Item registerItem(String name) { + public static Item registerDisc(String name, int power, SoundEvent sound) { + return registerItem(BetterEnd.makeID(name), new PatternedDiscItem(power, sound, makeItemSettings())); + } + + public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } - protected static Item registerItem(String name, Item item) { + public static Item registerItem(String name, Item item) { return registerItem(BetterEnd.makeID(name), item); } - public static Item registerItem(Identifier id, Item item) { + public static Item registerItem(ResourceLocation id, Item item) { if (item instanceof ArmorItem) { return registerArmor(id, item); } - if (!Configs.ITEM_CONFIG.getBoolean(id, "items", true)) { + if (!Configs.ITEM_CONFIG.getBoolean("items", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); + if (item instanceof BreakableItem) { + ((BreakableItem) item).registerBrokenItem(); + } return item; } - public static Item registerBlockItem(Identifier id, Item item) { + public static Item registerBlockItem(ResourceLocation id, Item item) { registerItem(id, item, MOD_BLOCKS); return item; } - private static void registerItem(Identifier id, Item item, List registry) { + private static void registerItem(ResourceLocation id, Item item, List registry) { if (item != Items.AIR) { Registry.register(Registry.ITEM, id, item); registry.add(item); } } - private static Item registerArmor(Identifier id, Item item) { - if (!Configs.ITEM_CONFIG.getBoolean(id, "armor", true)) { + private static Item registerArmor(ResourceLocation id, Item item) { + if (!Configs.ITEM_CONFIG.getBoolean("armor", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); return item; } - private static ToolItem registerTool(String name, ToolItem item) { - Identifier id = BetterEnd.makeID(name); - if (!Configs.ITEM_CONFIG.getBoolean(id, "tools", true)) { + public static TieredItem registerTool(String name, TieredItem item) { + ResourceLocation id = BetterEnd.makeID(name); + if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); if (item instanceof ShovelItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.SHOVELS, item); + TagHelper.addTag((Tag.Named) FabricToolTags.SHOVELS, item); } else if (item instanceof SwordItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.SWORDS, item); - } else if (item instanceof EndPickaxe) { - TagHelper.addTag((Tag.Identified) FabricToolTags.PICKAXES, item); - } else if (item instanceof EndAxe) { - TagHelper.addTag((Tag.Identified) FabricToolTags.AXES, item); - } else if (item instanceof EndHoe) { - TagHelper.addTag((Tag.Identified) FabricToolTags.HOES, item); - } else if (item instanceof EndHammer) { - TagHelper.addTag((Tag.Identified) EndTags.HAMMERS, item); + TagHelper.addTag((Tag.Named) FabricToolTags.SWORDS, item); + } else if (item instanceof EndPickaxeItem) { + TagHelper.addTag((Tag.Named) FabricToolTags.PICKAXES, item); + } else if (item instanceof EndAxeItem) { + TagHelper.addTag((Tag.Named) FabricToolTags.AXES, item); + } else if (item instanceof EndHoeItem) { + TagHelper.addTag((Tag.Named) FabricToolTags.HOES, item); + } else if (item instanceof EndHammerItem) { + TagHelper.addTag(EndTags.HAMMERS, item); } return item; } public static Item registerEgg(String name, EntityType type, int background, int dots) { - SpawnEggItem item = new ItemSpawnEgg(type, background, dots, makeItemSettings()); - ItemDispenserBehavior behavior = new ItemDispenserBehavior() { - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); - EntityType entityType = ((SpawnEggItem) stack.getItem()).getEntityType(stack.getTag()); - entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnReason.DISPENSER, direction != Direction.UP, false); - stack.decrement(1); + SpawnEggItem item = new EndSpawnEggItem(type, background, dots, makeItemSettings()); + DefaultDispenseItemBehavior behavior = new DefaultDispenseItemBehavior() { + public ItemStack execute(BlockSource pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); + entityType.spawn(pointer.getLevel(), stack, null, pointer.getPos().relative(direction), MobSpawnType.DISPENSER, direction != Direction.UP, false); + stack.shrink(1); return stack; } }; @@ -186,24 +220,37 @@ public class EndItems { return registerItem(name, item); } - public static Item registerFood(String name, int hunger, float saturation, StatusEffectInstance... effects) { - FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); - for (StatusEffectInstance effect: effects) { - builder.statusEffect(effect, 1F); + public static Item registerFood(String name, int hunger, float saturation, MobEffectInstance... effects) { + FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); + for (MobEffectInstance effect: effects) { + builder.effect(effect, 1F); } return registerFood(name, builder.build()); } - public static Item registerFood(String name, FoodComponent foodComponent) { + public static Item registerFood(String name, FoodProperties foodComponent) { return registerItem(name, new PatternedItem(makeItemSettings().food(foodComponent))); } - - public static Settings makeItemSettings() { - return new Item.Settings().group(CreativeTabs.TAB_ITEMS); + + public static Item registerDrink(String name) { + return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1))); } - public static Settings makeBlockItemSettings() { - return new Item.Settings().group(CreativeTabs.TAB_BLOCKS); + public static Item registerDrink(String name, FoodProperties foodComponent) { + return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1).food(foodComponent))); + } + + public static Item registerDrink(String name, int hunger, float saturation) { + FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); + return registerDrink(name, builder.build()); + } + + public static Properties makeItemSettings() { + return new Item.Properties().tab(CreativeTabs.TAB_ITEMS); + } + + public static Properties makeBlockItemSettings() { + return new Item.Properties().tab(CreativeTabs.TAB_BLOCKS); } public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index 50b08fe7..2fb673a6 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -2,31 +2,37 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; import ru.betterend.BetterEnd; +import ru.betterend.particle.FireflyParticle; import ru.betterend.particle.InfusionParticle; import ru.betterend.particle.InfusionParticleType; import ru.betterend.particle.ParticleBlackSpore; import ru.betterend.particle.ParticleGeyser; import ru.betterend.particle.ParticleGlowingSphere; +import ru.betterend.particle.ParticleJungleSpore; import ru.betterend.particle.ParticleSnowflake; import ru.betterend.particle.ParticleSulphur; import ru.betterend.particle.ParticleTenaneaPetal; import ru.betterend.particle.PaticlePortalSphere; +import ru.betterend.particle.SmaragdantParticle; public class EndParticles { - public static final DefaultParticleType GLOWING_SPHERE = register("glowing_sphere"); - public static final DefaultParticleType PORTAL_SPHERE = register("portal_sphere"); + public static final SimpleParticleType GLOWING_SPHERE = register("glowing_sphere"); + public static final SimpleParticleType PORTAL_SPHERE = register("portal_sphere"); public static final ParticleType INFUSION = register("infusion", FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); - public static final DefaultParticleType SULPHUR_PARTICLE = register("sulphur_particle"); - public static final DefaultParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); - public static final DefaultParticleType SNOWFLAKE = register("snowflake"); - public static final DefaultParticleType AMBER_SPHERE = register("amber_sphere"); - public static final DefaultParticleType BLACK_SPORE = register("black_spore"); - public static final DefaultParticleType TENANEA_PETAL = register("tenanea_petal"); + public static final SimpleParticleType SULPHUR_PARTICLE = register("sulphur_particle"); + public static final SimpleParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); + public static final SimpleParticleType SNOWFLAKE = register("snowflake"); + public static final SimpleParticleType AMBER_SPHERE = register("amber_sphere"); + public static final SimpleParticleType BLACK_SPORE = register("black_spore"); + public static final SimpleParticleType TENANEA_PETAL = register("tenanea_petal"); + public static final SimpleParticleType JUNGLE_SPORE = register("jungle_spore"); + public static final SimpleParticleType FIREFLY = register("firefly"); + public static final SimpleParticleType SMARAGDANT = register("smaragdant_particle"); public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); @@ -38,17 +44,20 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(AMBER_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); ParticleFactoryRegistry.getInstance().register(BLACK_SPORE, ParticleBlackSpore.FactoryBlackSpore::new); ParticleFactoryRegistry.getInstance().register(TENANEA_PETAL, ParticleTenaneaPetal.FactoryTenaneaPetal::new); + ParticleFactoryRegistry.getInstance().register(JUNGLE_SPORE, ParticleJungleSpore.FactoryJungleSpore::new); + ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); + ParticleFactoryRegistry.getInstance().register(SMARAGDANT, SmaragdantParticle.SmaragdantParticleFactory::new); } - private static DefaultParticleType register(String name) { + private static SimpleParticleType register(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple()); } - private static DefaultParticleType registerFar(String name) { + private static SimpleParticleType registerFar(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple(true)); } - private static ParticleType register(String name, ParticleType type) { + private static ParticleType register(String name, ParticleType type) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), type); } } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java new file mode 100644 index 00000000..8288f60b --- /dev/null +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -0,0 +1,153 @@ +package ru.betterend.registry; + +import java.io.File; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import ru.betterend.BetterEnd; +import ru.betterend.config.ConfigWriter; +import ru.betterend.util.JsonFactory; +import ru.betterend.util.MHelper; + +public class EndPortals { + + public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.location(); + + private static PortalInfo[] portals; + + public static void loadPortals() { + File file = new File(ConfigWriter.MOD_CONFIG_DIR, "portals.json"); + JsonObject json; + if (!file.exists()) { + file.getParentFile().mkdirs(); + json = makeDefault(file); + } else { + json = JsonFactory.getJsonObject(file); + } + if (!json.has("portals") || !json.get("portals").isJsonArray()) { + json = makeDefault(file); + } + JsonArray array = json.get("portals").getAsJsonArray(); + if (array.size() == 0) { + json = makeDefault(file); + array = json.get("portals").getAsJsonArray(); + } + portals = new PortalInfo[array.size()]; + for (int i = 0; i < portals.length; i++) { + portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); + } + } + + public static int getCount() { + return MHelper.max(portals.length - 1, 1); + } + + public static ServerLevel getWorld(MinecraftServer server, int portalId) { + if (portalId < 0 || portalId >= portals.length) { + return server.overworld(); + } + return portals[portalId].getWorld(server); + } + + public static ResourceLocation getWorldId(int portalId) { + if (portalId < 0 || portalId >= portals.length) { + return OVERWORLD_ID; + } + return portals[portalId].dimension; + } + + public static int getPortalIdByItem(ResourceLocation item) { + for (int i = 0; i < portals.length; i++) { + if (portals[i].item.equals(item)) { + return i; + } + } + return 0; + } + public static int getPortalIdByWorld(ResourceLocation world) { + for (int i = 0; i < portals.length; i++) { + if (portals[i].dimension.equals(world)) { + return i; + } + } + return 0; + } + + public static int getColor(int state) { + return portals[state].color; + } + + public static boolean isAvailableItem(ResourceLocation item) { + for (PortalInfo portal : portals) { + if (portal.item.equals(item)) { + return true; + } + } + return false; + } + + private static JsonObject makeDefault(File file) { + JsonObject jsonObject = new JsonObject(); + JsonFactory.storeJson(file, jsonObject); + JsonArray array = new JsonArray(); + jsonObject.add("portals", array); + array.add(makeDefault().toJson()); + JsonFactory.storeJson(file, jsonObject); + return jsonObject; + } + + private static PortalInfo makeDefault() { + return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); + } + + private static class PortalInfo { + private final ResourceLocation dimension; + private final ResourceLocation item; + private final int color; + private ServerLevel world; + + PortalInfo(JsonObject obj) { + this( + new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), + JsonFactory.getInt(obj, "colorRed", 255), + JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255) + ); + } + + PortalInfo(ResourceLocation dimension, ResourceLocation item, int r, int g, int b) { + this.dimension = dimension; + this.item = item; + this.color = MHelper.color(r, g, b); + } + + ServerLevel getWorld(MinecraftServer server) { + if (world != null) { + return world; + } + for (ServerLevel world : server.getAllLevels()) { + if (world.dimension().location().equals(dimension)) { + this.world = world; + return world; + } + } + return server.overworld(); + } + + JsonObject toJson() { + JsonObject obj = new JsonObject(); + obj.addProperty("dimension", dimension.toString()); + obj.addProperty("item", item.toString()); + obj.addProperty("colorRed", (color >> 16) & 255); + obj.addProperty("colorGreen", (color >> 8) & 255); + obj.addProperty("colorBlue", color & 255); + return obj; + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 6107ecf8..7110cd17 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -1,20 +1,15 @@ package ru.betterend.registry; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.sounds.SoundEvent; import ru.betterend.BetterEnd; public class EndSounds { // Music - public static final SoundEvent MUSIC_FOGGY_MUSHROOMLAND = register("music", "foggy_mushroomland"); - public static final SoundEvent MUSIC_CHORUS_FOREST = register("music", "chorus_forest"); - public static final SoundEvent MUSIC_CRYSTAL_MOUNTAINS = register("music", "crystal_mountains"); - public static final SoundEvent MUSIC_MEGALAKE = register("music", "megalake"); - public static final SoundEvent MUSIC_DUST_WASTELANDS = register("music", "dust_wastelands"); - public static final SoundEvent MUSIC_SHADOW_FOREST = register("music", "shadow_forest"); - public static final SoundEvent MUSIC_BLOSSOMING_SPIRES = register("music", "blossoming_spires"); - public static final SoundEvent MUSIC_AMBER_LAND = register("music", "amber_land"); - public static final SoundEvent MUSIC_SULPHUR_SPRINGS = register("music", "sulphur_springs"); + public static final SoundEvent MUSIC_FOREST = register("music", "forest"); + public static final SoundEvent MUSIC_WATER = register("music", "water"); + public static final SoundEvent MUSIC_DARK = register("music", "dark"); + public static final SoundEvent MUSIC_OPENSPACE = register("music", "openspace"); // Ambient public static final SoundEvent AMBIENT_FOGGY_MUSHROOMLAND = register("ambient", "foggy_mushroomland"); @@ -24,6 +19,8 @@ public class EndSounds { public static final SoundEvent AMBIENT_MEGALAKE_GROVE = register("ambient", "megalake_grove"); public static final SoundEvent AMBIENT_BLOSSOMING_SPIRES = register("ambient", "blossoming_spires"); public static final SoundEvent AMBIENT_SULPHUR_SPRINGS = register("ambient", "sulphur_springs"); + public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); + public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); @@ -31,6 +28,9 @@ public class EndSounds { public static final SoundEvent ENTITY_SHADOW_WALKER_DAMAGE = register("entity", "shadow_walker_damage"); public static final SoundEvent ENTITY_SHADOW_WALKER_DEATH = register("entity", "shadow_walker_death"); + // Records + public static final SoundEvent STRANGE_AND_ALIEN = register("record", "strange_and_alien"); + public static void register() {} private static SoundEvent register(String type, String id) { diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 67756626..c3ed2370 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -3,41 +3,43 @@ package ru.betterend.registry; import java.util.Collection; import java.util.function.Supplier; -import net.minecraft.structure.StructurePieceType; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; import ru.betterend.BetterEnd; import ru.betterend.world.structures.EndStructureFeature; -import ru.betterend.world.structures.features.StructureEternalPortal; -import ru.betterend.world.structures.features.StructureGiantIceStar; -import ru.betterend.world.structures.features.StructureGiantMossyGlowshroom; -import ru.betterend.world.structures.features.StructureMegaLake; -import ru.betterend.world.structures.features.StructureMountain; -import ru.betterend.world.structures.features.StructurePaintedMountain; +import ru.betterend.world.structures.features.EternalPortalStructure; +import ru.betterend.world.structures.features.GiantIceStarStructure; +import ru.betterend.world.structures.features.GiantMossyGlowshroomStructure; +import ru.betterend.world.structures.features.MegaLakeSmallStructure; +import ru.betterend.world.structures.features.MegaLakeStructure; +import ru.betterend.world.structures.features.MountainStructure; +import ru.betterend.world.structures.features.PaintedMountainStructure; import ru.betterend.world.structures.piece.CavePiece; +import ru.betterend.world.structures.piece.CrystalMountainPiece; import ru.betterend.world.structures.piece.LakePiece; -import ru.betterend.world.structures.piece.MountainPiece; import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; public class EndStructures { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); - public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", MountainPiece::new); + public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); public static final StructurePieceType CAVE_PIECE = register("cave_piece", CavePiece::new); public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new StructurePaintedMountain(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new StructureEternalPortal(), Feature.SURFACE_STRUCTURES, 16, 6); - public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new StructureGiantIceStar(), Feature.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Decoration.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Decoration.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), Decoration.RAW_GENERATION, 3, 2); + public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Decoration.RAW_GENERATION, 3, 2); + public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Decoration.SURFACE_STRUCTURES, 16, 6); + public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); public static void register() {} @@ -45,7 +47,7 @@ public class EndStructures { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - public static void registerBiomeStructures(Identifier id, Biome biome, Collection>> structures) { + public static void registerBiomeStructures(ResourceLocation id, Biome biome, Collection>> structures) { if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { addStructure(ETERNAL_PORTAL, structures); } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 0e954611..92aaedb5 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,100 +1,157 @@ package ru.betterend.registry; -import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; -import net.minecraft.tag.Tag; -import net.minecraft.tag.Tag.Identified; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagCollection; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.BetterEnd; -import ru.betterend.blocks.BlockTerrain; -import ru.betterend.blocks.basis.BlockPedestal; -import ru.betterend.blocks.basis.BlockSimpleLeaves; -import ru.betterend.blocks.basis.BlockVine; +import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.basis.PedestalBlock; +import ru.betterend.blocks.basis.SimpleLeavesBlock; +import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.item.tool.EndHammerItem; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; public class EndTags { + // Table with common (c) tags: + // https://fabricmc.net/wiki/tutorial:tags + // Block Tags - public static final Tag.Identified END_GROUND = makeBlockTag("end_ground"); - public static final Tag.Identified GEN_TERRAIN = makeBlockTag("gen_terrain"); - public static final Tag.Identified BOOKSHELVES = makeCommonTag("bookshelves"); - public static final Tag.Identified PEDESTALS = makeBlockTag("pedestal"); + public static final Tag.Named BOOKSHELVES = makeCommonBlockTag("bookshelves"); + public static final Tag.Named GEN_TERRAIN = makeBlockTag("gen_terrain"); + public static final Tag.Named END_GROUND = makeBlockTag("end_ground"); + public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); + public static final Tag.Named BLOCK_CHEST = makeCommonBlockTag("chest"); + public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); + public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); // Item Tags - public final static Tag HAMMERS = registerFabricItemTag("hammers"); - - public static Tag.Identified makeBlockTag(String name) { - Identifier id = BetterEnd.makeID(name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + public static final Tag.Named ITEM_CHEST = makeCommonItemTag("chest"); + public static final Tag.Named IRON_INGOTS = makeCommonItemTag("iron_ingots"); + public static final Tag.Named FURNACES = makeCommonItemTag("furnaces"); + public final static Tag.Named HAMMERS = makeFabricItemTag("hammers"); + + public static Tag.Named makeTag(Supplier> containerSupplier, ResourceLocation id) { + Tag tag = containerSupplier.get().getTag(id); + return tag == null ? TagRegistry.create(id, containerSupplier) : (Named) tag; + } + + public static Tag.Named makeBlockTag(String name) { + return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); } - public static Tag.Identified makeItemTag(String name) { - Identifier id = BetterEnd.makeID(name); - Tag tag = ItemTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + public static Tag.Named makeItemTag(String name) { + return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); } - public static Tag.Identified makeCommonTag(String name) { - Identifier id = new Identifier("c", name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + public static Tag.Named makeCommonBlockTag(String name) { + return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); + } + + public static Tag.Named makeCommonItemTag(String name) { + return makeTag(ItemTags::getAllTags, new ResourceLocation("c", name)); + } + + public static Tag.Named makeFabricItemTag(String name) { + return makeTag(ItemTags::getAllTags, new ResourceLocation("fabric", name)); + } + + public static Tag.Named getMCBlockTag(String name) { + ResourceLocation id = new ResourceLocation(name); + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } public static void register() { addSurfaceBlock(Blocks.END_STONE); + addSurfaceBlock(EndBlocks.THALLASIUM.ore); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); + addSurfaceBlock(EndBlocks.AMBER_ORE); - EndItems.getModBlocks().forEach((item) -> { - Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockTerrain) { + EndItems.getModBlocks().forEach(blockItem -> { + Block block = ((BlockItem) blockItem).getBlock(); + if (block instanceof EndTerrainBlock) { addSurfaceBlock(block); TagHelper.addTag(BlockTags.NYLIUM, block); } - else if (block instanceof LeavesBlock || block instanceof BlockSimpleLeaves) { + else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagHelper.addTag(BlockTags.LEAVES, block); - ComposterBlockAccessor.callRegisterCompostableItem(0.3F, block); + ComposterBlockAccessor.callAdd(0.3F, block); } - else if (block instanceof BlockVine) { + else if (block instanceof VineBlock) { TagHelper.addTag(BlockTags.CLIMBABLE, block); } - else if (block instanceof BlockPedestal) { + else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } - if (block.getDefaultState().getMaterial().equals(Material.PLANT)) { - ComposterBlockAccessor.callRegisterCompostableItem(0.1F, block); + + Material mat = block.defaultBlockState().getMaterial(); + if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { + ComposterBlockAccessor.callAdd(0.1F, block); } }); - TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); + List hammers = Lists.newArrayList(); + EndItems.getModItems().forEach(item -> { + if (item.isEdible()) { + FoodProperties food = item.getFoodProperties(); + if (food != null) { + float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; + ComposterBlockAccessor.callAdd(compost, item); + } + } + if (item instanceof EndHammerItem) { + hammers.add(item); + } + }); + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); + + TagHelper.addTag( + GEN_TERRAIN, + EndBlocks.ENDER_ORE, + EndBlocks.FLAVOLITE.stone, + EndBlocks.VIOLECITE.stone, + EndBlocks.SULPHURIC_ROCK.stone, + EndBlocks.BRIMSTONE, + EndBlocks.VIRID_JADESTONE.stone, + EndBlocks.AZURE_JADESTONE.stone, + EndBlocks.SANDY_JADESTONE.stone + ); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( - Arrays.asList( - EndItems.IRON_HAMMER, - EndItems.GOLDEN_HAMMER, - EndItems.DIAMOND_HAMMER, - EndItems.NETHERITE_HAMMER, - EndItems.TERMINITE_HAMMER, - EndItems.AETERNIUM_HAMMER - ) - )); + TagHelper.addTag(FURNACES, Blocks.FURNACE); + TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); + + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); + TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); + + TagHelper.addTag(EndTags.IRON_INGOTS, Items.IRON_INGOT); + TagHelper.addTag(EndTags.IRON_INGOTS, EndBlocks.TERMINITE.ingot); } public static void addSurfaceBlock(Block block) { @@ -104,22 +161,14 @@ public class EndTags { public static void addTerrainTags(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { - SurfaceConfig config = biome.getGenerationSettings().getSurfaceConfig(); - TagHelper.addTag(GEN_TERRAIN, config.getTopMaterial().getBlock(), config.getUnderMaterial().getBlock()); + if (biome.getBiomeCategory() == BiomeCategory.THEEND) { + SurfaceBuilderConfiguration config = biome.getGenerationSettings().getSurfaceBuilderConfig(); + Block under = config.getUnderMaterial().getBlock(); + Block surface = config.getTopMaterial().getBlock(); + TagHelper.addTag(GEN_TERRAIN, under, surface); + TagHelper.addTag(END_GROUND, surface); } }); - } - - public static boolean validGenBlock(BlockState block) { - return block.isIn(END_GROUND) || block.isIn(GEN_TERRAIN); - } - - public static Tag registerItemTag(String name) { - return TagRegistry.item(BetterEnd.makeID(name)); - } - - public static Tag registerFabricItemTag(String name) { - return TagRegistry.item(new Identifier("fabric", name)); + END_STONES.getValues().forEach(EndTags::addSurfaceBlock); } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index b98f404b..995c3244 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -1,38 +1,50 @@ package ru.betterend.rituals; import java.awt.Point; +import java.util.List; +import java.util.Objects; import java.util.Random; import java.util.Set; +import java.util.function.Predicate; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.Features; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.particle.BlockStateParticleEffect; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.Heightmap; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.material.Material; +import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndPortals; public class EternalRitual { private final static Set STRUCTURE_MAP = Sets.newHashSet( @@ -51,322 +63,322 @@ public class EternalRitual { private final static Set BASE_MAP = Sets.newHashSet( new Point(3, 0), new Point(2, 0), new Point(2, 1), new Point(1, 1), new Point(1, 2), new Point(0, 1), new Point(0, 2)); - + private final static Block BASE = EndBlocks.FLAVOLITE.tiles; private final static Block PEDESTAL = EndBlocks.ETERNAL_PEDESTAL; private final static Block FRAME = EndBlocks.FLAVOLITE_RUNED_ETERNAL; private final static Block PORTAL = EndBlocks.END_PORTAL_BLOCK; private final static BooleanProperty ACTIVE = BlockProperties.ACTIVE; - - private World world; + + public final static int SEARCH_RADIUS = calculateSearchSteps(48); + + private Level world; private Direction.Axis axis; + private ResourceLocation targetWorldId; private BlockPos center; private BlockPos exit; private boolean active = false; - - public EternalRitual(World world) { + + public EternalRitual(Level world) { this.world = world; } - - public EternalRitual(World world, BlockPos initial) { + + public EternalRitual(Level world, BlockPos initial) { this(world); this.configure(initial); } - - public boolean hasWorld() { - return this.world != null; - } - - public void setWorld(World world) { + + public void setWorld(Level world) { this.world = world; } - - private boolean isValid() { - return world != null && !world.isClient() && - center != null && axis != null && - world.getRegistryKey() != World.NETHER; + + @Nullable + public ResourceLocation getTargetWorldId() { + return targetWorldId; } - + + private boolean isInvalid() { + return world == null || world.isClientSide() || + center == null || axis == null; + } + public void checkStructure() { - if (!isValid()) return; + if (isInvalid()) return; Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } - boolean valid = this.checkFrame(); + boolean valid = checkFrame(world, center.below()); + Item item = null; for (Point pos : STRUCTURE_MAP) { - BlockPos.Mutable checkPos = center.mutableCopy(); + BlockPos.MutableBlockPos checkPos = center.mutable(); checkPos.move(moveX, pos.x).move(moveY, pos.y); - valid &= this.isActive(checkPos); + valid &= isActive(checkPos); + if (valid) { + EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(checkPos); + if (pedestal != null) { + Item pItem = pedestal.getItem(0).getItem(); + if (item == null) { + item = pItem; + } else if (!item.equals(pItem)) { + valid = false; + } + } + } } - if (valid) { - this.activatePortal(); + if (valid && item != null) { + activatePortal(item); } } - - private boolean checkFrame() { - BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + + private boolean checkFrame(Level world, BlockPos framePos) { + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; boolean valid = true; for (Point point : FRAME_MAP) { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); valid &= state.getBlock() instanceof RunedFlavolite; - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); valid &= state.getBlock() instanceof RunedFlavolite; } return valid; } - + public boolean isActive() { - return this.active; + return active; } - - private void activatePortal() { + + private void activatePortal(Item keyItem) { if (active) return; - this.activatePortal(world, center); - this.doEffects((ServerWorld) world, center); - if (exit == null) { - this.exit = this.findPortalPos(); - } else { - World targetWorld = this.getTargetWorld(); - this.activatePortal(targetWorld, exit); + ResourceLocation itemId = Registry.ITEM.getKey(keyItem); + int portalId = EndPortals.getPortalIdByItem(itemId); + Level targetWorld = getTargetWorld(portalId); + ResourceLocation worldId = targetWorld.dimension().location(); + try { + if (exit == null) { + initPortal(worldId, portalId); + } else { + if (!worldId.equals(targetWorldId)) { + initPortal(worldId, portalId); + } else if (!checkFrame(targetWorld, exit.below())) { + Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + generatePortal(targetWorld, exit, portalAxis, portalId); + } + activatePortal(targetWorld, exit, portalId); + } + activatePortal(world, center, portalId); + doEffects((ServerLevel) world, center); + active = true; + } catch (Exception ex) { + BetterEnd.LOGGER.error("Create End portals error.", ex); + removePortal(targetWorld, exit); + removePortal(world, center); + active = false; } - this.active = true; } - - private void doEffects(ServerWorld serverWorld, BlockPos center) { + + private void initPortal(ResourceLocation worldId, int portalId) { + targetWorldId = worldId; + exit = findPortalPos(portalId); + } + + private void doEffects(ServerLevel serverWorld, BlockPos center) { Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } for (Point pos : STRUCTURE_MAP) { - BlockPos.Mutable p = center.mutableCopy(); + BlockPos.MutableBlockPos p = center.mutable(); p.move(moveX, pos.x).move(moveY, pos.y); - serverWorld.spawnParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 0.3); + serverWorld.sendParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 0.3); } - serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundCategory.NEUTRAL, 16, 1); + serverWorld.playSound(null, center, SoundEvents.END_PORTAL_SPAWN, SoundSource.NEUTRAL, 16, 1); } - - private void activatePortal(World world, BlockPos center) { - BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; - BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); + + private void activatePortal(Level world, BlockPos center, int portalId) { + BlockPos framePos = center.below(); + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; + BlockState frame = FRAME.defaultBlockState().setValue(ACTIVE, true); FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.get(ACTIVE)) { - world.setBlockState(pos, frame); + if (state.hasProperty(ACTIVE) && !state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, frame); } - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.get(ACTIVE)) { - world.setBlockState(pos, frame); + if (state.hasProperty(ACTIVE) && !state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, frame); } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis); - ParticleEffect effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); - ServerWorld serverWorld = (ServerWorld) world; - + BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, portalAxis).setValue(EndPortalBlock.PORTAL, portalId); + ParticleOptions effect = new BlockParticleOption(ParticleTypes.BLOCK, portal); + ServerLevel serverWorld = (ServerLevel) world; + PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isOf(PORTAL)) { - world.setBlockState(pos, portal); - serverWorld.spawnParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + if (!world.getBlockState(pos).is(PORTAL)) { + world.setBlockAndUpdate(pos, portal); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isOf(PORTAL)) { - world.setBlockState(pos, portal); - serverWorld.spawnParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + if (!world.getBlockState(pos).is(PORTAL)) { + world.setBlockAndUpdate(pos, portal); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } }); } - - public void removePortal() { - if (!active || !isValid()) return; - World targetWorld = this.getTargetWorld(); - this.removePortal(world, center); - this.removePortal(targetWorld, exit); + + public void disablePortal(int state) { + if (!active || isInvalid()) return; + removePortal(getTargetWorld(state), exit); + removePortal(world, center); } - - private void removePortal(World world, BlockPos center) { - BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + + private void removePortal(Level world, BlockPos center) { + BlockPos framePos = center.below(); + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.isOf(FRAME) && state.get(ACTIVE)) { - world.setBlockState(pos, state.with(ACTIVE, false)); + if (state.is(FRAME) && state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, state.setValue(ACTIVE, false)); } - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.isOf(FRAME) && state.get(ACTIVE)) { - world.setBlockState(pos, state.with(ACTIVE, false)); + if (state.is(FRAME) && state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, state.setValue(ACTIVE, false)); } }); PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (world.getBlockState(pos).isOf(PORTAL)) { + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + if (world.getBlockState(pos).is(PORTAL)) { world.removeBlock(pos, false); } - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (world.getBlockState(pos).isOf(PORTAL)) { + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + if (world.getBlockState(pos).is(PORTAL)) { world.removeBlock(pos, false); } }); this.active = false; } - - private BlockPos findPortalPos() { - MinecraftServer server = world.getServer(); - ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(); - Registry registry = server.getRegistryManager().getDimensionTypes(); - double mult = registry.get(DimensionType.THE_END_ID).getCoordinateScale(); - BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / mult, center.getY(), center.getZ() / mult); - Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, basePos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return basePos.toImmutable(); - } else { - return basePos.toImmutable(); + + @Nullable + private BlockPos findFrame(Level world, BlockPos.MutableBlockPos startPos) { + List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, + blockState -> blockState.is(FRAME) && !blockState.getValue(ACTIVE)); + for(BlockPos.MutableBlockPos testPos : foundPos) { + if (checkFrame(world, testPos)) { + return testPos; } + } + return null; + } + + private BlockPos findPortalPos(int portalId) { + MinecraftServer server = world.getServer(); + ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); + Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); + double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); + BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); + BlockPos framePos = findFrame(targetWorld, basePos.mutable()); + if (framePos != null) { + return framePos.above(); + } + Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + int worldCeil = targetWorld.getHeight() - 1; + if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { + generatePortal(targetWorld, basePos, portalAxis, portalId); + return basePos.immutable(); } else { Direction direction = Direction.EAST; - BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { - for (int i = 0; i < step; i++) { - checkPos.setY(5); - while(checkPos.getY() < world.getHeight()) { - if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, checkPos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return checkPos.toImmutable(); - } else { - return checkPos.toImmutable(); + BlockPos.MutableBlockPos checkPos = basePos.mutable(); + int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); + for (int step = 1; step < radius; step++) { + for (int i = 0; i < (step >> 1); i++) { + ChunkAccess chunk = targetWorld.getChunk(checkPos); + if (chunk != null) { + int surfaceY = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + int motionY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); + int ceil = Math.min(Math.max(surfaceY, motionY) + 1, worldCeil); + if (ceil < 5) continue; + checkPos.setY(ceil); + while (checkPos.getY() >= 5) { + if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + generatePortal(targetWorld, checkPos, portalAxis, portalId); + return checkPos.immutable(); } + checkPos.move(Direction.DOWN); } - checkPos.move(Direction.UP); } checkPos.move(direction); } - direction = direction.rotateYClockwise(); + direction = direction.getClockWise(); } } - if (targetWorld.getRegistryKey() == World.END) { - ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); - } else { - basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); + if (targetWorld.dimension() == Level.END) { + Features.END_ISLAND.place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); + } else if (targetWorld.dimension() == Level.OVERWORLD) { + basePos.setY(targetWorld.getChunk(basePos).getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); } - EternalRitual.generatePortal(targetWorld, basePos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return basePos.toImmutable(); - } else { - return basePos.toImmutable(); + EndFeatures.BIOME_ISLAND.getFeatureConfigured().place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); + generatePortal(targetWorld, basePos, portalAxis, portalId); + return basePos.immutable(); + } + + private Level getTargetWorld(int state) { + if (world.dimension() == Level.END) { + return EndPortals.getWorld(world.getServer(), state); } + return Objects.requireNonNull(world.getServer()).getLevel(Level.END); } - - private World getTargetWorld() { - RegistryKey target = world.getRegistryKey() == World.END ? World.OVERWORLD : World.END; - return world.getServer().getWorld(target); - } - - private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { + + private boolean checkIsAreaValid(Level world, BlockPos pos, Direction.Axis axis) { + if (pos.getY() >= world.getHeight() - 1) return false; if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); } - - private boolean isBaseValid(World world, BlockPos pos, Direction.Axis axis) { + + private boolean isBaseValid(Level world, BlockPos pos, Direction.Axis axis) { boolean solid = true; if (axis.equals(Direction.Axis.X)) { - pos = pos.down().add(0, 0, -3); + pos = pos.below().offset(0, 0, -3); for (int i = 0; i < 7; i++) { - BlockPos checkPos = pos.add(0, 0, i); + BlockPos checkPos = pos.offset(0, 0, i); BlockState state = world.getBlockState(checkPos); - solid &= this.validBlock(world, checkPos, state); + solid &= validBlock(world, checkPos, state); } - } else { - pos = pos.down().add(-3, 0, 0); + } + else { + pos = pos.below().offset(-3, 0, 0); for (int i = 0; i < 7; i++) { - BlockPos checkPos = pos.add(i, 0, 0); + BlockPos checkPos = pos.offset(i, 0, 0); BlockState state = world.getBlockState(checkPos); - solid &= this.validBlock(world, checkPos, state); + solid &= validBlock(world, checkPos, state); } } return solid; } - - private boolean validBlock(World world, BlockPos pos, BlockState state) { - BlockState surfaceBlock = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - return state.isSolidBlock(world, pos) && - (EndTags.validGenBlock(state) || - state.isOf(surfaceBlock.getBlock()) || - state.isOf(Blocks.STONE) || - state.isOf(Blocks.SAND) || - state.isOf(Blocks.GRAVEL)); + + private boolean validBlock(Level world, BlockPos pos, BlockState state) { + return state.isRedstoneConductor(world, pos) && state.isCollisionShapeFullBlock(world, pos); } - - public static void generatePortal(World world, BlockPos center, Direction.Axis axis) { - BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.EAST: Direction.NORTH; - BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); - FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); - }); - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis); - PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); - }); - generateBase(world, framePos, moveDir); - } - - private static void generateBase(World world, BlockPos center, Direction moveX) { - BlockState base = BASE.getDefaultState(); - Direction moveY = moveX.rotateYClockwise(); - BASE_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveX, point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, point.x).move(moveY, -point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, -point.y); - world.setBlockState(pos, base); - }); - } - - public static boolean checkArea(World world, BlockPos center, Direction.Axis axis) { - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; - for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.rotateYClockwise()), center.offset(moveDir.rotateYCounterclockwise()))) { - for (Point point : PORTAL_MAP) { - BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isAir()) return false; - pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isAir()) return false; - } - } - return true; - } - + public void configure(BlockPos initial) { BlockPos checkPos = initial.east(12); if (this.hasPedestal(checkPos)) { @@ -398,11 +410,10 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.north(5).east(4); - return; } else { this.center = initial.north(5).west(4); - return; } + return; } checkPos = initial.south(10); if (this.hasPedestal(checkPos)) { @@ -410,11 +421,10 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.south(5).east(4); - return; } else { this.center = initial.south(5).west(4); - return; } + return; } checkPos = initial.east(10); if (this.hasPedestal(checkPos)) { @@ -422,11 +432,10 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.east(5).south(4); - return; } else { this.center = initial.east(5).north(4); - return; } + return; } checkPos = initial.west(10); if (this.hasPedestal(checkPos)) { @@ -434,46 +443,207 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.west(5).south(4); - return; } else { this.center = initial.west(5).north(4); - return; } } } - + private boolean hasPedestal(BlockPos pos) { - return world.getBlockState(pos).isOf(PEDESTAL); + return world.getBlockState(pos).is(PEDESTAL); } - + private boolean isActive(BlockPos pos) { BlockState state = world.getBlockState(pos); - if (state.isOf(PEDESTAL)) { + if (state.is(PEDESTAL)) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(pos); - if (!pedestal.hasRitual()) { - pedestal.linkRitual(this); + if (pedestal != null) { + if (!pedestal.hasRitual()) { + pedestal.linkRitual(this); + } else { + EternalRitual ritual = pedestal.getRitual(); + if (!ritual.equals(this)) { + pedestal.linkRitual(this); + } + } } - return state.get(ACTIVE); + return state.getValue(ACTIVE); } return false; } - + public CompoundTag toTag(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); - if (exit != null) { - tag.put("exit", NbtHelper.fromBlockPos(exit)); - } + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putString("axis", axis.getName()); tag.putBoolean("active", active); + if (targetWorldId != null) { + tag.putString("key_item", targetWorldId.toString()); + } + if (exit != null) { + tag.put("exit", NbtUtils.writeBlockPos(exit)); + } return tag; } - + public void fromTag(CompoundTag tag) { - this.axis = Direction.Axis.fromName(tag.getString("axis")); - this.center = NbtHelper.toBlockPos(tag.getCompound("center")); - this.active = tag.getBoolean("active"); + axis = Direction.Axis.byName(tag.getString("axis")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); + active = tag.getBoolean("active"); if (tag.contains("exit")) { - this.exit = NbtHelper.toBlockPos(tag.getCompound("exit")); + exit = NbtUtils.readBlockPos(tag.getCompound("exit")); + } + if (tag.contains("key_item")) { + targetWorldId = new ResourceLocation(tag.getString("key_item")); } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EternalRitual ritual = (EternalRitual) o; + return world.equals(ritual.world) && + Objects.equals(center, ritual.center) && + Objects.equals(exit, ritual.exit); + } + + public static void generatePortal(Level world, BlockPos center, Direction.Axis axis, int portalId) { + BlockPos framePos = center.below(); + Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; + BlockState frame = FRAME.defaultBlockState().setValue(ACTIVE, true); + FRAME_MAP.forEach(point -> { + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, frame); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, frame); + }); + BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, axis).setValue(EndPortalBlock.PORTAL, portalId); + PORTAL_MAP.forEach(point -> { + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, portal); + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, portal); + }); + generateBase(world, framePos, moveDir); + } + + private static void generateBase(Level world, BlockPos center, Direction moveX) { + BlockState base = BASE.defaultBlockState(); + Direction moveY = moveX.getClockWise(); + BASE_MAP.forEach(point -> { + BlockPos pos = center.mutable().move(moveX, point.x).move(moveY, point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, -point.x).move(moveY, point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, point.x).move(moveY, -point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, -point.x).move(moveY, -point.y); + world.setBlockAndUpdate(pos, base); + }); + } + + public static boolean checkArea(Level world, BlockPos center, Direction.Axis axis) { + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; + for (BlockPos checkPos : BlockPos.betweenClosed(center.relative(moveDir.getClockWise()), center.relative(moveDir.getCounterClockWise()))) { + for (Point point : PORTAL_MAP) { + BlockPos pos = checkPos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + BlockState state = world.getBlockState(pos); + if (isStateInvalid(state)) return false; + pos = checkPos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + state = world.getBlockState(pos); + if (isStateInvalid(state)) return false; + } + } + return true; + } + + private static boolean isStateInvalid(BlockState state) { + if (!state.getFluidState().isEmpty()) return true; + Material material = state.getMaterial(); + return !material.isReplaceable() && !material.equals(Material.PLANT); + } + + /** + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius + * @param searchBlock Target block + * @param condition Predicate for test block states in the chunk section + * + * @return Position of the first found block or null. + */ + @Nullable + public static BlockPos.MutableBlockPos findBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { + Direction moveDirection = Direction.EAST; + for (int step = 1; step < radius; step++) { + for (int i = 0; i < (step >> 1); i++) { + ChunkAccess chunk = world.getChunk(checkPos); + if (!(chunk instanceof LevelChunk) || ((LevelChunk) chunk).isEmpty()) continue; + for (LevelChunkSection section : chunk.getSections()) { + if (section == null || !section.getStates().maybeHas(condition)) continue; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for(int z = 0; z < 16; z++) { + BlockState checkState = section.getBlockState(x, y, z); + if (checkState.is(searchBlock)) { + int worldX = (chunk.getPos().x << 4) + x; + int worldY = section.bottomBlockY() + y; + int worldZ = (chunk.getPos().z << 4) + z; + checkPos.set(worldX, worldY, worldZ); + return checkPos; + } + } + } + } + } + checkPos.move(moveDirection, 16); + } + moveDirection = moveDirection.getClockWise(); + } + return null; + } + + /** + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius + * @param searchBlock Target block + * @param condition Predicate for test block states in the chunk section + * + * @return List of positions of the all found blocks or empty list. + */ + public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { + List posFound = Lists.newArrayList(); + Direction moveDirection = Direction.EAST; + for (int step = 1; step < radius; step++) { + for (int i = 0; i < (step >> 1); i++) { + ChunkAccess chunk = world.getChunk(checkPos); + if (!(chunk instanceof LevelChunk) || ((LevelChunk) chunk).isEmpty()) continue; + for (LevelChunkSection section : chunk.getSections()) { + if (section == null || !section.getStates().maybeHas(condition)) continue; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for(int z = 0; z < 16; z++) { + BlockState checkState = section.getBlockState(x, y, z); + if (checkState.is(searchBlock)) { + int worldX = (chunk.getPos().x << 4) + x; + int worldY = section.bottomBlockY() + y; + int worldZ = (chunk.getPos().z << 4) + z; + checkPos.set(worldX, worldY, worldZ); + posFound.add(checkPos.mutable()); + } + } + } + } + } + checkPos.move(moveDirection, 16); + } + moveDirection = moveDirection.getClockWise(); + } + return posFound; + } + + public static int calculateSearchSteps(int radius) { + return radius * 4 - 1; + } } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 85bb4384..edad8922 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -2,28 +2,27 @@ package ru.betterend.rituals; import java.awt.Point; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; -public class InfusionRitual implements Inventory { - private static Point[] pedestalsMap = new Point[] { +public class InfusionRitual implements Container { + private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) }; - private World world; + private Level world; private BlockPos worldPos; private InfusionRecipe activeRecipe; private boolean isDirty = false; @@ -32,23 +31,27 @@ public class InfusionRitual implements Inventory { private int time = 0; private InfusionPedestalEntity input; - private PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; + private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; - public InfusionRitual(World world, BlockPos pos) { + public InfusionRitual(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.configure(); } + public static Point[] getMap() { + return PEDESTALS_MAP; + } + public void configure() { - if (world == null || world.isClient || worldPos == null) return; + if (world == null || world.isClientSide || worldPos == null) return; BlockEntity inputEntity = world.getBlockEntity(worldPos); if (inputEntity instanceof InfusionPedestalEntity) { - this.input = (InfusionPedestalEntity) inputEntity; + input = (InfusionPedestalEntity) inputEntity; } int i = 0; - for(Point point : pedestalsMap) { - BlockPos.Mutable checkPos = worldPos.mutableCopy().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); + for(Point point : PEDESTALS_MAP) { + BlockPos.MutableBlockPos checkPos = worldPos.mutable().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; @@ -61,70 +64,69 @@ public class InfusionRitual implements Inventory { public boolean checkRecipe() { if (!isValid()) return false; - InfusionRecipe recipe = this.world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); + InfusionRecipe recipe = world.getRecipeManager().getRecipeFor(InfusionRecipe.TYPE, this, world).orElse(null); if (hasRecipe()) { if (recipe == null) { - this.stop(); + stop(); return false; } else if (recipe.getInfusionTime() != time) { - this.activeRecipe = recipe; - this.time = this.activeRecipe.getInfusionTime(); - this.progress = 0; - this.markDirty(); + activeRecipe = recipe; + time = activeRecipe.getInfusionTime(); + progress = 0; + setChanged(); } else if (activeRecipe == null) { - this.activeRecipe = recipe; + activeRecipe = recipe; } return true; } if (recipe != null) { - this.activeRecipe = recipe; - this.time = this.activeRecipe.getInfusionTime(); - this.hasRecipe = true; - this.progress = 0; - this.markDirty(); + activeRecipe = recipe; + time = activeRecipe.getInfusionTime(); + hasRecipe = true; + progress = 0; + setChanged(); return true; } return false; } public void stop() { - this.activeRecipe = null; - this.hasRecipe = false; - this.progress = 0; - this.time = 0; - this.markDirty(); + activeRecipe = null; + hasRecipe = false; + progress = 0; + time = 0; + setChanged(); } public void tick() { if (isDirty) { - this.configure(); - this.isDirty = false; + configure(); + isDirty = false; } if (!isValid() || !hasRecipe()) return; if (!checkRecipe()) return; - this.progress++; + progress++; if (progress == time) { - BlockState inputState = world.getBlockState(input.getPos()); - this.input.removeStack(world, inputState); - this.input.setStack(0, activeRecipe.craft(this)); + input.removeItemNoUpdate(0); + input.setItem(0, activeRecipe.assemble(this)); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.removeStack(world, world.getBlockState(catalyst.getPos())); + catalyst.removeItemNoUpdate(0); } - this.stop(); + stop(); } else { - ServerWorld world = (ServerWorld) this.world; - BlockPos target = this.worldPos.up(); + ServerLevel world = (ServerLevel) this.world; + BlockPos target = worldPos.above(); double tx = target.getX() + 0.5; double ty = target.getY() + 0.5; double tz = target.getZ() + 0.5; for (PedestalBlockEntity catalyst : catalysts) { - ItemStack stack = catalyst.getStack(0); + ItemStack stack = catalyst.getItem(0); if (!stack.isEmpty()) { - BlockPos start = catalyst.getPos(); + BlockPos start = catalyst.getBlockPos(); double sx = start.getX() + 0.5; double sy = start.getY() + 1.25; double sz = start.getZ() + 0.5; - world.spawnParticles(new InfusionParticleType(stack), sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.5); + world.sendParticles(new InfusionParticleType(stack), sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.5); } } } @@ -132,12 +134,12 @@ public class InfusionRitual implements Inventory { } @Override - public boolean isValid(int slot, ItemStack stack) { - return this.isValid(); + public boolean canPlaceItem(int slot, ItemStack stack) { + return isValid(); } public boolean isValid() { - if (world == null || world.isClient || worldPos == null || input == null) return false; + if (world == null || world.isClientSide || worldPos == null || input == null) return false; for (PedestalBlockEntity catalyst : catalysts) { if (catalyst == null) return false; } @@ -145,26 +147,26 @@ public class InfusionRitual implements Inventory { } public boolean hasRecipe() { - return this.hasRecipe; + return hasRecipe; } - public void setLocation(World world, BlockPos pos) { + public void setLocation(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.isDirty = true; } @Override - public void clear() { + public void clearContent() { if (!isValid()) return; - this.input.clear(); + input.clearContent(); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.clear(); + catalyst.clearContent(); } } @Override - public int size() { + public int getContainerSize() { return 9; } @@ -174,66 +176,66 @@ public class InfusionRitual implements Inventory { } @Override - public ItemStack getStack(int slot) { + public ItemStack getItem(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return this.input.getStack(0); + return input.getItem(0); } else { - return this.catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].getItem(0); } } @Override - public ItemStack removeStack(int slot, int amount) { - return this.removeStack(slot); + public ItemStack removeItem(int slot, int amount) { + return removeItemNoUpdate(slot); } @Override - public ItemStack removeStack(int slot) { + public ItemStack removeItemNoUpdate(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return this.input.removeStack(0); + return input.removeItemNoUpdate(0); } else { - return this.catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].removeItemNoUpdate(0); } } @Override - public void setStack(int slot, ItemStack stack) { + public void setItem(int slot, ItemStack stack) { if (slot > 8) return; if (slot == 0) { - this.input.setStack(0, stack); + input.setItem(0, stack); } else { - this.catalysts[slot - 1].setStack(0, stack); + catalysts[slot - 1].setItem(0, stack); } } @Override - public void markDirty() { + public void setChanged() { if (isValid()) { - this.input.markDirty(); + input.setChanged(); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.markDirty(); + catalyst.setChanged(); } } } @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean stillValid(Player player) { return true; } public void fromTag(CompoundTag tag) { if (tag.contains("recipe")) { - this.hasRecipe = tag.getBoolean("recipe"); - this.progress = tag.getInt("progress"); - this.time = tag.getInt("time"); + hasRecipe = tag.getBoolean("recipe"); + progress = tag.getInt("progress"); + time = tag.getInt("time"); } } public CompoundTag toTag(CompoundTag tag) { if (hasRecipe()) { - tag.putBoolean("recipe", this.hasRecipe); + tag.putBoolean("recipe", hasRecipe); tag.putInt("progress", progress); tag.putInt("time", time); } diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index 48601843..518925f7 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -1,16 +1,16 @@ package ru.betterend.tab; import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class CreativeTabs { - public static final ItemGroup TAB_BLOCKS; - public static final ItemGroup TAB_ITEMS; + public static final CreativeModeTab TAB_BLOCKS; + public static final CreativeModeTab TAB_ITEMS; static { TAB_BLOCKS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_blocks")) @@ -25,9 +25,5 @@ public class CreativeTabs { stacks.add(new ItemStack(i)); } }).build(); - if (BetterEnd.isDevEnvironment()) { - System.out.println("CREATIVE_TAB_ITEMS: " + TAB_ITEMS.getName()); - System.out.println("CREATIVE_TAB_BLOCKS: " + TAB_BLOCKS.getName()); - } } } diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index f49c5c21..62b5eeaa 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -2,34 +2,38 @@ package ru.betterend.util; import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Random; import java.util.Set; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FallingBlock; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Property; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.BlockBlueVine; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockVine; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.Property; +import ru.betterend.blocks.BlueVineBlock; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.StalactiteBlock; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; public class BlocksHelper { - public static final BooleanProperty ROOTS = BooleanProperty.of("roots"); + public static final BooleanProperty ROOTS = BooleanProperty.create("roots"); + private static final Map COLOR_BY_BLOCK = Maps.newHashMap(); public static final int FLAG_UPDATE_BLOCK = 1; public static final int FLAG_SEND_CLIENT_CHANGES = 2; @@ -42,9 +46,9 @@ public class BlocksHelper { public static final Direction[] HORIZONTAL = makeHorizontal(); public static final Direction[] DIRECTIONS = Direction.values(); - private static final Mutable POS = new Mutable(); - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - protected static final BlockState WATER = Blocks.WATER.getDefaultState(); + private static final MutableBlockPos POS = new MutableBlockPos(); + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); private static final Vec3i[] OFFSETS = new Vec3i[] { new Vec3i(-1, -1, -1), new Vec3i(-1, -1, 0), new Vec3i(-1, -1, 1), @@ -59,38 +63,46 @@ public class BlocksHelper { new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), new Vec3i(1, 0, 1), new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) }; - - public static void setWithoutUpdate(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, state, SET_SILENT); + + public static void addBlockColor(Block block, int color) { + COLOR_BY_BLOCK.put(block, color); } - public static void setWithoutUpdate(WorldAccess world, BlockPos pos, Block block) { - world.setBlockState(pos, block.getDefaultState(), SET_SILENT); - } - - public static void setWithUpdate(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, state, SET_OBSERV); - } - - public static void setWithUpdate(WorldAccess world, BlockPos pos, Block block) { - world.setBlockState(pos, block.getDefaultState(), SET_OBSERV); + public static int getBlockColor(Block block) { + return COLOR_BY_BLOCK.getOrDefault(block, 0xFF000000); } - public static int upRay(WorldAccess world, BlockPos pos, int maxDist) { + public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlock(pos, state, SET_SILENT); + } + + public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, Block block) { + world.setBlock(pos, block.defaultBlockState(), SET_SILENT); + } + + public static void setWithUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlock(pos, state, SET_OBSERV); + } + + public static void setWithUpdate(LevelAccessor world, BlockPos pos, Block block) { + world.setBlock(pos, block.defaultBlockState(), SET_OBSERV); + } + + public static int upRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; - for (int j = 1; j < maxDist && (world.isAir(pos.up(j))); j++) + for (int j = 1; j < maxDist && (world.isEmptyBlock(pos.above(j))); j++) length++; return length; } - public static int downRay(WorldAccess world, BlockPos pos, int maxDist) { + public static int downRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; - for (int j = 1; j < maxDist && (world.isAir(pos.down(j))); j++) + for (int j = 1; j < maxDist && (world.isEmptyBlock(pos.below(j))); j++) length++; return length; } - public static int downRayRep(WorldAccess world, BlockPos pos, int maxDist) { + public static int downRayRep(LevelAccessor world, BlockPos pos, int maxDist) { POS.set(pos); for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { @@ -99,31 +111,31 @@ public class BlocksHelper { return pos.getY() - POS.getY(); } - public static int raycastSqr(WorldAccess world, BlockPos pos, int dx, int dy, int dz, int maxDist) { + public static int raycastSqr(LevelAccessor world, BlockPos pos, int dx, int dy, int dz, int maxDist) { POS.set(pos); for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { POS.move(dx, dy, dz); } - return (int) pos.getSquaredDistance(POS); + return (int) pos.distSqr(POS); } - public static BlockState rotateHorizontal(BlockState state, BlockRotation rotation, Property facing) { - return (BlockState) state.with(facing, rotation.rotate((Direction) state.get(facing))); + public static BlockState rotateHorizontal(BlockState state, Rotation rotation, Property facing) { + return state.setValue(facing, rotation.rotate(state.getValue(facing))); } - public static BlockState mirrorHorizontal(BlockState state, BlockMirror mirror, Property facing) { - return state.rotate(mirror.getRotation((Direction) state.get(facing))); + public static BlockState mirrorHorizontal(BlockState state, Mirror mirror, Property facing) { + return state.rotate(mirror.getRotation(state.getValue(facing))); } - public static int getLengthDown(WorldAccess world, BlockPos pos, Block block) { + public static int getLengthDown(LevelAccessor world, BlockPos pos, Block block) { int count = 1; - while (world.getBlockState(pos.down(count)).getBlock() == block) + while (world.getBlockState(pos.below(count)).getBlock() == block) count++; return count; } - public static void cover(WorldAccess world, BlockPos center, Block ground, BlockState cover, int radius, Random random) { + public static void cover(LevelAccessor world, BlockPos center, Block ground, BlockState cover, int radius, Random random) { HashSet points = new HashSet(); HashSet points2 = new HashSet(); if (world.getBlockState(center).getBlock() == ground) { @@ -135,7 +147,7 @@ public class BlocksHelper { BlockPos pos = iterator.next(); for (Vec3i offset : OFFSETS) { if (random.nextBoolean()) { - BlockPos pos2 = pos.add(offset); + BlockPos pos2 = pos.offset(offset); if (random.nextBoolean() && world.getBlockState(pos2).getBlock() == ground && !points.contains(pos2)) points2.add(pos2); @@ -153,7 +165,7 @@ public class BlocksHelper { } } - public static void fixBlocks(WorldAccess world, BlockPos start, BlockPos end) { + public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { BlockState state; Set doubleCheck = Sets.newHashSet(); for (int x = start.getX(); x <= end.getX(); x++) { @@ -164,16 +176,16 @@ public class BlocksHelper { POS.setY(y); state = world.getBlockState(POS); - if (state.getBlock() instanceof BlockFur) { - doubleCheck.add(POS.toImmutable()); + if (state.getBlock() instanceof FurBlock) { + doubleCheck.add(POS.immutable()); } // Liquids else if (!state.getFluidState().isEmpty()) { - if (!state.canPlaceAt(world, POS)) { + if (!state.canSurvive(world, POS)) { setWithoutUpdate(world, POS, WATER); POS.setY(POS.getY() - 1); state = world.getBlockState(POS); - while (!state.canPlaceAt(world, POS)) { + while (!state.canSurvive(world, POS)) { state = state.getFluidState().isEmpty() ? AIR : WATER; setWithoutUpdate(world, POS, state); POS.setY(POS.getY() - 1); @@ -181,7 +193,7 @@ public class BlocksHelper { } } POS.setY(y - 1); - if (world.isAir(POS)) { + if (world.isEmptyBlock(POS)) { POS.setY(y); while (!world.getFluidState(POS).isEmpty()) { setWithoutUpdate(world, POS, AIR); @@ -190,32 +202,66 @@ public class BlocksHelper { continue; } for (Direction dir : HORIZONTAL) { - if (world.isAir(POS.offset(dir))) { - world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0); + if (world.isEmptyBlock(POS.relative(dir))) { + world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); break; } } } - else if (!state.canPlaceAt(world, POS)) { + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(POS.getY() + 1); + while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canSurvive(world, POS)) { + if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + else { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + } + } + } + } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(world, POS, AIR); + } + } + else if (!state.canSurvive(world, POS)) { // Chorus - if (state.isOf(Blocks.CHORUS_PLANT)) { + if (state.is(Blocks.CHORUS_PLANT)) { Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); - ends.add(POS.toImmutable()); + ends.add(POS.immutable()); for (int i = 0; i < 64 && !ends.isEmpty(); i++) { ends.forEach((pos) -> { setWithoutUpdate(world, pos, AIR); for (Direction dir : HORIZONTAL) { - BlockPos p = pos.offset(dir); + BlockPos p = pos.relative(dir); BlockState st = world.getBlockState(p); - if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { add.add(p); } } - BlockPos p = pos.up(); + BlockPos p = pos.above(); BlockState st = world.getBlockState(p); - if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { add.add(p); } }); @@ -225,8 +271,8 @@ public class BlocksHelper { } } // Vines - else if (state.getBlock() instanceof BlockVine) { - while (world.getBlockState(POS).getBlock() instanceof BlockVine) { + else if (state.getBlock() instanceof VineBlock) { + while (world.getBlockState(POS).getBlock() instanceof VineBlock) { setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() - 1); } @@ -238,20 +284,20 @@ public class BlocksHelper { POS.setY(POS.getY() - 1); state = world.getBlockState(POS); - int ray = downRayRep(world, POS.toImmutable(), 64); + int ray = downRayRep(world, POS.immutable(), 64); if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); if (world.getRandom().nextBoolean()) { POS.setY(POS.getY() - 1); state = world.getBlockState(POS); - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); } } else { POS.setY(y); BlockState replacement = AIR; for (Direction dir : HORIZONTAL) { - state = world.getBlockState(POS.offset(dir)); + state = world.getBlockState(POS.relative(dir)); if (!state.getFluidState().isEmpty()) { replacement = state; break; @@ -265,15 +311,15 @@ public class BlocksHelper { // Blocks without support else { // Blue Vine - if (state.getBlock() instanceof BlockBlueVine) { - while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) { + if (state.getBlock() instanceof BlueVineBlock) { + while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); state = world.getBlockState(POS); } } // Double plants - if (state.getBlock() instanceof BlockDoublePlant) { + if (state.getBlock() instanceof DoublePlantBlock) { BlocksHelper.setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); BlocksHelper.setWithoutUpdate(world, POS, AIR); @@ -289,18 +335,18 @@ public class BlocksHelper { } doubleCheck.forEach((pos) -> { - if (!world.getBlockState(pos).canPlaceAt(world, pos)) { + if (!world.getBlockState(pos).canSurvive(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); } }); } private static BlockState getAirOrFluid(BlockState state) { - return state.getFluidState().isEmpty() ? AIR : state.getFluidState().getBlockState(); + return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } public static boolean isEndNylium(Block block) { - return block.isIn(BlockTags.NYLIUM) && block.isIn(EndTags.END_GROUND); + return block.is(BlockTags.NYLIUM) && block.is(EndTags.END_GROUND); } public static boolean isEndNylium(BlockState state) { @@ -318,4 +364,8 @@ public class BlocksHelper { public static Direction randomDirection(Random random) { return DIRECTIONS[random.nextInt(6)]; } + + public static boolean isFluid(BlockState blockState) { + return !blockState.getFluidState().isEmpty(); + } } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java new file mode 100644 index 00000000..2229d089 --- /dev/null +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -0,0 +1,152 @@ +package ru.betterend.util; + +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndBlocks; +import ru.betterend.world.biome.EndBiome; + +public class BonemealUtil { + private static final Map> GRASS_BIOMES = Maps.newHashMap(); + private static final Map GRASS_TYPES = Maps.newHashMap(); + + public static void init() { + addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS); + addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.CREEPING_MOSS); + addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.UMBRELLA_MOSS); + + addBonemealGrass(EndBlocks.CAVE_MOSS, EndBlocks.CAVE_GRASS); + addBonemealGrass(EndBlocks.CHORUS_NYLIUM, EndBlocks.CHORUS_GRASS); + addBonemealGrass(EndBlocks.CRYSTAL_MOSS, EndBlocks.CRYSTAL_GRASS); + addBonemealGrass(EndBlocks.SHADOW_GRASS, EndBlocks.SHADOW_PLANT); + addBonemealGrass(EndBlocks.PINK_MOSS, EndBlocks.BUSHY_GRASS); + addBonemealGrass(EndBlocks.AMBER_MOSS, EndBlocks.AMBER_GRASS); + + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); + + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.BLOOMING_COOKSONIA); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.VAIOLUSH_FERN); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.FRACTURN); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.SALTEAGO); + + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); + + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.ORANGO); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); + + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + } + + public static void addBonemealGrass(Block terrain, Block plant) { + addBonemealGrass(terrain, plant, 1F); + } + + public static void addBonemealGrass(Block terrain, Block plant, float chance) { + GrassList list = GRASS_TYPES.get(terrain); + if (list == null) { + list = new GrassList(); + GRASS_TYPES.put(terrain, list); + } + list.addGrass(plant, chance); + } + + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant) { + addBonemealGrass(biome, terrain, plant, 1F); + } + + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant, float chance) { + Map map = GRASS_BIOMES.get(biome.getID()); + if (map == null) { + map = Maps.newHashMap(); + GRASS_BIOMES.put(biome.getID(), map); + } + GrassList list = map.get(terrain); + if (list == null) { + list = new GrassList(); + map.put(terrain, list); + } + list.addGrass(plant, chance); + } + + public static Block getGrass(ResourceLocation biomeID, Block terrain, Random random) { + Map map = GRASS_BIOMES.get(biomeID); + GrassList list = null; + if (map != null) { + list = map.get(terrain); + if (list == null) { + list = GRASS_TYPES.get(terrain); + } + } + else { + list = GRASS_TYPES.get(terrain); + } + return list == null ? null : list.getGrass(random); + } + + private static final class GrassInfo { + final Block grass; + float chance; + + public GrassInfo(Block grass, float chance) { + this.grass = grass; + this.chance = chance; + } + + public float addChance(float chance) { + this.chance += chance; + return this.chance; + } + } + + private static final class GrassList { + final List list = Lists.newArrayList(); + float maxChance = 0; + + public void addGrass(Block grass, float chance) { + GrassInfo info = new GrassInfo(grass, chance); + maxChance = info.addChance(maxChance); + list.add(info); + } + + public Block getGrass(Random random) { + if (maxChance == 0 || list.isEmpty()) { + return null; + } + float chance = random.nextFloat() * maxChance; + for (GrassInfo info: list) { + if (chance <= info.chance) { + return info.grass; + } + } + return null; + } + } +} diff --git a/src/main/java/ru/betterend/util/ColorUtil.java b/src/main/java/ru/betterend/util/ColorUtil.java index 83ff6882..2ea3523a 100644 --- a/src/main/java/ru/betterend/util/ColorUtil.java +++ b/src/main/java/ru/betterend/util/ColorUtil.java @@ -1,241 +1,241 @@ -package ru.betterend.util; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.google.common.collect.Maps; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; -import ru.betterend.BetterEnd; - -@Environment(EnvType.CLIENT) -public class ColorUtil { - - private static float[] floatBuffer = new float[4]; - - public static int[] toIntArray(int color) { - return new int[] { - (color >> 24) & 255, - (color >> 16) & 255, - (color >> 8) & 255, - color & 255 - }; - } - - public static float[] toFloatArray(int color) { - floatBuffer[0] = ((color >> 16 & 255) / 255.0F); - floatBuffer[1] = ((color >> 8 & 255) / 255.0F); - floatBuffer[2] = ((color & 255) / 255.0F); - floatBuffer[3] = ((color >> 24 & 255) / 255.0F); - - return floatBuffer; - } - - public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { - float hue, saturation, brightness; - if (hsbvals == null) { - hsbvals = floatBuffer; - } - int cmax = (r > g) ? r : g; - if (b > cmax) cmax = b; - int cmin = (r < g) ? r : g; - if (b < cmin) cmin = b; - - brightness = ((float) cmax) / 255.0F; - if (cmax != 0) - saturation = ((float) (cmax - cmin)) / ((float) cmax); - else - saturation = 0; - if (saturation == 0) - hue = 0; - else { - float redc = ((float) (cmax - r)) / ((float) (cmax - cmin)); - float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin)); - float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin)); - if (r == cmax) - hue = bluec - greenc; - else if (g == cmax) - hue = 2.0F + redc - bluec; - else - hue = 4.0F + greenc - redc; - hue = hue / 6.0F; - if (hue < 0) - hue = hue + 1.0F; - } - hsbvals[0] = hue; - hsbvals[1] = saturation; - hsbvals[2] = brightness; - return hsbvals; - } - - public static int HSBtoRGB(float hue, float saturation, float brightness) { - int r = 0, g = 0, b = 0; - if (saturation == 0) { - r = g = b = (int) (brightness * 255.0F + 0.5F); - } else { - float h = (hue - (float)Math.floor(hue)) * 6.0F; - float f = h - (float)java.lang.Math.floor(h); - float p = brightness * (1.0F - saturation); - float q = brightness * (1.0F - saturation * f); - float t = brightness * (1.0F - (saturation * (1.0F - f))); - switch ((int) h) { - case 0: - r = (int) (brightness * 255.0F + 0.5F); - g = (int) (t * 255.0F + 0.5F); - b = (int) (p * 255.0F + 0.5F); - break; - case 1: - r = (int) (q * 255.0F + 0.5F); - g = (int) (brightness * 255.0F + 0.5F); - b = (int) (p * 255.0F + 0.5F); - break; - case 2: - r = (int) (p * 255.0F + 0.5F); - g = (int) (brightness * 255.0F + 0.5F); - b = (int) (t * 255.0F + 0.5F); - break; - case 3: - r = (int) (p * 255.0F + 0.5F); - g = (int) (q * 255.0F + 0.5F); - b = (int) (brightness * 255.0F + 0.5F); - break; - case 4: - r = (int) (t * 255.0F + 0.5F); - g = (int) (p * 255.0F + 0.5F); - b = (int) (brightness * 255.0F + 0.5F); - break; - case 5: - r = (int) (brightness * 255.0F + 0.5F); - g = (int) (p * 255.0F + 0.5F); - b = (int) (q * 255.0F + 0.5F); - break; - } - } - return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); - } - - public static int parseHex(String hexColor) { - int len = hexColor.length(); - if (len < 6 || len > 8 || len % 2 > 0) { - return -1; - } - - int color, shift; - if(len == 6) { - color = 0xFF000000; shift = 16; - } else { - color = 0; shift = 24; - } - - try { - String[] splited = hexColor.split("(?<=\\G.{2})"); - for (String digit : splited) { - color |= Integer.valueOf(digit, 16) << shift; - shift -= 8; - } - } catch(NumberFormatException ex) { - BetterEnd.LOGGER.catching(ex); - return -1; - } - - return color; - } - - public static int toABGR(int color) { - int r = (color >> 16) & 255; - int g = (color >> 8) & 255; - int b = color & 255; - return 0xFF000000 | b << 16 | g << 8 | r; - } - - public static int ABGRtoARGB(int color) { - int a = (color >> 24) & 255; - int b = (color >> 16) & 255; - int g = (color >> 8) & 255; - int r = color & 255; - return a << 24 | r << 16 | g << 8 | b; - } - - public static int colorBrigtness(int color, float val) { - RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); - floatBuffer[2] += val / 10.0F; - floatBuffer[2] = MathHelper.clamp(floatBuffer[2], 0.0F, 1.0F); - return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); - } - - public static int applyTint(int color, int tint) { - return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); - } - - public static int colorDistance(int color1, int color2) { - int r1 = (color1 >> 16) & 255; - int g1 = (color1 >> 8) & 255; - int b1 = color1 & 255; - int r2 = (color2 >> 16) & 255; - int g2 = (color2 >> 8) & 255; - int b2 = color2 & 255; - return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); - } - - private static Map colorPalette = Maps.newHashMap(); - - public static int extractColor(Item item) { - Identifier id = Registry.ITEM.getId(item); - if (id.equals(Registry.ITEM.getDefaultId())) return -1; - if (colorPalette.containsKey(id)) { - return colorPalette.get(id); - } - Identifier texture; - if (item instanceof BlockItem) { - texture = new Identifier(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); - } else { - texture = new Identifier(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); - } - NativeImage image = loadImage(texture, 16, 16); - List colors = new ArrayList<>(); - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < 16; j++) { - int col = image.getPixelColor(i, j); - if (((col >> 24) & 255) > 0) { - colors.add(ABGRtoARGB(col)); - } - } - } - image.close(); - - if (colors.size() == 0) return -1; - - ColorExtractor extractor = new ColorExtractor(colors); - int color = extractor.analize(); - colorPalette.put(id, color); - - return color; - } - - public static NativeImage loadImage(Identifier image, int w, int h) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - ResourceManager resourceManager = minecraft.getResourceManager(); - if (resourceManager.containsResource(image)) { - try (Resource resource = resourceManager.getResource(image)) { - return NativeImage.read(resource.getInputStream()); - } catch (IOException e) { - BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); - BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); - } - } - return new NativeImage(w, h, false); - } +package ru.betterend.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.NativeImage; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.Mth; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import ru.betterend.BetterEnd; + +@Environment(EnvType.CLIENT) +public class ColorUtil { + + private static float[] floatBuffer = new float[4]; + + public static int[] toIntArray(int color) { + return new int[] { + (color >> 24) & 255, + (color >> 16) & 255, + (color >> 8) & 255, + color & 255 + }; + } + + public static float[] toFloatArray(int color) { + floatBuffer[0] = ((color >> 16 & 255) / 255.0F); + floatBuffer[1] = ((color >> 8 & 255) / 255.0F); + floatBuffer[2] = ((color & 255) / 255.0F); + floatBuffer[3] = ((color >> 24 & 255) / 255.0F); + + return floatBuffer; + } + + public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { + float hue, saturation, brightness; + if (hsbvals == null) { + hsbvals = floatBuffer; + } + int cmax = (r > g) ? r : g; + if (b > cmax) cmax = b; + int cmin = (r < g) ? r : g; + if (b < cmin) cmin = b; + + brightness = ((float) cmax) / 255.0F; + if (cmax != 0) + saturation = ((float) (cmax - cmin)) / ((float) cmax); + else + saturation = 0; + if (saturation == 0) + hue = 0; + else { + float redc = ((float) (cmax - r)) / ((float) (cmax - cmin)); + float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin)); + float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin)); + if (r == cmax) + hue = bluec - greenc; + else if (g == cmax) + hue = 2.0F + redc - bluec; + else + hue = 4.0F + greenc - redc; + hue = hue / 6.0F; + if (hue < 0) + hue = hue + 1.0F; + } + hsbvals[0] = hue; + hsbvals[1] = saturation; + hsbvals[2] = brightness; + return hsbvals; + } + + public static int HSBtoRGB(float hue, float saturation, float brightness) { + int r = 0, g = 0, b = 0; + if (saturation == 0) { + r = g = b = (int) (brightness * 255.0F + 0.5F); + } else { + float h = (hue - (float)Math.floor(hue)) * 6.0F; + float f = h - (float)java.lang.Math.floor(h); + float p = brightness * (1.0F - saturation); + float q = brightness * (1.0F - saturation * f); + float t = brightness * (1.0F - (saturation * (1.0F - f))); + switch ((int) h) { + case 0: + r = (int) (brightness * 255.0F + 0.5F); + g = (int) (t * 255.0F + 0.5F); + b = (int) (p * 255.0F + 0.5F); + break; + case 1: + r = (int) (q * 255.0F + 0.5F); + g = (int) (brightness * 255.0F + 0.5F); + b = (int) (p * 255.0F + 0.5F); + break; + case 2: + r = (int) (p * 255.0F + 0.5F); + g = (int) (brightness * 255.0F + 0.5F); + b = (int) (t * 255.0F + 0.5F); + break; + case 3: + r = (int) (p * 255.0F + 0.5F); + g = (int) (q * 255.0F + 0.5F); + b = (int) (brightness * 255.0F + 0.5F); + break; + case 4: + r = (int) (t * 255.0F + 0.5F); + g = (int) (p * 255.0F + 0.5F); + b = (int) (brightness * 255.0F + 0.5F); + break; + case 5: + r = (int) (brightness * 255.0F + 0.5F); + g = (int) (p * 255.0F + 0.5F); + b = (int) (q * 255.0F + 0.5F); + break; + } + } + return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); + } + + public static int parseHex(String hexColor) { + int len = hexColor.length(); + if (len < 6 || len > 8 || len % 2 > 0) { + return -1; + } + + int color, shift; + if(len == 6) { + color = 0xFF000000; shift = 16; + } else { + color = 0; shift = 24; + } + + try { + String[] splited = hexColor.split("(?<=\\G.{2})"); + for (String digit : splited) { + color |= Integer.valueOf(digit, 16) << shift; + shift -= 8; + } + } catch(NumberFormatException ex) { + BetterEnd.LOGGER.catching(ex); + return -1; + } + + return color; + } + + public static int toABGR(int color) { + int r = (color >> 16) & 255; + int g = (color >> 8) & 255; + int b = color & 255; + return 0xFF000000 | b << 16 | g << 8 | r; + } + + public static int ABGRtoARGB(int color) { + int a = (color >> 24) & 255; + int b = (color >> 16) & 255; + int g = (color >> 8) & 255; + int r = color & 255; + return a << 24 | r << 16 | g << 8 | b; + } + + public static int colorBrigtness(int color, float val) { + RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); + floatBuffer[2] += val / 10.0F; + floatBuffer[2] = Mth.clamp(floatBuffer[2], 0.0F, 1.0F); + return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); + } + + public static int applyTint(int color, int tint) { + return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); + } + + public static int colorDistance(int color1, int color2) { + int r1 = (color1 >> 16) & 255; + int g1 = (color1 >> 8) & 255; + int b1 = color1 & 255; + int r2 = (color2 >> 16) & 255; + int g2 = (color2 >> 8) & 255; + int b2 = color2 & 255; + return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); + } + + private static Map colorPalette = Maps.newHashMap(); + + public static int extractColor(Item item) { + ResourceLocation id = Registry.ITEM.getKey(item); + if (id.equals(Registry.ITEM.getDefaultKey())) return -1; + if (colorPalette.containsKey(id)) { + return colorPalette.get(id); + } + ResourceLocation texture; + if (item instanceof BlockItem) { + texture = new ResourceLocation(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); + } else { + texture = new ResourceLocation(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); + } + NativeImage image = loadImage(texture, 16, 16); + List colors = new ArrayList<>(); + for (int i = 0; i < image.getWidth(); i++) { + for (int j = 0; j < 16; j++) { + int col = image.getPixelRGBA(i, j); + if (((col >> 24) & 255) > 0) { + colors.add(ABGRtoARGB(col)); + } + } + } + image.close(); + + if (colors.size() == 0) return -1; + + ColorExtractor extractor = new ColorExtractor(colors); + int color = extractor.analize(); + colorPalette.put(id, color); + + return color; + } + + public static NativeImage loadImage(ResourceLocation image, int w, int h) { + Minecraft minecraft = Minecraft.getInstance(); + ResourceManager resourceManager = minecraft.getResourceManager(); + if (resourceManager.hasResource(image)) { + try (Resource resource = resourceManager.getResource(image)) { + return NativeImage.read(resource.getInputStream()); + } catch (IOException e) { + BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); + BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); + } + } + return new NativeImage(w, h, false); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java new file mode 100644 index 00000000..39748815 --- /dev/null +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -0,0 +1,94 @@ +package ru.betterend.util; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.storage.RegionFile; + +public class DataFixerUtil { + private static final Map REPLACEMENT = Maps.newHashMap(); + + public static void init() { + //addFix("minecraft:stone", "minecraft:glowstone"); // Example + } + + public static void fixData(File dir) { + if (REPLACEMENT.isEmpty()) { + return; + } + + List regions = getAllRegions(dir, null); + regions.parallelStream().forEach((file) -> { + try { + System.out.println("Fixing " + file); + boolean[] changed = new boolean[1]; + RegionFile region = new RegionFile(file, file.getParentFile(), true); + for (int x = 0; x < 32; x++) { + for (int z = 0; z < 32; z++) { + ChunkPos pos = new ChunkPos(x, z); + changed[0] = false; + if (region.hasChunk(pos)) { + DataInputStream input = region.getChunkDataInputStream(pos); + CompoundTag root = NbtIo.read(input); + input.close(); + ListTag sections = root.getCompound("Level").getList("Sections", 10); + sections.forEach((tag) -> { + ListTag palette = ((CompoundTag) tag).getList("Palette", 10); + palette.forEach((blockTag) -> { + CompoundTag blockTagCompound = ((CompoundTag) blockTag); + String name = blockTagCompound.getString("Name"); + String replace = REPLACEMENT.get(name); + if (replace != null) { + blockTagCompound.putString("Name", replace); + changed[0] = true; + } + }); + }); + if (changed[0]) { + System.out.println("Write!"); + DataOutputStream output = region.getChunkDataOutputStream(pos); + NbtIo.write(root, output); + output.close(); + } + } + } + } + region.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + }); + } + + protected static void addFix(String result, String... names) { + for (String name: names) { + REPLACEMENT.put(name, result); + } + } + + private static List getAllRegions(File dir, List list) { + if (list == null) { + list = Lists.newArrayList(); + } + for (File file: dir.listFiles()) { + if (file.isDirectory()) { + getAllRegions(file, list); + } + else if (file.isFile() && file.getName().endsWith(".mca")) { + list.add(file); + } + } + return list; + } +} diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index f856e90a..d2b9658c 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -8,11 +8,11 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; -import ru.betterend.mixin.common.GenerationSettingsAccessor; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; @@ -21,20 +21,20 @@ public class FeaturesHelper { public static void addFeatures(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Biome.Category.THEEND && !INJECTED.contains(biome)) { - GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.getStructures()); - List>>> preFeatures = accessor.getFeatures(); + if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND && !INJECTED.contains(biome)) { + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> structures = Lists.newArrayList(accessor.be_getStructures()); + List>>> preFeatures = accessor.be_getFeatures(); List>>> features = new ArrayList>>>(preFeatures.size()); preFeatures.forEach((list) -> { features.add(Lists.newArrayList(list)); }); - EndFeatures.registerBiomeFeatures(biomeRegistry.getId(biome), biome, features); - EndStructures.registerBiomeStructures(biomeRegistry.getId(biome), biome, structures); + EndFeatures.registerBiomeFeatures(biomeRegistry.getKey(biome), biome, features); + EndStructures.registerBiomeStructures(biomeRegistry.getKey(biome), biome, structures); - accessor.setFeatures(features); - accessor.setStructures(structures); + accessor.be_setFeatures(features); + accessor.be_setStructures(structures); INJECTED.add(biome); } }); diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java new file mode 100644 index 00000000..20f57987 --- /dev/null +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -0,0 +1,73 @@ +package ru.betterend.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.gson.JsonObject; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import ru.betterend.BetterEnd; + +public class ItemUtil { + + public static String toStackString(@NotNull ItemStack stack) { + try { + if (stack == null) { + throw new IllegalStateException("Stack can't be null!"); + } + Item item = stack.getItem(); + return Registry.ITEM.getKey(item) + ":" + stack.getCount(); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack serialization error!", ex); + } + return ""; + } + + @Nullable + public static ItemStack fromStackString(String stackString) { + if (stackString == null || stackString.equals("")) { + return null; + } + try { + String[] parts = stackString.split(":"); + if (parts.length < 2) return null; + if (parts.length == 2) { + ResourceLocation itemId = new ResourceLocation(stackString); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + return new ItemStack(item); + } + ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + return new ItemStack(item, Integer.valueOf(parts[2])); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); + } + return null; + } + + @Nullable + public static ItemStack fromJsonRecipe(JsonObject recipe) { + try { + if (!recipe.has("item")) { + throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); + } + ResourceLocation itemId = new ResourceLocation(GsonHelper.getAsString(recipe, "item")); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + int count = GsonHelper.getAsInt(recipe, "count", 1); + return new ItemStack(item, count); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); + } + return null; + } +} diff --git a/src/main/java/ru/betterend/util/JsonFactory.java b/src/main/java/ru/betterend/util/JsonFactory.java index 355f4fa1..c3f24b22 100644 --- a/src/main/java/ru/betterend/util/JsonFactory.java +++ b/src/main/java/ru/betterend/util/JsonFactory.java @@ -69,6 +69,11 @@ public class JsonFactory { } } + public static int getInt(JsonObject object, String member, int def) { + JsonElement elem = object.get(member); + return elem == null ? def : elem.getAsInt(); + } + public static float getFloat(JsonObject object, String member, float def) { JsonElement elem = object.get(member); return elem == null ? def : elem.getAsFloat(); diff --git a/src/main/java/ru/betterend/util/LangUtil.java b/src/main/java/ru/betterend/util/LangUtil.java index a5767bf2..bc051bf8 100644 --- a/src/main/java/ru/betterend/util/LangUtil.java +++ b/src/main/java/ru/betterend/util/LangUtil.java @@ -1,7 +1,7 @@ package ru.betterend.util; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.TranslatableText; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.TranslatableComponent; public class LangUtil { public final static String CONFIG_ELEMENT = "configuration"; @@ -20,19 +20,19 @@ public class LangUtil { return getString(element, key); } - public TranslatableText getText(String key) { + public TranslatableComponent getText(String key) { return getText(element, key); } public static String translate(String key) { - return I18n.translate(key); + return I18n.get(key); } public static String getString(String element, String key) { return translate(String.format("%s.%s", element, key)); } - public static TranslatableText getText(String element, String key) { - return new TranslatableText(getString(element, key)); + public static TranslatableComponent getText(String element, String key) { + return new TranslatableComponent(getString(element, key)); } } diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java new file mode 100644 index 00000000..c3867a2c --- /dev/null +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -0,0 +1,27 @@ +package ru.betterend.util; + +import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; +import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.RandomValueBounds; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import ru.betterend.registry.EndItems; + +public class LootTableUtil { + private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); + + public static void init() { + LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { + if (END_CITY_TREASURE_ID.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(RandomValueBounds.between(0, 5)); + builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); + builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); + supplier.withPool(builder); + } + }); + } +} diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3b6aa1a7..d406d2a7 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -2,7 +2,10 @@ package ru.betterend.util; import java.util.Random; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; + +import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); @@ -10,10 +13,18 @@ public class MHelper { public static final Random RANDOM = new Random(); private static final float RAD_TO_DEG = 57.295779513082320876798154814105F; public static final float PHI = (float) (Math.PI * (3 - Math.sqrt(5))); + private static final Vec3i[] RANDOM_OFFSETS = new Vec3i[3 * 3 * 3 - 1]; public static int color(int r, int g, int b) { return ALPHA | (r << 16) | (g << 8) | b; } + + public static int color(String hex) { + int r = Integer.parseInt(hex.substring(0, 2), 16); + int g = Integer.parseInt(hex.substring(2, 4), 16); + int b = Integer.parseInt(hex.substring(4, 6), 16); + return color(r, g, b); + } public static int randRange(int min, int max, Random random) { return min + random.nextInt(max - min + 1); @@ -101,6 +112,10 @@ public class MHelper { return (float) Math.sqrt(lengthSqr(x, y, z)); } + public static double length(double x, double y, double z) { + return Math.sqrt(lengthSqr(x, y, z)); + } + public static float lengthSqr(float x, float y) { return x * x + y * y; } @@ -156,6 +171,14 @@ public class MHelper { return i * i; } + public static float pow2(float f) { + return f * f; + } + + public static double pow2(double d) { + return d * d; + } + public static int fromHSBtoRGB(float hue, float saturation, float brightness) { int red = 0; int green = 0; @@ -247,35 +270,100 @@ public class MHelper { return values; } - public static final float radiandToDegrees(float value) { + public static Vec3 fromRGBtoHSBV(int r, int g, int b) { + int max = max(r, g, b); + int min = min(r, g, b); + + float brightness = (float) max / 255.0F; + float saturation; + if (max != 0) { + saturation = (float) (max - min) / (float) max; + } else { + saturation = 0.0F; + } + + float hue; + if (saturation == 0.0F) { + hue = 0.0F; + } + else { + float var9 = (float) (max - r) / (float) (max - min); + float var10 = (float) (max - g) / (float) (max - min); + float var11 = (float) (max - b) / (float) (max - min); + if (r == max) { + hue = var11 - var10; + } else if (g == max) { + hue = 2.0F + var9 - var11; + } else { + hue = 4.0F + var10 - var9; + } + + hue /= 6.0F; + if (hue < 0.0F) { + ++hue; + } + } + + return new Vec3(hue, saturation, brightness); + } + + public static final float radiansToDegrees(float value) { return value * RAD_TO_DEG; } + public static final float degreesToRadians(float value) { + return value / RAD_TO_DEG; + } + public static Vector3f cross(Vector3f vec1, Vector3f vec2) { - float cx = vec1.getY() * vec2.getZ() - vec1.getZ() * vec2.getY(); - float cy = vec1.getZ() * vec2.getX() - vec1.getX() * vec2.getZ(); - float cz = vec1.getX() * vec2.getY() - vec1.getY() * vec2.getX(); + float cx = vec1.y() * vec2.z() - vec1.z() * vec2.y(); + float cy = vec1.z() * vec2.x() - vec1.x() * vec2.z(); + float cz = vec1.x() * vec2.y() - vec1.y() * vec2.x(); return new Vector3f(cx, cy, cz); } public static Vector3f normalize(Vector3f vec) { - float length = lengthSqr(vec.getX(), vec.getY(), vec.getZ()); + float length = lengthSqr(vec.x(), vec.y(), vec.z()); if (length > 0) { length = (float) Math.sqrt(length); - float x = vec.getX() / length; - float y = vec.getY() / length; - float z = vec.getZ() / length; + float x = vec.x() / length; + float y = vec.y() / length; + float z = vec.z() / length; vec.set(x, y, z); } return vec; } - public static float angle(Vector3f vec1, Vector3f vec2) - { - float dot = vec1.getX() * vec2.getX() + vec1.getY() * vec2.getY() + vec1.getZ() * vec2.getZ(); - float length1 = lengthSqr(vec1.getX(), vec1.getY(), vec1.getZ()); - float length2 = lengthSqr(vec2.getX(), vec2.getY(), vec2.getZ()); + public static float angle(Vector3f vec1, Vector3f vec2) { + float dot = vec1.x() * vec2.x() + vec1.y() * vec2.y() + vec1.z() * vec2.z(); + float length1 = lengthSqr(vec1.x(), vec1.y(), vec1.z()); + float length2 = lengthSqr(vec2.x(), vec2.y(), vec2.z()); return (float) Math.acos(dot / Math.sqrt(length1 * length2)); } + + public static Vector3f randomHorizontal(Random random) { + float angleY = MHelper.randRange(0, MHelper.PI2, random); + float vx = (float) Math.sin(angleY); + float vz = (float) Math.cos(angleY); + return new Vector3f(vx, 0, vz); + } + + public static Vec3i[] getOffsets(Random random) { + MHelper.shuffle(RANDOM_OFFSETS, random); + return RANDOM_OFFSETS; + } + + static { + int index = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (x != 0 || y != 0 || z != 0) { + RANDOM_OFFSETS[index++] = new Vec3i(x, y, z); + } + } + } + } + } } diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index 36696623..7b0f879e 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -1,15 +1,24 @@ package ru.betterend.util; -import net.minecraft.block.Block; -import net.minecraft.item.ItemConvertible; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; public class RecipeHelper { - public static boolean exists(ItemConvertible item) { + public static boolean exists(ItemLike item) { if (item instanceof Block) { - return Registry.BLOCK.getId((Block) item) != Registry.BLOCK.getDefaultId(); + return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultKey(); } else { - return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultId(); + return Registry.ITEM.getKey(item.asItem()) != Registry.ITEM.getDefaultKey(); } } + + public static boolean exists(ItemLike... items) { + for (ItemLike item : items) { + if (!exists(item)) { + return false; + } + } + return true; + } } diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java index 71356f7f..e42a688a 100644 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ b/src/main/java/ru/betterend/util/SpawnHelper.java @@ -1,53 +1,22 @@ package ru.betterend.util; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnRestriction; -import net.minecraft.entity.SpawnRestriction.Location; -import net.minecraft.entity.SpawnRestriction.SpawnPredicate; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.world.Heightmap.Type; -import ru.betterend.BetterEnd; +import net.fabricmc.fabric.mixin.object.builder.SpawnRestrictionAccessor; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; +import net.minecraft.world.entity.SpawnPlacements.Type; +import net.minecraft.world.level.levelgen.Heightmap.Types; public class SpawnHelper { - private static Method regRestriction; - - public static void restriction(EntityType entity, Location location, Type heughtmapType, SpawnPredicate predicate) { - if (regRestriction != null) { - try { - regRestriction.invoke(null, entity, location, heughtmapType, predicate); - } - catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - BetterEnd.LOGGER.error(e.getMessage()); - } - } - else { - BetterEnd.LOGGER.error("Unable to register spawn restriction, variable is not handled"); - } + public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.NO_RESTRICTIONS, Types.MOTION_BLOCKING, predicate); } - public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { - restriction(entity, Location.ON_GROUND, Type.MOTION_BLOCKING, predicate); + public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.ON_GROUND, Types.MOTION_BLOCKING, predicate); } - public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { - restriction(entity, Location.IN_WATER, Type.MOTION_BLOCKING, predicate); - } - - static { - try { - for (Method method: SpawnRestriction.class.getDeclaredMethods()) { - if (method.getParameterCount() == 4) { - regRestriction = method; - regRestriction.setAccessible(true); - break; - } - } - } - catch (SecurityException e) { - BetterEnd.LOGGER.error(e.getMessage()); - } + public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.IN_WATER, Types.MOTION_BLOCKING, predicate); } } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index 0a3bd2aa..ed862612 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -6,13 +6,13 @@ import java.util.Random; import java.util.function.Function; import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFLine; @@ -24,22 +24,45 @@ public class SplineHelper { int count = points - 1; for (int i = 1; i < count; i++) { float delta = (float) i / (float) count; - float x = MathHelper.lerp(delta, x1, x2); - float y = MathHelper.lerp(delta, y1, y2); - float z = MathHelper.lerp(delta, z1, z2); + float x = Mth.lerp(delta, x1, x2); + float y = Mth.lerp(delta, y1, y2); + float z = Mth.lerp(delta, z1, z2); spline.add(new Vector3f(x, y, z)); } spline.add(new Vector3f(x2, y2, z2)); return spline; } + public static List smoothSpline(List spline, int segmentPoints) { + List result = Lists.newArrayList(); + Vector3f start = spline.get(0); + for (int i = 1; i < spline.size(); i++) { + Vector3f end = spline.get(i); + for (int j = 0; j < segmentPoints; j++) { + float delta = (float) j / segmentPoints; + delta = 0.5F - 0.5F * Mth.cos(delta * 3.14159F); + result.add(lerp(start, end, delta)); + } + start = end; + } + result.add(start); + return result; + } + + private static Vector3f lerp(Vector3f start, Vector3f end, float delta) { + float x = Mth.lerp(delta, start.x(), end.x()); + float y = Mth.lerp(delta, start.y(), end.y()); + float z = Mth.lerp(delta, start.z(), end.z()); + return new Vector3f(x, y, z); + } + public static void offsetParts(List spline, Random random, float dx, float dy, float dz) { int count = spline.size(); for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); - float x = pos.getX() + (float) random.nextGaussian() * dx; - float y = pos.getY() + (float) random.nextGaussian() * dy; - float z = pos.getZ() + (float) random.nextGaussian() * dz; + float x = pos.x() + (float) random.nextGaussian() * dx; + float y = pos.y() + (float) random.nextGaussian() * dy; + float z = pos.z() + (float) random.nextGaussian() * dz; pos.set(x, y, z); } } @@ -50,8 +73,8 @@ public class SplineHelper { for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float x = (float) i / max; - float y = pos.getY() + (float) Math.pow(x, power) * distance; - pos.set(pos.getX(), y, pos.getZ()); + float y = pos.y() + (float) Math.pow(x, power) * distance; + pos.set(pos.x(), y, pos.z()); } } @@ -64,9 +87,9 @@ public class SplineHelper { Vector3f pos = spline.get(i); float delta = (float) (i - 1) / max; SDF line = new SDFLine() - .setRadius(MathHelper.lerp(delta, radius1, radius2)) - .setStart(start.getX(), start.getY(), start.getZ()) - .setEnd(pos.getX(), pos.getY(), pos.getZ()) + .setRadius(Mth.lerp(delta, radius1, radius2)) + .setStart(start.x(), start.y(), start.z()) + .setEnd(pos.x(), pos.y(), pos.z()) .setBlock(placerFunction); result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); start = pos; @@ -74,7 +97,26 @@ public class SplineHelper { return result; } - public static boolean fillSpline(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + public static SDF buildSDF(List spline, Function radiusFunction, Function placerFunction) { + int count = spline.size(); + float max = count - 2; + SDF result = null; + Vector3f start = spline.get(0); + for (int i = 1; i < count; i++) { + Vector3f pos = spline.get(i); + float delta = (float) (i - 1) / max; + SDF line = new SDFLine() + .setRadius(radiusFunction.apply(delta)) + .setStart(start.x(), start.y(), start.z()) + .setEnd(pos.x(), pos.y(), pos.z()) + .setBlock(placerFunction); + result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); + start = pos; + } + return result; + } + + public static boolean fillSpline(List spline, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -87,7 +129,7 @@ public class SplineHelper { return true; } - public static void fillSplineForce(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + public static void fillSplineForce(List spline, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -96,22 +138,22 @@ public class SplineHelper { } } - public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + public static boolean fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); + float x = start.x(); + float y = start.y(); + float z = start.z(); boolean down = Math.abs(dy) > 0.2; BlockState bState; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); bState = world.getBlockState(bPos); @@ -130,7 +172,7 @@ public class SplineHelper { y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); bState = world.getBlockState(bPos); if (bState.equals(state) || replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); @@ -146,22 +188,22 @@ public class SplineHelper { } } - public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + public static void fillLineForce(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); + float x = start.x(); + float y = start.y(); + float z = start.z(); boolean down = Math.abs(dy) > 0.2; BlockState bState; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); bState = world.getBlockState(bPos); @@ -177,7 +219,7 @@ public class SplineHelper { y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); bState = world.getBlockState(bPos); if (replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); @@ -189,24 +231,24 @@ public class SplineHelper { } } - public static boolean canGenerate(List spline, float scale, BlockPos start, StructureWorldAccess world, Function canReplace) { + public static boolean canGenerate(List spline, float scale, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); - Mutable mut = new Mutable(); - float x1 = start.getX() + vec.getX() * scale; - float y1 = start.getY() + vec.getY() * scale; - float z1 = start.getZ() + vec.getZ() * scale; + MutableBlockPos mut = new MutableBlockPos(); + float x1 = start.getX() + vec.x() * scale; + float y1 = start.getY() + vec.y() * scale; + float z1 = start.getZ() + vec.z() * scale; for (int i = 1; i < count; i++) { vec = spline.get(i); - float x2 = start.getX() + vec.getX() * scale; - float y2 = start.getY() + vec.getY() * scale; - float z2 = start.getZ() + vec.getZ() * scale; + float x2 = start.getX() + vec.x() * scale; + float y2 = start.getY() + vec.y() * scale; + float z2 = start.getZ() + vec.z() * scale; for (float py = y1; py < y2; py += 3) { if (py - start.getY() < 10) continue; float lerp = (py - y1) / (y2 - y1); - float x = MathHelper.lerp(lerp, x1, x2); - float z = MathHelper.lerp(lerp, z1, z2); + float x = Mth.lerp(lerp, x1, x2); + float z = Mth.lerp(lerp, z1, z2); mut.set(x, py, z); if (!canReplace.apply(world.getBlockState(mut))) { return false; @@ -220,24 +262,24 @@ public class SplineHelper { return true; } - public static boolean canGenerate(List spline, BlockPos start, StructureWorldAccess world, Function canReplace) { + public static boolean canGenerate(List spline, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); - Mutable mut = new Mutable(); - float x1 = start.getX() + vec.getX(); - float y1 = start.getY() + vec.getY(); - float z1 = start.getZ() + vec.getZ(); + MutableBlockPos mut = new MutableBlockPos(); + float x1 = start.getX() + vec.x(); + float y1 = start.getY() + vec.y(); + float z1 = start.getZ() + vec.z(); for (int i = 1; i < count; i++) { vec = spline.get(i); - float x2 = start.getX() + vec.getX(); - float y2 = start.getY() + vec.getY(); - float z2 = start.getZ() + vec.getZ(); + float x2 = start.getX() + vec.x(); + float y2 = start.getY() + vec.y(); + float z2 = start.getZ() + vec.z(); for (float py = y1; py < y2; py += 3) { if (py - start.getY() < 10) continue; float lerp = (py - y1) / (y2 - y1); - float x = MathHelper.lerp(lerp, x1, x2); - float z = MathHelper.lerp(lerp, z1, z2); + float x = Mth.lerp(lerp, x1, x2); + float z = Mth.lerp(lerp, z1, z2); mut.set(x, py, z); if (!canReplace.apply(world.getBlockState(mut))) { return false; @@ -253,12 +295,16 @@ public class SplineHelper { public static Vector3f getPos(List spline, float index) { int i = (int) index; + int last = spline.size() - 1; + if (i >= last) { + return spline.get(last); + } float delta = index - i; Vector3f p1 = spline.get(i); Vector3f p2 = spline.get(i + 1); - float x = MathHelper.lerp(delta, p1.getX(), p2.getX()); - float y = MathHelper.lerp(delta, p1.getY(), p2.getY()); - float z = MathHelper.lerp(delta, p1.getZ(), p2.getZ()); + float x = Mth.lerp(delta, p1.x(), p2.x()); + float y = Mth.lerp(delta, p1.y(), p2.y()); + float z = Mth.lerp(delta, p1.z(), p2.z()); return new Vector3f(x, y, z); } @@ -266,16 +312,16 @@ public class SplineHelper { for (Vector3f v: spline) { float sin = (float) Math.sin(angle); float cos = (float) Math.cos(angle); - float x = v.getX() * cos + v.getZ() * sin; - float z = v.getX() * sin + v.getZ() * cos; - v.set(x, v.getY(), z); + float x = v.x() * cos + v.z() * sin; + float z = v.x() * sin + v.z() * cos; + v.set(x, v.y(), z); } } public static List copySpline(List spline) { List result = new ArrayList(spline.size()); for (Vector3f v: spline) { - result.add(new Vector3f(v.getX(), v.getY(), v.getZ())); + result.add(new Vector3f(v.x(), v.y(), v.z())); } return result; } @@ -286,13 +332,13 @@ public class SplineHelper { public static void scale(List spline, float x, float y, float z) { for (Vector3f v: spline) { - v.set(v.getX() * x, v.getY() * y, v.getZ() * z); + v.set(v.x() * x, v.y() * y, v.z() * z); } } public static void offset(List spline, Vector3f offset) { for (Vector3f v: spline) { - v.set(offset.getX() + v.getX(), offset.getY() + v.getY(), offset.getZ() + v.getZ()); + v.set(offset.x() + v.x(), offset.y() + v.y(), offset.z() + v.z()); } } } diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index ff8ab86c..bf136865 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -1,41 +1,72 @@ package ru.betterend.util; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.Enumeration; import java.util.Random; import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; public class StructureHelper { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); - public static Structure readStructure(Identifier resource) { + public static StructureTemplate readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); return readStructure("/data/" + ns + "/structures/" + nm + ".nbt"); } - public static Structure readStructure(String path) { + public static StructureTemplate readStructure(File datapack, String path) { + if (datapack.isDirectory()) { + return readStructure(datapack.toString() + "/" + path); + } + else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { + try { + ZipFile zipFile = new ZipFile(datapack); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String name = entry.getName(); + long compressedSize = entry.getCompressedSize(); + long normalSize = entry.getSize(); + String type = entry.isDirectory() ? "DIR" : "FILE"; + + System.out.println(name); + System.out.format("\t %s - %d - %d\n", type, compressedSize, normalSize); + } + zipFile.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + public static StructureTemplate readStructure(String path) { try { InputStream inputstream = StructureHelper.class.getResourceAsStream(path); return readStructureFromStream(inputstream); @@ -46,69 +77,69 @@ public class StructureHelper { return null; } - private static Structure readStructureFromStream(InputStream stream) throws IOException { + private static StructureTemplate readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); - Structure template = new Structure(); - template.fromTag(nbttagcompound); + StructureTemplate template = new StructureTemplate(); + template.load(nbttagcompound); return template; } - public static BlockPos offsetPos(BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror) { - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - return pos.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + public static BlockPos offsetPos(BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror) { + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + return pos.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); } - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror, Random random) { + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror, Random random) { placeCenteredBottom(world, pos, structure, rotation, mirror, makeBox(pos), random); } - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror, BlockBox bounds, Random random) { + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror, BoundingBox bounds, Random random) { BlockPos offset = offsetPos(pos, structure, rotation, mirror); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - structure.place(world, offset, placementData, random); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + structure.placeInWorldChunk(world, offset, placementData, random); } - private static BlockBox makeBox(BlockPos pos) { + private static BoundingBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; int ex = sx + 47; int ez = sz + 47; - return BlockBox.create(sx, 0, sz, ex, 255, ez); + return BoundingBox.createProper(sx, 0, sz, ex, 255, ez); } - public static BlockBox getStructureBounds(BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror) { + public static BoundingBox getStructureBounds(BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror) { BlockPos max = structure.getSize(); - BlockPos min = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); + BlockPos min = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); max = max.subtract(min); - return new BlockBox(min.add(pos), max.add(pos)); + return new BoundingBox(min.offset(pos), max.offset(pos)); } - public static BlockBox intersectBoxes(BlockBox box1, BlockBox box2) { - int x1 = MHelper.max(box1.minX, box2.minX); - int y1 = MHelper.max(box1.minY, box2.minY); - int z1 = MHelper.max(box1.minZ, box2.minZ); + public static BoundingBox intersectBoxes(BoundingBox box1, BoundingBox box2) { + int x1 = MHelper.max(box1.x0, box2.x0); + int y1 = MHelper.max(box1.y0, box2.y0); + int z1 = MHelper.max(box1.z0, box2.z0); - int x2 = MHelper.min(box1.maxX, box2.maxX); - int y2 = MHelper.min(box1.maxY, box2.maxY); - int z2 = MHelper.min(box1.maxZ, box2.maxZ); + int x2 = MHelper.min(box1.x1, box2.x1); + int y2 = MHelper.min(box1.y1, box2.y1); + int z2 = MHelper.min(box1.z1, box2.z1); - return BlockBox.create(x1, y1, z1, x2, y2, z2); + return BoundingBox.createProper(x1, y1, z1, x2, y2, z2); } - public static void erode(StructureWorldAccess world, BlockBox bounds, int iterations, Random random) { - Mutable mut = new Mutable(); + public static void erode(WorldGenLevel world, BoundingBox bounds, int iterations, Random random) { + MutableBlockPos mut = new MutableBlockPos(); boolean canDestruct = true; for (int i = 0; i < iterations; i++) { - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (canDestruct && state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 && world.isAir(mut.down(2))) { + if (canDestruct && state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 && world.isEmptyBlock(mut.below(2))) { int r = MHelper.randRange(1, 4, random); int cx = mut.getX(); int cy = mut.getY(); @@ -131,7 +162,7 @@ public class StructureHelper { int dz = pz - cz; dz *= dz; mut.setZ(pz); - if (dx + dy + dz <= r && world.getBlockState(mut).isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { + if (dx + dy + dz <= r && world.getBlockState(mut).is(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -149,12 +180,12 @@ public class StructureHelper { if (!state.isAir() && random.nextBoolean()) { shuffle(random); for (Direction dir: DIR) { - if (world.isAir(mut.offset(dir)) && world.isAir(mut.down().offset(dir))) { + if (world.isEmptyBlock(mut.relative(dir)) && world.isEmptyBlock(mut.below().relative(dir))) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); mut.move(dir).move(Direction.DOWN); - for (int py = mut.getY(); y >= bounds.minY - 10; y--) { + for (int py = mut.getY(); y >= bounds.y0 - 10; y--) { mut.setY(py - 1); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { mut.setY(py); BlocksHelper.setWithoutUpdate(world, mut, state); break; @@ -164,25 +195,25 @@ public class StructureHelper { } break; } - else if (random.nextInt(8) == 0 && !world.getBlockState(mut.up()).isOf(EndBlocks.ETERNAL_PEDESTAL)) { + else if (random.nextInt(8) == 0 && !world.getBlockState(mut.above()).is(EndBlocks.ETERNAL_PEDESTAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } } } } - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (!ignore(state) && world.isAir(mut.down())) { + if (!ignore(state) && world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); - for (int py = mut.getY(); py >= bounds.minY - 10; py--) { + for (int py = mut.getY(); py >= bounds.y0 - 10; py--) { mut.setY(py - 1); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { mut.setY(py); BlocksHelper.setWithoutUpdate(world, mut, state); break; @@ -194,15 +225,15 @@ public class StructureHelper { } } - public static void erodeIntense(StructureWorldAccess world, BlockBox bounds, Random random) { - Mutable mut = new Mutable(); - Mutable mut2 = new Mutable(); - int minY = bounds.minY - 10; - for (int x = bounds.minX; x <= bounds.maxX; x++) { + public static void erodeIntense(WorldGenLevel world, BoundingBox bounds, Random random) { + MutableBlockPos mut = new MutableBlockPos(); + MutableBlockPos mut2 = new MutableBlockPos(); + int minY = bounds.y0 - 10; + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state)) { @@ -215,7 +246,7 @@ public class StructureHelper { while (world.getBlockState(mut2).getMaterial().isReplaceable() && mut2.getY() > minY) { mut2.setY(mut2.getY() - 1); } - if (y > 50 && state.canPlaceAt(world, mut2)) { + if (!world.getBlockState(mut2).isAir() && state.canSurvive(world, mut2)) { mut2.setY(mut2.getY() + 1); BlocksHelper.setWithoutUpdate(world, mut2, state); } @@ -232,31 +263,31 @@ public class StructureHelper { drop(world, bounds); } - private static boolean isTerrainNear(StructureWorldAccess world, BlockPos pos) { + private static boolean isTerrainNear(WorldGenLevel world, BlockPos pos) { for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.relative(dir)).is(EndTags.GEN_TERRAIN)) { return true; } } return false; } - private static void drop(StructureWorldAccess world, BlockBox bounds) { - Mutable mut = new Mutable(); + private static void drop(WorldGenLevel world, BoundingBox bounds) { + MutableBlockPos mut = new MutableBlockPos(); Set blocks = Sets.newHashSet(); Set edge = Sets.newHashSet(); Set add = Sets.newHashSet(); - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.minY; y <= bounds.maxY; y++) { + for (int y = bounds.y0; y <= bounds.y1; y++) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state) && isTerrainNear(world, mut)) { - edge.add(mut.toImmutable()); + edge.add(mut.immutable()); } } } @@ -270,12 +301,12 @@ public class StructureHelper { for (BlockPos center: edge) { for (Direction dir: BlocksHelper.DIRECTIONS) { BlockState state = world.getBlockState(center); - if (state.isFullCube(world, center)) { + if (state.isCollisionShapeFullBlock(world, center)) { mut.set(center).move(dir); - if (bounds.contains(mut)) { + if (bounds.isInside(mut)) { state = world.getBlockState(mut); if (!ignore(state) && !blocks.contains(mut)) { - add.add(mut.toImmutable()); + add.add(mut.immutable()); } } } @@ -288,12 +319,12 @@ public class StructureHelper { add.clear(); } - int minY = bounds.minY - 10; - for (int x = bounds.minX; x <= bounds.maxX; x++) { + int minY = bounds.y0 - 10; + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.minY; y <= bounds.maxY; y++) { + for (int y = bounds.y0; y <= bounds.y1; y++) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state) && !blocks.contains(mut)) { @@ -314,14 +345,13 @@ public class StructureHelper { private static boolean ignore(BlockState state) { return state.getMaterial().isReplaceable() || !state.getFluidState().isEmpty() - || state.isIn(EndTags.END_GROUND) - || state.isOf(EndBlocks.ETERNAL_PEDESTAL) - || state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) - || state.isIn(BlockTags.LOGS) - || state.isIn(BlockTags.LEAVES) + || state.is(EndTags.END_GROUND) + || state.is(EndBlocks.ETERNAL_PEDESTAL) + || state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) + || state.is(BlockTags.LOGS) + || state.is(BlockTags.LEAVES) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES) - || state.getMaterial().equals(Material.WOOD); + || state.getMaterial().equals(Material.LEAVES); } private static void shuffle(Random random) { @@ -333,17 +363,17 @@ public class StructureHelper { } } - public static void cover(StructureWorldAccess world, BlockBox bounds, Random random) { - Mutable mut = new Mutable(); - for (int x = bounds.minX; x <= bounds.maxX; x++) { + public static void cover(WorldGenLevel world, BoundingBox bounds, Random random) { + MutableBlockPos mut = new MutableBlockPos(); + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - BlockState top = world.getBiome(mut).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + BlockState top = world.getBiome(mut).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.isIn(EndTags.END_GROUND) && !world.getBlockState(mut.up()).getMaterial().blocksLight()) { + if (state.is(EndTags.END_GROUND) && !world.getBlockState(mut.above()).getMaterial().isSolidBlocking()) { BlocksHelper.setWithoutUpdate(world, mut, top); } } diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 1cec51dd..bef0ffb7 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -6,83 +6,68 @@ import java.util.Set; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; public class TagHelper { - private static final Map> TAGS_BLOCK = Maps.newHashMap(); - private static final Map> TAGS_ITEM = Maps.newHashMap(); + private static final Map> TAGS_BLOCK = Maps.newConcurrentMap(); + private static final Map> TAGS_ITEM = Maps.newConcurrentMap(); - public static void addTag(Tag.Identified tag, Block... blocks) { - Identifier tagID = tag.getId(); - Set set = TAGS_BLOCK.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_BLOCK.put(tagID, set); - } + public static void addTag(Tag.Named tag, Block... blocks) { + ResourceLocation tagID = tag.getName(); + Set set = TAGS_BLOCK.computeIfAbsent(tagID, k -> Sets.newHashSet()); for (Block block: blocks) { - Identifier id = Registry.BLOCK.getId(block); - if (id != Registry.BLOCK.getDefaultId()) { + ResourceLocation id = Registry.BLOCK.getKey(block); + if (id != Registry.BLOCK.getDefaultKey()) { set.add(id); } } } - public static void addTag(Tag.Identified tag, ItemConvertible... items) { - Identifier tagID = tag.getId(); - Set set = TAGS_ITEM.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_ITEM.put(tagID, set); - } - for (ItemConvertible item: items) { - Identifier id = Registry.ITEM.getId(item.asItem()); - if (id != Registry.ITEM.getDefaultId()) { + public static void addTag(Tag.Named tag, ItemLike... items) { + ResourceLocation tagID = tag.getName(); + Set set = TAGS_ITEM.computeIfAbsent(tagID, k -> Sets.newHashSet()); + for (ItemLike item: items) { + ResourceLocation id = Registry.ITEM.getKey(item.asItem()); + if (id != Registry.ITEM.getDefaultKey()) { set.add(id); } } } @SafeVarargs - public static void addTags(ItemConvertible item, Tag.Identified... tags) { - for (Tag.Identified tag: tags) { + public static void addTags(ItemLike item, Tag.Named... tags) { + for (Tag.Named tag: tags) { addTag(tag, item); } } @SafeVarargs - public static void addTags(Block block, Tag.Identified... tags) { - for (Tag.Identified tag: tags) { + public static void addTags(Block block, Tag.Named... tags) { + for (Tag.Named tag: tags) { addTag(tag, block); } } - public static Tag.Builder apply(Tag.Builder builder, Set ids) { - ids.forEach((value) -> { - builder.add(value, "Better End Code"); - }); + public static Tag.Builder apply(Tag.Builder builder, Set ids) { + ids.forEach(value -> builder.addElement(value, "Better End Code")); return builder; } - public static void apply(String entry, Map tagsMap) { - Map> endTags = null; + public static Map apply(String entry, Map tagsMap) { + Map> endTags = null; if (entry.equals("block")) { endTags = TAGS_BLOCK; } else if (entry.equals("item")) { endTags = TAGS_ITEM; } if (endTags != null) { - endTags.forEach((id, ids) -> { - if (tagsMap.containsKey(id)) { - apply(tagsMap.get(id), ids); - } else { - tagsMap.put(id, apply(Tag.Builder.create(), ids)); - } - }); + endTags.forEach((id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids)); } + return tagsMap; } } diff --git a/src/main/java/ru/betterend/util/TranslationHelper.java b/src/main/java/ru/betterend/util/TranslationHelper.java index bc13490f..92cdc229 100644 --- a/src/main/java/ru/betterend/util/TranslationHelper.java +++ b/src/main/java/ru/betterend/util/TranslationHelper.java @@ -9,8 +9,8 @@ import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.JsonObject; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -27,7 +27,7 @@ public class TranslationHelper { JsonObject translationRu = gson.fromJson(new InputStreamReader(streamRu), JsonObject.class); Registry.BLOCK.forEach((block) -> { - if (Registry.BLOCK.getId(block).getNamespace().equals(BetterEnd.MOD_ID)) { + if (Registry.BLOCK.getKey(block).getNamespace().equals(BetterEnd.MOD_ID)) { String name = block.getName().getString(); if (!translationEn.has(name)) { missingNamesEn.add(name); @@ -39,7 +39,7 @@ public class TranslationHelper { }); EndItems.getModItems().forEach((item) -> { - String name = item.getName().getString(); + String name = item.getDescription().getString(); if (!translationEn.has(name)) { missingNamesEn.add(name); } @@ -61,7 +61,7 @@ public class TranslationHelper { }); Registry.ENTITY_TYPE.forEach((entity) -> { - Identifier id = Registry.ENTITY_TYPE.getId(entity); + ResourceLocation id = Registry.ENTITY_TYPE.getKey(entity); if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String name = "entity." + BetterEnd.MOD_ID + "." + id.getPath(); if (!translationEn.has(name)) { diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java new file mode 100644 index 00000000..e881ba09 --- /dev/null +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -0,0 +1,57 @@ +package ru.betterend.util; + +import java.io.File; +import java.io.IOException; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import ru.betterend.BetterEnd; + +public class WorldDataUtil { + private static CompoundTag root; + private static File saveFile; + + public static void load(File file) { + saveFile = file; + if (file.exists()) { + try { + root = NbtIo.readCompressed(file); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data loading failed", e); + root = new CompoundTag(); + } + return; + } + root = new CompoundTag(); + } + + public static CompoundTag getRootTag() { + return root; + } + + public static CompoundTag getCompoundTag(String path) { + String[] parts = path.split("\\."); + CompoundTag tag = root; + for (String part: parts) { + if (tag.contains(part)) { + tag = tag.getCompound(part); + } + else { + CompoundTag t = new CompoundTag(); + tag.put(part, t); + tag = t; + } + } + return tag; + } + + public static void saveFile() { + try { + NbtIo.writeCompressed(root, saveFile); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); + } + } +} diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index bf5483b8..9d7133f0 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -2,13 +2,13 @@ package ru.betterend.util.sdf; import java.util.Map; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; public class PosInfo implements Comparable { - private static final BlockState AIR = Blocks.AIR.getDefaultState(); + private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private final Map blocks; private final Map add; private final BlockPos pos; @@ -50,16 +50,16 @@ public class PosInfo implements Comparable { } public BlockState getState(Direction dir) { - PosInfo info = blocks.get(pos.offset(dir)); + PosInfo info = blocks.get(pos.relative(dir)); if (info == null) { - info = add.get(pos.offset(dir)); + info = add.get(pos.relative(dir)); return info == null ? AIR : info.getState(); } return info.getState(); } public BlockState getState(Direction dir, int distance) { - PosInfo info = blocks.get(pos.offset(dir, distance)); + PosInfo info = blocks.get(pos.relative(dir, distance)); if (info == null) { return AIR; } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index fb881000..6e446fdd 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -7,22 +7,21 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; public abstract class SDF { - private Function postProcess = (info) -> { - return info.getState(); - }; + private List> postProcesses = Lists.newArrayList(); private Function canReplace = (state) -> { return state.getMaterial().isReplaceable(); }; @@ -31,8 +30,8 @@ public abstract class SDF { public abstract BlockState getBlockState(BlockPos pos); - public SDF setPostProcess(Function postProcess) { - this.postProcess = postProcess; + public SDF addPostProcess(Function postProcess) { + this.postProcesses.add(postProcess); return this; } @@ -41,8 +40,7 @@ public abstract class SDF { return this; } - @Deprecated - public void fillRecursive(ServerWorldAccess world, BlockPos start, int dx, int dy, int dz) { + public void fillRecursive(ServerLevelAccessor world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); @@ -51,78 +49,19 @@ public abstract class SDF { ends.add(new BlockPos(0, 0, 0)); boolean run = true; - while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { - BlockPos pos = center.offset(dir); - BlockPos wpos = pos.add(start); - - run &= Math.abs(pos.getX()) < dx; - run &= Math.abs(pos.getY()) < dy; - run &= Math.abs(pos.getZ()) < dz; - - if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { - if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { - BlockState state = getBlockState(wpos); - PosInfo.create(mapWorld, addInfo, wpos).setState(state); - if (Math.abs(pos.getX()) < dx && Math.abs(pos.getY()) < dy && Math.abs(pos.getZ()) < dz) { - add.add(pos); - } - } - } - } - } - - blocks.addAll(ends); - ends.clear(); - ends.addAll(add); - add.clear(); - - run &= !ends.isEmpty(); - } - - List infos = new ArrayList(mapWorld.values()); - if (infos.size() > 0) { - Collections.sort(infos); - infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - }); - - infos.clear(); - infos.addAll(addInfo.values()); - Collections.sort(infos); - infos.forEach((info) -> { - if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - } - }); - } - } - - public void fillRecursive(ServerWorldAccess world, BlockPos start) { - Map mapWorld = Maps.newHashMap(); - Map addInfo = Maps.newHashMap(); - Set blocks = Sets.newHashSet(); - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(new BlockPos(0, 0, 0)); - boolean run = true; - - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); while (run) { for (BlockPos center: ends) { for (Direction dir: Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); if (!blocks.contains(bPos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); PosInfo.create(mapWorld, addInfo, wpos).setState(state); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -139,8 +78,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -149,20 +90,24 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } } - public void fillArea(ServerWorldAccess world, BlockPos center, Box box) { + public void fillArea(ServerLevelAccessor world, BlockPos center, AABB box) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); for (int y = (int) box.minY; y <= box.maxY; y++) { mut.setY(y); for (int x = (int) box.minX; x <= box.maxX; x++) { @@ -172,7 +117,7 @@ public abstract class SDF { if (canReplace.apply(world.getBlockState(mut))) { BlockPos fpos = mut.subtract(center); if (this.getDistance(fpos.getX(), fpos.getY(), fpos.getZ()) < 0) { - PosInfo.create(mapWorld, addInfo, mut.toImmutable()).setState(getBlockState(mut)); + PosInfo.create(mapWorld, addInfo, mut.immutable()).setState(getBlockState(mut)); } } } @@ -182,8 +127,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -192,16 +139,20 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } } - public void fillRecursiveIgnore(ServerWorldAccess world, BlockPos start, Function ignore) { + public void fillRecursiveIgnore(ServerLevelAccessor world, BlockPos start, Function ignore) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); @@ -210,19 +161,19 @@ public abstract class SDF { ends.add(new BlockPos(0, 0, 0)); boolean run = true; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); while (run) { for (BlockPos center: ends) { for (Direction dir: Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); BlockState state = world.getBlockState(wpos); boolean ign = ignore.apply(state); if (!blocks.contains(bPos) && (ign || canReplace.apply(state))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { PosInfo.create(mapWorld, addInfo, wpos).setState(ign ? state : getBlockState(bPos)); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -239,8 +190,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -249,10 +202,14 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } @@ -267,19 +224,19 @@ public abstract class SDF { ends.add(new BlockPos(0, 0, 0)); boolean run = true; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); while (run) { for (BlockPos center: ends) { for (Direction dir: Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); if (!blocks.contains(bPos)) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); PosInfo.create(mapWorld, addInfo, wpos).setState(state); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -295,17 +252,59 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - world.setBlock(info.getPos(), state); + world.setBlock(info.getPos(), info.getState()); }); infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - world.setBlock(info.getPos(), state); + world.setBlock(info.getPos(), info.getState()); }); } + + public Set getPositions(ServerLevelAccessor world, BlockPos start) { + Set blocks = Sets.newHashSet(); + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(new BlockPos(0, 0, 0)); + boolean run = true; + + MutableBlockPos bPos = new MutableBlockPos(); + + while (run) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { + bPos.set(center).move(dir); + BlockPos wpos = bPos.offset(start); + BlockState state = world.getBlockState(wpos); + if (!blocks.contains(wpos) && canReplace.apply(state)) { + if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { + add.add(bPos.immutable()); + } + } + } + } + + ends.forEach((end) -> blocks.add(end.offset(start))); + ends.clear(); + ends.addAll(add); + add.clear(); + + run &= !ends.isEmpty(); + } + + return blocks; + } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java index 4c8fd72f..1d48561d 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java @@ -1,7 +1,7 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; public abstract class SDFBinary extends SDF { diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java index ea04ace9..108a9c39 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java @@ -2,7 +2,7 @@ package ru.betterend.util.sdf.operator; import java.util.function.Consumer; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; public class SDFCoordModify extends SDFUnary { private static final Vector3f POS = new Vector3f(); @@ -17,6 +17,6 @@ public class SDFCoordModify extends SDFUnary { public float getDistance(float x, float y, float z) { POS.set(x, y, z); function.accept(POS); - return this.source.getDistance(POS.getX(), POS.getY(), POS.getZ()); + return this.source.getDistance(POS.x(), POS.y(), POS.z()); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java index 652c02f8..531d7158 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java @@ -2,7 +2,7 @@ package ru.betterend.util.sdf.operator; import java.util.function.Function; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; public class SDFDisplacement extends SDFUnary { private static final Vector3f POS = new Vector3f(); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java b/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java index a94f2c3c..f5707bdb 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java @@ -7,7 +7,7 @@ public class SDFFlatWave extends SDFDisplacement { public SDFFlatWave() { setFunction((pos) -> { - return (float) Math.cos(Math.atan2(pos.getX(), pos.getZ()) * rayCount + angle) * intensity; + return (float) Math.cos(Math.atan2(pos.x(), pos.z()) * rayCount + angle) * intensity; }); } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java new file mode 100644 index 00000000..a05ebdad --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -0,0 +1,64 @@ +package ru.betterend.util.sdf.operator; + +import com.mojang.blaze3d.platform.NativeImage; + +import net.minecraft.util.Mth; + +public class SDFHeightmap extends SDFDisplacement { + private float intensity = 1F; + private NativeImage map; + private float offsetX; + private float offsetZ; + private float scale; + private float cos = 1; + private float sin = 0; + + public SDFHeightmap() { + setFunction((pos) -> { + if (map == null) { + return 0F; + } + float px = Mth.clamp(pos.x() * scale + offsetX, 0, map.getWidth() - 2); + float pz = Mth.clamp(pos.z() * scale + offsetZ, 0, map.getHeight() - 2); + float dx = (px * cos - pz * sin); + float dz = (pz * cos + px * sin); + int x1 = Mth.floor(dx); + int z1 = Mth.floor(dz); + int x2 = x1 + 1; + int z2 = z1 + 1; + dx = dx - x1; + dz = dz - z1; + float a = (map.getPixelRGBA(x1, z1) & 255) / 255F; + float b = (map.getPixelRGBA(x2, z1) & 255) / 255F; + float c = (map.getPixelRGBA(x1, z2) & 255) / 255F; + float d = (map.getPixelRGBA(x2, z2) & 255) / 255F; + a = Mth.lerp(dx, a, b); + b = Mth.lerp(dx, c, d); + return -Mth.lerp(dz, a, b) * intensity; + }); + } + + public SDFHeightmap setMap(NativeImage map) { + this.map = map; + offsetX = map.getWidth() * 0.5F; + offsetZ = map.getHeight() * 0.5F; + scale = map.getWidth(); + return this; + } + + public SDFHeightmap setAngle(float angle) { + sin = Mth.sin(angle); + cos = Mth.cos(angle); + return this; + } + + public SDFHeightmap setScale(float scale) { + this.scale = map.getWidth() * scale; + return this; + } + + public SDFHeightmap setIntensity(float intensity) { + this.intensity = intensity; + return this; + } +} diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java new file mode 100644 index 00000000..258d2ee2 --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java @@ -0,0 +1,60 @@ +package ru.betterend.util.sdf.operator; + +import net.minecraft.util.Mth; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + +public class SDFRadialNoiseMap extends SDFDisplacement { + private static final float SIN = Mth.sin(0.5F); + private static final float COS = Mth.cos(0.5F); + + private OpenSimplexNoise noise; + private float intensity = 1F; + private float radius = 1F; + private short offsetX; + private short offsetZ; + + public SDFRadialNoiseMap() { + setFunction((pos) -> { + if (intensity == 0) { + return 0F; + } + float px = pos.x() / radius; + float pz = pos.z() / radius; + float distance = MHelper.lengthSqr(px, pz); + if (distance > 1) { + return 0F; + } + distance = 1 - Mth.sqrt(distance); + float nx = px * COS - pz * SIN; + float nz = pz * COS + px * SIN; + distance *= getNoise(nx * 0.75 + offsetX, nz * 0.75 + offsetZ); + return distance * intensity; + }); + } + + private float getNoise(double x, double z) { + return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; + } + + public SDFRadialNoiseMap setSeed(long seed) { + noise = new OpenSimplexNoise(seed); + return this; + } + + public SDFRadialNoiseMap setIntensity(float intensity) { + this.intensity = intensity; + return this; + } + + public SDFRadialNoiseMap setRadius(float radius) { + this.radius = radius; + return this; + } + + public SDFRadialNoiseMap setOffset(int x, int z) { + offsetX = (short) (x & 32767); + offsetZ = (short) (z & 32767); + return this; + } +} diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java index 3452c255..3772443a 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java @@ -1,7 +1,7 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.Quaternion; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; public class SDFRotation extends SDFUnary { private static final Vector3f POS = new Vector3f(); @@ -15,7 +15,7 @@ public class SDFRotation extends SDFUnary { @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); - POS.rotate(rotation); - return source.getDistance(POS.getX(), POS.getY(), POS.getZ()); + POS.transform(rotation); + return source.getDistance(POS.x(), POS.y(), POS.z()); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java index d8643d64..de4d12f0 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothIntersection extends SDFBinary { private float radius; @@ -15,7 +15,7 @@ public class SDFSmoothIntersection extends SDFBinary { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F - 0.5F * (b - a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, a) + radius * h * (1F - h); + float h = Mth.clamp(0.5F - 0.5F * (b - a) / radius, 0F, 1F); + return Mth.lerp(h, b, a) + radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java index 2f24c1b6..8f2a5226 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothSubtraction extends SDFBinary { private float radius; @@ -15,7 +15,7 @@ public class SDFSmoothSubtraction extends SDFBinary { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F - 0.5F * (b + a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, -a) + radius * h * (1F - h); + float h = Mth.clamp(0.5F - 0.5F * (b + a) / radius, 0F, 1F); + return Mth.lerp(h, b, -a) + radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java index 417edc0a..103156fc 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothUnion extends SDFBinary { private float radius; @@ -15,7 +15,7 @@ public class SDFSmoothUnion extends SDFBinary { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F + 0.5F * (b - a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, a) - radius * h * (1F - h); + float h = Mth.clamp(0.5F + 0.5F * (b - a) / radius, 0F, 1F); + return Mth.lerp(h, b, a) - radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java index 83ea8cc4..233901c3 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java @@ -1,7 +1,7 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; public abstract class SDFUnary extends SDF { diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java similarity index 66% rename from src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java rename to src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java index c60506a8..e7461443 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java @@ -1,24 +1,24 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; -public class SDFCapedCone extends SDFPrimitive { +public class SDFCappedCone extends SDFPrimitive { private float radius1; private float radius2; private float height; - public SDFCapedCone setRadius1(float radius) { + public SDFCappedCone setRadius1(float radius) { this.radius1 = radius; return this; } - public SDFCapedCone setRadius2(float radius) { + public SDFCappedCone setRadius2(float radius) { this.radius2 = radius; return this; } - public SDFCapedCone setHeight(float height) { + public SDFCappedCone setHeight(float height) { this.height = height; return this; } @@ -30,7 +30,7 @@ public class SDFCapedCone extends SDFPrimitive { float k2y = 2 * height; float cax = qx - MHelper.min(qx, (y < 0F) ? radius1 : radius2); float cay = Math.abs(y) - height; - float mlt = MathHelper.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, 1F); + float mlt = Mth.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, 1F); float cbx = qx - radius2 + k2x * mlt; float cby = y - height + k2y * mlt; float s = (cbx < 0F && cay < 0F) ? -1F : 1F; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java index 404b9e24..94c38913 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFCapsule extends SDFPrimitive { @@ -19,6 +19,6 @@ public class SDFCapsule extends SDFPrimitive { @Override public float getDistance(float x, float y, float z) { - return MHelper.length(x, y - MathHelper.clamp(y, 0, height), z) - radius; + return MHelper.length(x, y - Mth.clamp(y, 0, height), z) - radius; } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java index 15d46396..eff4c11a 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFLine extends SDFPrimitive { @@ -43,7 +43,7 @@ public class SDFLine extends SDFPrimitive { float dpb = MHelper.dot(pax, pay, paz, bax, bay, baz); float dbb = MHelper.dot(bax, bay, baz, bax, bay, baz); - float h = MathHelper.clamp(dpb / dbb, 0F, 1F); + float h = Mth.clamp(dpb / dbb, 0F, 1F); return MHelper.length(pax - bax * h, pay - bay * h, paz - baz * h) - radius; } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java index 4e728bb1..49482fd6 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFPie extends SDFPrimitive { @@ -24,7 +24,7 @@ public class SDFPie extends SDFPrimitive { float px = Math.abs(x); float l = MHelper.length(px, y, z) - radius; float m = MHelper.dot(px, z, sin, cos); - m = MathHelper.clamp(m, 0, radius); + m = Mth.clamp(m, 0, radius); m = MHelper.length(px - sin * m, z - cos * m); return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java index 5f8cf461..533a7496 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java @@ -2,9 +2,9 @@ package ru.betterend.util.sdf.primitive; import java.util.function.Function; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; public abstract class SDFPrimitive extends SDF { @@ -24,7 +24,7 @@ public abstract class SDFPrimitive extends SDF { public SDFPrimitive setBlock(Block block) { this.placerFunction = (pos) -> { - return block.getDefaultState(); + return block.defaultBlockState(); }; return this; } diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 03980cea..0da55eba 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -4,37 +4,37 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.client.sound.MusicType; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.sound.BiomeAdditionsSound; -import net.minecraft.sound.BiomeMoodSound; -import net.minecraft.sound.MusicSound; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.biome.Biome.Precipitation; -import net.minecraft.world.biome.BiomeEffects.Builder; -import net.minecraft.world.biome.BiomeParticleConfig; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.biome.SpawnSettings; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; -import net.minecraft.world.gen.GenerationStep.Carver; -import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.ProbabilityConfig; -import net.minecraft.world.gen.carver.ConfiguredCarver; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; +import net.minecraft.world.level.biome.AmbientMoodSettings; +import net.minecraft.world.level.biome.AmbientParticleSettings; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.biome.Biome.Precipitation; +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.biome.BiomeSpecialEffects.Builder; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.GenerationStep.Carving; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.ProbabilityFeatureConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.BetterEnd; +import ru.betterend.registry.EndFeatures; import ru.betterend.util.MHelper; import ru.betterend.world.features.EndFeature; import ru.betterend.world.structures.EndStructureFeature; @@ -48,11 +48,11 @@ public class BiomeDefinition { private final List features = Lists.newArrayList(); private final List carvers = Lists.newArrayList(); private final List mobs = Lists.newArrayList(); - private final List spawns = Lists.newArrayList(); + private final List spawns = Lists.newArrayList(); - private BiomeParticleConfig particleConfig; - private BiomeAdditionsSound additions; - private BiomeMoodSound mood; + private AmbientParticleSettings particleConfig; + private AmbientAdditionsSettings additions; + private AmbientMoodSettings mood; private SoundEvent music; private SoundEvent loop; @@ -62,22 +62,29 @@ public class BiomeDefinition { private int foliageColor = DEF_FOLIAGE; private int grassColor = DEF_FOLIAGE; private float fogDensity = 1F; + private float depth = 0.1F; - private final Identifier id; + private final ResourceLocation id; private float genChance = 1F; private boolean hasCaves = true; + private boolean isCaveBiome = false; private ConfiguredSurfaceBuilder surface; public BiomeDefinition(String name) { this.id = BetterEnd.makeID(name); } - + + public BiomeDefinition setCaveBiome() { + isCaveBiome = true; + return this; + } + public BiomeDefinition setSurface(Block block) { - setSurface(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig( - block.getDefaultState(), - Blocks.END_STONE.getDefaultState(), - Blocks.END_STONE.getDefaultState() + setSurface(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderBaseConfiguration( + block.defaultBlockState(), + Blocks.END_STONE.defaultBlockState(), + Blocks.END_STONE.defaultBlockState() ))); return this; } @@ -92,12 +99,12 @@ public class BiomeDefinition { return this; } - public BiomeDefinition setSurface(SurfaceBuilder builder) { - return setSurface(builder.withConfig(SurfaceBuilders.DEFAULT_END_CONFIG)); + public BiomeDefinition setSurface(SurfaceBuilder builder) { + return setSurface(builder.configured(SurfaceBuilders.DEFAULT_END_CONFIG)); } - public BiomeDefinition setParticles(ParticleEffect particle, float probability) { - this.particleConfig = new BiomeParticleConfig(particle, probability); + public BiomeDefinition setParticles(ParticleOptions particle, float probability) { + this.particleConfig = new AmbientParticleSettings(particle, probability); return this; } @@ -105,10 +112,15 @@ public class BiomeDefinition { this.genChance = genChance; return this; } + + public BiomeDefinition setDepth(float depth) { + this.depth = depth; + return this; + } public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { - Identifier eID = Registry.ENTITY_TYPE.getId(type); - if (eID != Registry.ENTITY_TYPE.getDefaultId()) { + ResourceLocation eID = Registry.ENTITY_TYPE.getKey(type); + if (eID != Registry.ENTITY_TYPE.getDefaultKey()) { SpawnInfo info = new SpawnInfo(); info.type = type; info.weight = weight; @@ -119,7 +131,7 @@ public class BiomeDefinition { return this; } - public BiomeDefinition addMobSpawn(SpawnEntry entry) { + public BiomeDefinition addMobSpawn(SpawnerData entry) { spawns.add(entry); return this; } @@ -142,7 +154,7 @@ public class BiomeDefinition { return this; } - public BiomeDefinition addFeature(Feature featureStep, ConfiguredFeature feature) { + public BiomeDefinition addFeature(Decoration featureStep, ConfiguredFeature feature) { FeatureInfo info = new FeatureInfo(); info.featureStep = featureStep; info.feature = feature; @@ -151,9 +163,9 @@ public class BiomeDefinition { } private int getColor(int r, int g, int b) { - r = MathHelper.clamp(r, 0, 255); - g = MathHelper.clamp(g, 0, 255); - b = MathHelper.clamp(b, 0, 255); + r = Mth.clamp(r, 0, 255); + g = Mth.clamp(g, 0, 255); + b = Mth.clamp(b, 0, 255); return MHelper.color(r, g, b); } @@ -201,12 +213,12 @@ public class BiomeDefinition { } public BiomeDefinition setMood(SoundEvent mood) { - this.mood = new BiomeMoodSound(mood, 6000, 8, 2.0D); + this.mood = new AmbientMoodSettings(mood, 6000, 8, 2.0D); return this; } public BiomeDefinition setAdditions(SoundEvent additions) { - this.additions = new BiomeAdditionsSound(additions, 0.0111); + this.additions = new AmbientAdditionsSettings(additions, 0.0111); return this; } @@ -221,39 +233,40 @@ public class BiomeDefinition { } public Biome build() { - SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); - GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + MobSpawnSettings.Builder spawnSettings = new MobSpawnSettings.Builder(); + BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); Builder effects = new Builder(); mobs.forEach((spawn) -> { - spawnSettings.spawn(spawn.type.getSpawnGroup(), new SpawnSettings.SpawnEntry(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); + spawnSettings.addSpawn(spawn.type.getCategory(), new MobSpawnSettings.SpawnerData(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); }); spawns.forEach((entry) -> { - spawnSettings.spawn(entry.type.getSpawnGroup(), entry); + spawnSettings.addSpawn(entry.type.getCategory(), entry); }); - generationSettings.surfaceBuilder(surface == null ? ConfiguredSurfaceBuilders.END : surface); - structures.forEach((structure) -> generationSettings.structureFeature(structure)); - features.forEach((info) -> generationSettings.feature(info.featureStep, info.feature)); - carvers.forEach((info) -> generationSettings.carver(info.carverStep, info.carver)); + EndFeatures.addDefaultFeatures(this); + generationSettings.surfaceBuilder(surface == null ? net.minecraft.data.worldgen.SurfaceBuilders.END : surface); + structures.forEach((structure) -> generationSettings.addStructureStart(structure)); + features.forEach((info) -> generationSettings.addFeature(info.featureStep, info.feature)); + carvers.forEach((info) -> generationSettings.addCarver(info.carverStep, info.carver)); - effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor).foliageColor(foliageColor).grassColor(grassColor); - if (loop != null) effects.loopSound(loop); - if (mood != null) effects.moodSound(mood); - if (additions != null) effects.additionsSound(additions); - if (particleConfig != null) effects.particleConfig(particleConfig); - effects.music(music != null ? new MusicSound(music, 600, 2400, true) : MusicType.END); + effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor).foliageColorOverride(foliageColor).grassColorOverride(grassColor); + if (loop != null) effects.ambientLoopSound(loop); + if (mood != null) effects.ambientMoodSound(mood); + if (additions != null) effects.ambientAdditionsSound(additions); + if (particleConfig != null) effects.ambientParticle(particleConfig); + effects.backgroundMusic(music != null ? new Music(music, 600, 2400, true) : Musics.END); - return new Biome.Builder() + return new Biome.BiomeBuilder() .precipitation(Precipitation.NONE) - .category(Category.THEEND) - .depth(0.1F) + .biomeCategory(isCaveBiome ? BiomeCategory.NONE : BiomeCategory.THEEND) + .depth(depth) .scale(0.2F) .temperature(2.0F) .downfall(0.0F) - .effects(effects.build()) - .spawnSettings(spawnSettings.build()) + .specialEffects(effects.build()) + .mobSpawnSettings(spawnSettings.build()) .generationSettings(generationSettings.build()) .build(); } @@ -266,16 +279,16 @@ public class BiomeDefinition { } private static final class FeatureInfo { - Feature featureStep; + Decoration featureStep; ConfiguredFeature feature; } private static final class CarverInfo { - Carver carverStep; - ConfiguredCarver carver; + Carving carverStep; + ConfiguredWorldCarver carver; } - public Identifier getID() { + public ResourceLocation getID() { return id; } @@ -291,7 +304,7 @@ public class BiomeDefinition { return hasCaves; } - public BiomeDefinition addCarver(Carver carverStep, ConfiguredCarver carver) { + public BiomeDefinition addCarver(Carving carverStep, ConfiguredWorldCarver carver) { CarverInfo info = new CarverInfo(); info.carverStep = carverStep; info.carver = carver; diff --git a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java b/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java deleted file mode 100644 index 4bd14725..00000000 --- a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.betterend.world.biome; - -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndSounds; - -public class BiomeDustWastelands extends EndBiome { - public BiomeDustWastelands() { - super(new BiomeDefinition("dust_wastelands") - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setCaves(false) - .setWaterAndFogColor(192, 180, 131) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_DUST_WASTELANDS) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); - } -} diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java deleted file mode 100644 index e63ca8b1..00000000 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.betterend.world.biome; - -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; - -public class BiomeUmbrellaJungle extends EndBiome { - public BiomeUmbrellaJungle() { - super(new BiomeDefinition("umbrella_jungle") - .setFogColor(87, 223, 221) - .setWaterAndFogColor(119, 198, 253) - .setFoliageColor(27, 183, 194) - .setFogDensity(2.3F) - .setSurface(EndBlocks.END_MOSS) - .addFeature(EndFeatures.UMBRELLA_TREE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.END_LAKE)); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 676db37d..bb9b957f 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -8,9 +8,9 @@ import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.structure.Structure; -import net.minecraft.util.Identifier; -import net.minecraft.world.biome.Biome; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; @@ -23,7 +23,7 @@ public class EndBiome { protected List subbiomes = Lists.newArrayList(); protected final Biome biome; - protected final Identifier mcID; + protected final ResourceLocation mcID; protected EndBiome edge; protected int edgeSize; @@ -38,21 +38,26 @@ public class EndBiome { private Biome actualBiome; public EndBiome(BiomeDefinition definition) { - biome = definition.build(); - mcID = definition.getID(); - fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); - genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); - hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", definition.hasCaves()); - readStructureList(); + this.mcID = definition.getID(); + this.readStructureList(); + if (structuresFeature != null) { + definition.addFeature(structuresFeature); + } + this.biome = definition.build(); + this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); + this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); + this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", definition.hasCaves()); + this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); } - public EndBiome(Identifier id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { - this.biome = biome; + public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { this.mcID = id; + this.readStructureList(); + this.biome = biome; this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", fogDensity); this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", genChance); this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", hasCaves); - readStructureList(); + this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); } public EndBiome getEdge() { @@ -77,6 +82,10 @@ public class EndBiome { biome.biomeParent = this; subbiomes.add(biome); } + + public boolean containsSubBiome(EndBiome biome) { + return subbiomes.contains(biome); + } public EndBiome getSubBiome(Random random) { float chance = random.nextFloat() * maxSubBiomeChance; @@ -121,7 +130,7 @@ public class EndBiome { return mcID.toString(); } - public Identifier getID() { + public ResourceLocation getID() { return mcID; } @@ -142,7 +151,7 @@ public class EndBiome { List list = Lists.newArrayList(); enties.forEach((entry) -> { JsonObject e = entry.getAsJsonObject(); - Structure structure = StructureHelper.readStructure(path + e.get("nbt").getAsString() + ".nbt"); + String structure = path + e.get("nbt").getAsString() + ".nbt"; TerrainMerge terrainMerge = TerrainMerge.getFromString(e.get("terrainMerge").getAsString()); int offsetY = e.get("offsetY").getAsInt(); list.add(new StructureInfo(structure, offsetY, terrainMerge)); @@ -158,10 +167,6 @@ public class EndBiome { return structuresFeature; } - public void setActualBiome(Biome biome) { - this.actualBiome = biome; - } - public Biome getActualBiome() { return this.actualBiome; } @@ -177,4 +182,30 @@ public class EndBiome { public boolean hasCaves() { return hasCaves; } + + public void updateActualBiomes(Registry biomeRegistry) { + subbiomes.forEach((sub) -> { + if (sub != this) { + sub.updateActualBiomes(biomeRegistry); + } + }); + if (edge != null && edge != this) { + edge.updateActualBiomes(biomeRegistry); + } + this.actualBiome = biomeRegistry.get(mcID); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + EndBiome biome = (EndBiome) obj; + return biome == null ? false : biome.mcID.equals(mcID); + } + + @Override + public int hashCode() { + return mcID.hashCode(); + } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java similarity index 75% rename from src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java rename to src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index 36df8654..f90945e3 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -1,9 +1,11 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.air; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java new file mode 100644 index 00000000..93fb0624 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -0,0 +1,32 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class EmptyAuroraCaveBiome extends EndCaveBiome { + public EmptyAuroraCaveBiome() { + super(new BiomeDefinition("empty_aurora_cave") + .setFogColor(150, 30, 68) + .setFogDensity(2.0F) + .setPlantsColor(108, 25, 46) + .setWaterAndFogColor(186, 77, 237) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.01F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java new file mode 100644 index 00000000..4976fed1 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -0,0 +1,26 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class EmptyEndCaveBiome extends EndCaveBiome { + public EmptyEndCaveBiome() { + super(new BiomeDefinition("empty_end_cave") + .setFogDensity(2.0F) + .setMusic(EndSounds.MUSIC_FOREST)); + + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java new file mode 100644 index 00000000..ed5ed762 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -0,0 +1,33 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class EmptySmaragdantCaveBiome extends EndCaveBiome { + public EmptySmaragdantCaveBiome() { + super(new BiomeDefinition("empty_smaragdant_cave") + .setFogColor(0, 253, 182) + .setFogDensity(2.0F) + .setPlantsColor(0, 131, 145) + .setWaterAndFogColor(31, 167, 212) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.SMARAGDANT, 0.001F)); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java new file mode 100644 index 00000000..3f25a5bb --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -0,0 +1,63 @@ +package ru.betterend.world.biome.cave; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.features.EndFeature; +import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; + +public class EndCaveBiome extends EndBiome { + private WeightedList> floorFeatures = new WeightedList>(); + private WeightedList> ceilFeatures = new WeightedList>(); + + public EndCaveBiome(BiomeDefinition definition) { + super(makeDef(definition)); + } + + private static BiomeDefinition makeDef(BiomeDefinition definition) { + EndFeature feature = EndFeature.makeChunkFeature( + definition.getID().getPath() + "_cave_populator", + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID())) + ); + definition.addFeature(feature).setCaveBiome(); + return definition; + } + + public void addFloorFeature(Feature feature, int weight) { + floorFeatures.add(feature, weight); + } + + public void addCeilFeature(Feature feature, int weight) { + ceilFeatures.add(feature, weight); + } + + public Feature getFloorFeature(Random random) { + return floorFeatures.isEmpty() ? null : floorFeatures.getOne(random); + } + + public Feature getCeilFeature(Random random) { + return ceilFeatures.isEmpty() ? null : ceilFeatures.getOne(random); + } + + public float getFloorDensity() { + return 0; + } + + public float getCeilDensity() { + return 0; + } + + public BlockState getCeil(BlockPos pos) { + return null; + } + + public BlockState getWall(BlockPos pos) { + return null; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java new file mode 100644 index 00000000..d399695d --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java @@ -0,0 +1,35 @@ +package ru.betterend.world.biome.cave; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class JadeCaveBiome extends EndCaveBiome { + private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); + private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); + private static final BlockState[] JADE = new BlockState[3]; + + public JadeCaveBiome() { + super(new BiomeDefinition("jade_cave") + .setFogColor(118, 150, 112) + .setFogDensity(2.0F) + .setWaterAndFogColor(95, 223, 255) + .setMusic(EndSounds.MUSIC_FOREST) + ); + JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); + JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); + JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); + } + + @Override + public BlockState getWall(BlockPos pos) { + double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; + int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); + index = Mth.abs(index) % 3; + return JADE[index]; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java new file mode 100644 index 00000000..52ff7f1b --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -0,0 +1,50 @@ +package ru.betterend.world.biome.cave; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class LushAuroraCaveBiome extends EndCaveBiome { + public LushAuroraCaveBiome() { + super(new BiomeDefinition("lush_aurora_cave") + .setFogColor(150, 30, 68) + .setFogDensity(2.0F) + .setPlantsColor(108, 25, 46) + .setWaterAndFogColor(186, 77, 237) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setSurface(EndBlocks.CAVE_MOSS)); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); + this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); + + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); + this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); + this.addCeilFeature(EndFeatures.RUBINEA, 3); + this.addCeilFeature(EndFeatures.MAGNULA, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); + } + + @Override + public float getFloorDensity() { + return 0.2F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + + @Override + public BlockState getCeil(BlockPos pos) { + return EndBlocks.CAVE_MOSS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java new file mode 100644 index 00000000..c9a40749 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -0,0 +1,35 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class LushSmaragdantCaveBiome extends EndCaveBiome { + public LushSmaragdantCaveBiome() { + super(new BiomeDefinition("lush_smaragdant_cave") + .setFogColor(0, 253, 182) + .setFogDensity(2.0F) + .setPlantsColor(0, 131, 145) + .setWaterAndFogColor(31, 167, 212) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.SMARAGDANT, 0.001F) + .setSurface(EndBlocks.CAVE_MOSS)); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java similarity index 57% rename from src/main/java/ru/betterend/world/biome/BiomeAmberLand.java rename to src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index c8aed8fd..43dd0840 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,20 +1,23 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeAmberLand extends EndBiome { - public BiomeAmberLand() { +public class AmberLandBiome extends EndBiome { + public AmberLandBiome() { super(new BiomeDefinition("amber_land") .setFogColor(255, 184, 71) .setFogDensity(2.0F) .setPlantsColor(219, 115, 38) .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_AMBER_LAND) + .setMusic(EndSounds.MUSIC_FOREST) .setParticles(EndParticles.AMBER_SPHERE, 0.001F) .setSurface(EndBlocks.AMBER_MOSS) .addFeature(EndFeatures.AMBER_ORE) @@ -23,11 +26,13 @@ public class BiomeAmberLand extends EndBiome { .addFeature(EndFeatures.LANCELEAF) .addFeature(EndFeatures.GLOW_PILLAR) .addFeature(EndFeatures.AMBER_GRASS) + .addFeature(EndFeatures.AMBER_ROOT) .addFeature(EndFeatures.BULB_MOSS) .addFeature(EndFeatures.BULB_MOSS_WOOD) .addFeature(EndFeatures.CHARNIA_ORANGE) .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java similarity index 56% rename from src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java rename to src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index dc615281..8bd7c58c 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -1,19 +1,22 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeBlossomingSpires extends EndBiome { - public BiomeBlossomingSpires() { +public class BlossomingSpiresBiome extends EndBiome { + public BlossomingSpiresBiome() { super(new BiomeDefinition("blossoming_spires") .setFogColor(241, 146, 229) .setFogDensity(1.7F) .setPlantsColor(122, 45, 122) .setCaves(false) .setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_BLOSSOMING_SPIRES) + .setMusic(EndSounds.MUSIC_FOREST) .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) .addFeature(EndFeatures.SPIRE) .addFeature(EndFeatures.FLOATING_SPIRE) @@ -22,8 +25,11 @@ public class BiomeBlossomingSpires extends EndBiome { .addFeature(EndFeatures.BULB_VINE) .addFeature(EndFeatures.BUSHY_GRASS) .addFeature(EndFeatures.BUSHY_GRASS_WG) + .addFeature(EndFeatures.BLOSSOM_BERRY) .addFeature(EndFeatures.TWISTED_MOSS) .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + .addFeature(EndFeatures.SILK_MOTH_NEST) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java similarity index 53% rename from src/main/java/ru/betterend/world/biome/BiomeChorusForest.java rename to src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 92db643e..0e52fc83 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -1,17 +1,19 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.feature.ConfiguredFeatures; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.Features; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeChorusForest extends EndBiome { - public BiomeChorusForest() { +public class ChorusForestBiome extends EndBiome { + public ChorusForestBiome() { super(new BiomeDefinition("chorus_forest") .setFogColor(87, 26, 87) .setFogDensity(1.5F) @@ -20,20 +22,21 @@ public class BiomeChorusForest extends EndBiome { .setSurface(EndBlocks.CHORUS_NYLIUM) .setParticles(ParticleTypes.PORTAL, 0.01F) .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK) .addFeature(EndFeatures.VIOLECITE_LAYER) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.PYTHADENDRON_TREE) .addFeature(EndFeatures.PYTHADENDRON_BUSH) - .addFeature(EndFeatures.PURPLE_POLYPORE_DENSE) - .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) - .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) + .addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) + .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) .addFeature(EndFeatures.CHORUS_GRASS) + .addFeature(EndFeatures.CHORUS_MUSHROOM) .addFeature(EndFeatures.TAIL_MOSS) .addFeature(EndFeatures.TAIL_MOSS_WOOD) .addFeature(EndFeatures.CHARNIA_PURPLE) .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } diff --git a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java similarity index 59% rename from src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java rename to src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index aead7440..1b398d92 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -1,17 +1,19 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeCrystalMountains extends EndBiome { - public BiomeCrystalMountains() { +public class CrystalMountainsBiome extends EndBiome { + public CrystalMountainsBiome() { super(new BiomeDefinition("crystal_mountains") .setPlantsColor(255, 133, 211) .setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_CRYSTAL_MOUNTAINS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .addStructureFeature(EndStructures.MOUNTAIN) .addFeature(EndFeatures.ROUND_CAVE) .addFeature(EndFeatures.CRYSTAL_GRASS) diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java new file mode 100644 index 00000000..127d0799 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -0,0 +1,33 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class DragonGraveyardsBiome extends EndBiome { + public DragonGraveyardsBiome() { + super(new BiomeDefinition("dragon_graveyards") + .setGenChance(0.1F) + .setFogColor(244, 46, 79) + .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.0007F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.SANGNUM) + .setWaterAndFogColor(203, 59, 167) + .setPlantsColor(244, 46, 79) + .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .addFeature(EndFeatures.FALLEN_PILLAR) + .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addFeature(EndFeatures.GIGANTIC_AMARANITA) + .addFeature(EndFeatures.LARGE_AMARANITA) + .addFeature(EndFeatures.SMALL_AMARANITA) + .addFeature(EndFeatures.GLOBULAGUS) + .addFeature(EndFeatures.CLAWFERN) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java new file mode 100644 index 00000000..abec4ba5 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -0,0 +1,28 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class DryShrublandBiome extends EndBiome { + public DryShrublandBiome() { + super(new BiomeDefinition("dry_shrubland") + .setFogColor(132, 35, 13) + .setFogDensity(1.2F) + .setWaterAndFogColor(113, 88, 53) + .setPlantsColor(237, 122, 66) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.LUCERNIA_BUSH_RARE) + .addFeature(EndFeatures.ORANGO) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LUTEBUS) + .addFeature(EndFeatures.LAMELLARIUM) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java new file mode 100644 index 00000000..852127ac --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -0,0 +1,25 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class DustWastelandsBiome extends EndBiome { + public DustWastelandsBiome() { + super(new BiomeDefinition("dust_wastelands") + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setWaterAndFogColor(192, 180, 131) + .setSurface(EndBlocks.ENDSTONE_DUST) + .setDepth(1.5F) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java similarity index 74% rename from src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java rename to src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index ec9adfa0..8093795c 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,16 +1,18 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeFoggyMushroomland extends EndBiome { - public BiomeFoggyMushroomland() { +public class FoggyMushroomlandBiome extends EndBiome { + public FoggyMushroomlandBiome() { super(new BiomeDefinition("foggy_mushroomland") .setPlantsColor(73, 210, 209) .setFogColor(41, 122, 173) @@ -19,7 +21,7 @@ public class BiomeFoggyMushroomland extends EndBiome { .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOGGY_MUSHROOMLAND) + .setMusic(EndSounds.MUSIC_FOREST) .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.MOSSY_GLOWSHROOM) @@ -27,6 +29,7 @@ public class BiomeFoggyMushroomland extends EndBiome { .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.DENSE_VINE) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CYAN_MOSS) .addFeature(EndFeatures.CYAN_MOSS_WOOD) .addFeature(EndFeatures.END_LILY) @@ -34,7 +37,7 @@ public class BiomeFoggyMushroomland extends EndBiome { .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) .addMobSpawn(EndEntities.END_FISH, 20, 2, 5) .addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java new file mode 100644 index 00000000..ffef3fe9 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -0,0 +1,39 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class GlowingGrasslandsBiome extends EndBiome { + public GlowingGrasslandsBiome() { + super(new BiomeDefinition("glowing_grasslands") + .setFogColor(99, 228, 247) + .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.001F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.END_MOSS) + .setWaterAndFogColor(92, 250, 230) + .setPlantsColor(73, 210, 209) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.LUMECORN) + .addFeature(EndFeatures.BLOOMING_COOKSONIA) + .addFeature(EndFeatures.SALTEAGO) + .addFeature(EndFeatures.VAIOLUSH_FERN) + .addFeature(EndFeatures.FRACTURN) + .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) + .addFeature(EndFeatures.CREEPING_MOSS_RARE) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java new file mode 100644 index 00000000..ef96a8c1 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -0,0 +1,39 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class LanternWoodsBiome extends EndBiome { + public LanternWoodsBiome() { + super(new BiomeDefinition("lantern_woods") + .setFogColor(189, 82, 70) + .setFogDensity(1.1F) + .setWaterAndFogColor(171, 234, 226) + .setPlantsColor(254, 85, 57) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .addFeature(EndFeatures.END_LAKE_NORMAL) + .addFeature(EndFeatures.FLAMAEA) + .addFeature(EndFeatures.LUCERNIA) + .addFeature(EndFeatures.LUCERNIA_BUSH) + .addFeature(EndFeatures.FILALUX) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LAMELLARIUM) + .addFeature(EndFeatures.BOLUX_MUSHROOM) + .addFeature(EndFeatures.AURANT_POLYPORE) + .addFeature(EndFeatures.POND_ANEMONE) + .addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED) + .addFeature(EndFeatures.RUSCUS) + .addFeature(EndFeatures.RUSCUS_WOOD) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java similarity index 72% rename from src/main/java/ru/betterend/world/biome/BiomeMegalake.java rename to src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 24c77326..e5c29483 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -1,22 +1,25 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeMegalake extends EndBiome { - public BiomeMegalake() { +public class MegalakeBiome extends EndBiome { + public MegalakeBiome() { super(new BiomeDefinition("megalake") .setPlantsColor(73, 210, 209) .setFogColor(178, 209, 248) .setWaterAndFogColor(96, 163, 255) .setFogDensity(1.75F) - .setMusic(EndSounds.MUSIC_MEGALAKE) + .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE) .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) + .setDepth(0F) .addStructureFeature(EndStructures.MEGALAKE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) @@ -24,6 +27,7 @@ public class BiomeMegalake extends EndBiome { .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) @@ -31,6 +35,7 @@ public class BiomeMegalake extends EndBiome { .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java similarity index 71% rename from src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java rename to src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 2f02fbad..30c553ae 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -1,31 +1,35 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeMegalakeGrove extends EndBiome { - public BiomeMegalakeGrove() { +public class MegalakeGroveBiome extends EndBiome { + public MegalakeGroveBiome() { super(new BiomeDefinition("megalake_grove") .setPlantsColor(73, 210, 209) .setFogColor(178, 209, 248) .setWaterAndFogColor(96, 163, 255) .setFogDensity(2.0F) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_MEGALAKE) + .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setSurface(EndBlocks.END_MOSS) - .addStructureFeature(EndStructures.MEGALAKE) + .setDepth(0F) + .addStructureFeature(EndStructures.MEGALAKE_SMALL) .addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) .addFeature(EndFeatures.BUBBLE_CORAL_RARE) .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) @@ -34,6 +38,7 @@ public class BiomeMegalakeGrove extends EndBiome { .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java new file mode 100644 index 00000000..0d88d0cd --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -0,0 +1,33 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class NeonOasisBiome extends EndBiome { + public NeonOasisBiome() { + super(new BiomeDefinition("neon_oasis") + .setGenChance(0.5F) + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setWaterAndFogColor(106, 238, 215) + .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.DESERT_LAKE) + .addFeature(EndFeatures.NEON_CACTUS) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_RED) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java similarity index 58% rename from src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java rename to src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index 1aa00072..08e502a1 100644 --- a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -1,19 +1,21 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomePaintedMountains extends EndBiome { - public BiomePaintedMountains() { +public class PaintedMountainsBiome extends EndBiome { + public PaintedMountainsBiome() { super(new BiomeDefinition("painted_mountains") .setFogColor(226, 239, 168) .setFogDensity(2) .setCaves(false) .setWaterAndFogColor(192, 180, 131) - .setMusic(EndSounds.MUSIC_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) .setSurface(EndBlocks.ENDSTONE_DUST) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) diff --git a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java similarity index 71% rename from src/main/java/ru/betterend/world/biome/BiomeShadowForest.java rename to src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 5681fc6e..d27dc451 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -1,15 +1,17 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; -public class BiomeShadowForest extends EndBiome { - public BiomeShadowForest() { +public class ShadowForestBiome extends EndBiome { + public ShadowForestBiome() { super(new BiomeDefinition("shadow_forest") .setFogColor(0, 0, 0) .setFogDensity(2.5F) @@ -18,7 +20,7 @@ public class BiomeShadowForest extends EndBiome { .setSurface(EndBlocks.SHADOW_GRASS) .setParticles(ParticleTypes.MYCELIUM, 0.01F) .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_SHADOW_FOREST) + .setMusic(EndSounds.MUSIC_DARK) .addFeature(EndFeatures.VIOLECITE_LAYER) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.DRAGON_TREE) @@ -33,7 +35,7 @@ public class BiomeShadowForest extends EndBiome { .addFeature(EndFeatures.TAIL_MOSS_WOOD) .addFeature(EndFeatures.CHARNIA_PURPLE) .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4) .addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) .addMobSpawn(EntityType.PHANTOM, 1, 1, 2)); diff --git a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java similarity index 74% rename from src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java rename to src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 5ade846c..a1a50d00 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -1,23 +1,26 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.surface.SurfaceBuilders; -public class BiomeSulphurSprings extends EndBiome { - public BiomeSulphurSprings() { +public class SulphurSpringsBiome extends EndBiome { + public SulphurSpringsBiome() { super(new BiomeDefinition("sulphur_springs") .setSurface(SurfaceBuilders.SULPHURIC_SURFACE) - .setMusic(EndSounds.MUSIC_SULPHUR_SPRINGS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) .setWaterColor(25, 90, 157) .setWaterFogColor(30, 65, 61) .setFogColor(207, 194, 62) .setFogDensity(1.5F) .setCaves(false) + .setDepth(0F) .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) .addFeature(EndFeatures.GEYSER) .addFeature(EndFeatures.SURFACE_VENT) diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java new file mode 100644 index 00000000..9da34de6 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -0,0 +1,43 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class UmbrellaJungleBiome extends EndBiome { + public UmbrellaJungleBiome() { + super(new BiomeDefinition("umbrella_jungle") + .setFogColor(87, 223, 221) + .setWaterAndFogColor(119, 198, 253) + .setFoliageColor(27, 183, 194) + .setFogDensity(2.3F) + .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) + .setMusic(EndSounds.MUSIC_FOREST) + .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) + .setSurface(EndBlocks.JUNGLE_MOSS) + .addFeature(EndFeatures.END_LAKE) + .addFeature(EndFeatures.UMBRELLA_TREE) + .addFeature(EndFeatures.JELLYSHROOM) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) + .addFeature(EndFeatures.JUNGLE_GRASS) + .addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.JUNGLE_FERN_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) + .addFeature(EndFeatures.JUNGLE_VINE) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java new file mode 100644 index 00000000..4a3a44ba --- /dev/null +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -0,0 +1,72 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; + +public class BiomeIslandFeature extends DefaultFeature { + private static final MutableBlockPos CENTER = new MutableBlockPos(); + private static final SDF ISLAND; + + private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); + private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); + private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + Biome biome = world.getBiome(pos); + SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); + BlockState topMaterial = surfaceConfig.getTopMaterial(); + if (BlocksHelper.isFluid(topMaterial)) { + topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); + } else { + topBlock = topMaterial; + } + underBlock = surfaceConfig.getUnderMaterial(); + simplexNoise = new OpenSimplexNoise(world.getSeed()); + CENTER.set(pos); + ISLAND.fillRecursive(world, pos.below()); + return true; + } + + private static SDF createSDFIsland() { + SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { + if (pos.getY() > CENTER.getY()) + return AIR; + if (pos.getY() == CENTER.getY()) + return topBlock; + return underBlock; + }); + sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); + sdfCone = new SDFDisplacement().setFunction(pos -> { + float deltaX = Math.abs(pos.x()); + float deltaY = Math.abs(pos.y()); + float deltaZ = Math.abs(pos.z()); + if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) + return 0.0f; + return (float) simplexNoise.eval(CENTER.getX() + pos.x(), CENTER.getY() + pos.y(), CENTER.getZ() + pos.z()); + }).setSource(sdfCone) + .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); + return sdfCone; + } + + static { + ISLAND = createSDFIsland(); + } +} diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 79aa63ca..27452987 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -17,19 +17,19 @@ public class BlueVineFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; small = d > 0.5F; - return EndBlocks.BLUE_VINE_SEED.canPlaceAt(AIR, world, blockPos); + return EndBlocks.BLUE_VINE_SEED.canSurvive(AIR, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(BlockPlantWithAge.AGE, random.nextInt(4))); + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, random.nextInt(4))); } else { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.BLUE_VINE_SEED); + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); seed.growAdult(world, random, blockPos); } } diff --git a/src/main/java/ru/betterend/world/features/CavePlantFeature.java b/src/main/java/ru/betterend/world/features/CavePlantFeature.java index 59c8a8a7..760eafc2 100644 --- a/src/main/java/ru/betterend/world/features/CavePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePlantFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; import ru.betterend.util.BlocksHelper; public class CavePlantFeature extends FullHeightScatterFeature { @@ -16,12 +16,12 @@ public class CavePlantFeature extends FullHeightScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return plant.canPlaceAt(world.getBlockState(blockPos), world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return plant.canSurvive(world.getBlockState(blockPos), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java new file mode 100644 index 00000000..05d4788a --- /dev/null +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -0,0 +1,33 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; + +public class CavePumpkinFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.above()).is(EndTags.GEN_TERRAIN) || !world.isEmptyBlock(pos) + || !world.isEmptyBlock(pos.below())) { + return false; + } + + int age = random.nextInt(4); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().setValue(BlockProperties.AGE, age)); + if (age > 1) { + BlocksHelper.setWithoutUpdate(world, pos.below(), + EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, age < 3)); + } + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/CharniaFeature.java b/src/main/java/ru/betterend/world/features/CharniaFeature.java index 14102c4f..c8022a39 100644 --- a/src/main/java/ru/betterend/world/features/CharniaFeature.java +++ b/src/main/java/ru/betterend/world/features/CharniaFeature.java @@ -1,6 +1,6 @@ package ru.betterend.world.features; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; public class CharniaFeature extends UnderwaterPlantFeature { public CharniaFeature(Block plant) { diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 308429a7..66d34061 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -2,88 +2,131 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.BlockIgnoreStructureProcessor; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; public class CrashedShipFeature extends NBTStructureFeature { + private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; + private StructureTemplate structure; @Override - protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { - return StructureHelper.readStructure(STRUCTURE_PATH); + protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { + if (structure == null) { + structure = world.getLevel().getStructureManager().getOrCreate(new ResourceLocation("end_city/ship")); + if (structure == null) { + structure = StructureHelper.readStructure(STRUCTURE_PATH); + } + } + return structure; } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { - return pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { + long x = pos.getX() >> 4; + long z = pos.getX() >> 4; + if (x * x + z * z < 3600) { + return false; + } + return pos.getY() > 5 && world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN); } @Override - protected BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockRotation.random(random); + protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { + return Rotation.getRandom(random); } @Override - protected BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockMirror.values()[random.nextInt(3)]; + protected Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { + return Mirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random) { + protected int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random) { int min = structure.getSize().getY() >> 3; int max = structure.getSize().getY() >> 2; return -MHelper.randRange(min, max, random); } @Override - protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { + protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return TerrainMerge.NONE; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); - + BoundingBox bounds = makeBox(center); + if (!canSpawn(world, center, random)) { return false; } - - Structure structure = getStructure(world, center, random); - BlockRotation rotation = getRotation(world, center, random); - BlockMirror mirror = getMirror(world, center, random); - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror); - center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - - BlockBox bounds = makeBox(center); - BlockBox structB = structure.calculateBoundingBox(placementData, center); + + StructureTemplate structure = getStructure(world, center, random); + Rotation rotation = getRotation(world, center, random); + Mirror mirror = getMirror(world, center, random); + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror); + center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + + BoundingBox structB = structure.getBoundingBox(placementData, center); bounds = StructureHelper.intersectBoxes(bounds, structB); - + addStructureData(placementData); - structure.place(world, center, placementData.setBoundingBox(bounds), random); - + structure.placeInWorldChunk(world, center, placementData.setBoundingBox(bounds), random); + StructureHelper.erodeIntense(world, bounds, random); - BlocksHelper.fixBlocks(world, new BlockPos(bounds.minX, bounds.minY, bounds.minZ), new BlockPos(bounds.maxX, bounds.maxY, bounds.maxZ)); - + BlocksHelper.fixBlocks(world, new BlockPos(bounds.x0, bounds.y0, bounds.z0), + new BlockPos(bounds.x1, bounds.y1, bounds.z1)); + return true; } @Override - protected void addStructureData(StructurePlacementData data) { - data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).setIgnoreEntities(true); + protected void addStructureData(StructurePlaceSettings data) { + data.addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR).addProcessor(REPLACER).setIgnoreEntities(true); + } + + static { + REPLACER = new StructureProcessor() { + @Override + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, + StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, + StructurePlaceSettings structurePlacementData) { + BlockState state = structureBlockInfo2.state; + if (state.is(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { + return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); + } + return structureBlockInfo2; + } + + @Override + protected StructureProcessorType getType() { + return StructureProcessorType.NOP; + } + }; } } diff --git a/src/main/java/ru/betterend/world/features/DefaultFeature.java b/src/main/java/ru/betterend/world/features/DefaultFeature.java index adf0ff64..afaf1197 100644 --- a/src/main/java/ru/betterend/world/features/DefaultFeature.java +++ b/src/main/java/ru/betterend/world/features/DefaultFeature.java @@ -1,44 +1,44 @@ package ru.betterend.world.features; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; -public abstract class DefaultFeature extends Feature { - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - protected static final BlockState WATER = Blocks.WATER.getDefaultState(); +public abstract class DefaultFeature extends Feature { + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); public DefaultFeature() { - super(DefaultFeatureConfig.CODEC); + super(NoneFeatureConfiguration.CODEC); } - public static int getYOnSurface(StructureWorldAccess world, int x, int z) { - return world.getTopY(Type.WORLD_SURFACE, x, z); + public static int getYOnSurface(WorldGenLevel world, int x, int z) { + return world.getHeight(Types.WORLD_SURFACE, x, z); } - public static int getYOnSurfaceWG(StructureWorldAccess world, int x, int z) { - return world.getTopY(Type.WORLD_SURFACE_WG, x, z); + public static int getYOnSurfaceWG(WorldGenLevel world, int x, int z) { + return world.getHeight(Types.WORLD_SURFACE_WG, x, z); } - public static BlockPos getPosOnSurface(StructureWorldAccess world, BlockPos pos) { - return world.getTopPosition(Type.WORLD_SURFACE, pos); + public static BlockPos getPosOnSurface(WorldGenLevel world, BlockPos pos) { + return world.getHeightmapPos(Types.WORLD_SURFACE, pos); } - public static BlockPos getPosOnSurfaceWG(StructureWorldAccess world, BlockPos pos) { - return world.getTopPosition(Type.WORLD_SURFACE_WG, pos); + public static BlockPos getPosOnSurfaceWG(WorldGenLevel world, BlockPos pos) { + return world.getHeightmapPos(Types.WORLD_SURFACE_WG, pos); } - public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos) { + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceRaycast(world, pos, 256); } - public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos, int dist) { + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos, int dist) { int h = BlocksHelper.downRay(world, pos, dist); - return pos.down(h); + return pos.below(h); } } diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index a88fbcb4..9cd9a790 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -22,19 +22,19 @@ public class DoublePlantFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; plant = d < 0.5F ? largePlant : smallPlant; - return plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 23e81e3d..d9328029 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -1,23 +1,23 @@ package ru.betterend.world.features; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.structure.rule.BlockMatchRuleTest; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.gen.CountConfig; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.decorator.ChanceDecoratorConfig; -import net.minecraft.world.gen.decorator.Decorator; -import net.minecraft.world.gen.decorator.RangeDecoratorConfig; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredFeatures; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.Features; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.CountConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.RangeDecoratorConfiguration; +import net.minecraft.world.level.levelgen.placement.ChanceDecoratorConfiguration; +import net.minecraft.world.level.levelgen.placement.FeatureDecorator; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockMatchTest; import ru.betterend.BetterEnd; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.world.features.terrain.OreLayerFeature; @@ -25,57 +25,57 @@ import ru.betterend.world.features.terrain.OreLayerFeature; public class EndFeature { private Feature feature; private ConfiguredFeature featureConfigured; - private GenerationStep.Feature featureStep; + private GenerationStep.Decoration featureStep; protected EndFeature() {} - public EndFeature(Feature feature, ConfiguredFeature configuredFeature, GenerationStep.Feature featureStep) { + public EndFeature(Feature feature, ConfiguredFeature configuredFeature, GenerationStep.Decoration featureStep) { this.featureStep = featureStep; this.feature = feature; this.featureConfigured = configuredFeature; } - public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, ConfiguredFeature configuredFeature) { - Identifier id = BetterEnd.makeID(name); + public EndFeature(String name, Feature feature, GenerationStep.Decoration featureStep, ConfiguredFeature configuredFeature) { + ResourceLocation id = BetterEnd.makeID(name); this.featureStep = featureStep; this.feature = Registry.register(Registry.FEATURE, id, feature); this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, configuredFeature); } - public EndFeature(String name, Feature feature) { - Identifier id = BetterEnd.makeID(name); - this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; + public EndFeature(String name, Feature feature) { + ResourceLocation id = BetterEnd.makeID(name); + this.featureStep = GenerationStep.Decoration.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)))); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(100)))); } - public EndFeature(String name, Feature feature, int density) { - Identifier id = BetterEnd.makeID(name); - this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; + public EndFeature(String name, Feature feature, int density) { + ResourceLocation id = BetterEnd.makeID(name); + this.featureStep = GenerationStep.Decoration.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(density)); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configured(FeatureConfiguration.NONE).decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(density)); } - public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } - public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured); + public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.WATER_LAKE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.LAKES, configured); } public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) { EndFeature newFeature = new EndFeature(); - OreFeatureConfig featureConfig = new OreFeatureConfig(new BlockMatchRuleTest(Blocks.END_STONE), blockOre.getDefaultState(), veinSize); - RangeDecoratorConfig rangeDecorator = new RangeDecoratorConfig(offset, minY, maxY); - ConfiguredFeature oreFeature = Feature.ORE.configure(featureConfig) - .decorate(Decorator.RANGE.configure(rangeDecorator)) - .spreadHorizontally() - .repeat(veins); + OreConfiguration featureConfig = new OreConfiguration(new BlockMatchTest(Blocks.END_STONE), blockOre.defaultBlockState(), veinSize); + RangeDecoratorConfiguration rangeDecorator = new RangeDecoratorConfiguration(offset, minY, maxY); + ConfiguredFeature oreFeature = Feature.ORE.configured(featureConfig) + .decorated(FeatureDecorator.RANGE.configured(rangeDecorator)) + .squared() + .count(veins); newFeature.feature = Feature.ORE; - newFeature.featureStep = GenerationStep.Feature.UNDERGROUND_ORES; + newFeature.featureStep = GenerationStep.Decoration.UNDERGROUND_ORES; newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.makeID(name), oreFeature); return newFeature; @@ -83,35 +83,40 @@ public class EndFeature { public static EndFeature makeLayerFeature(String name, BlockState state, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(state, radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } public static EndFeature makeLayerFeature(String name, Block block, float radius, int minY, int maxY, int count) { - OreLayerFeature layer = new OreLayerFeature(block.getDefaultState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } public static EndFeature makeLayerFeature(String name, StoneMaterial material, float radius, int minY, int maxY, int count) { - OreLayerFeature layer = new OreLayerFeature(material.stone.getDefaultState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + OreLayerFeature layer = new OreLayerFeature(material.stone.defaultBlockState(), radius, minY, maxY); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } - public static EndFeature makeChunkFeature(String name, Feature feature) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(1))); - return new EndFeature(name, feature, GenerationStep.Feature.LOCAL_MODIFICATIONS, configured); + public static EndFeature makeChunkFeature(String name, Feature feature) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(1))); + return new EndFeature(name, feature, GenerationStep.Decoration.LOCAL_MODIFICATIONS, configured); } - public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.SURFACE_STRUCTURES, configured); + public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.SURFACE_STRUCTURES, configured); } - public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); + } + + public static EndFeature makeFeatureConfigured(String name, Feature feature) { + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } public Feature getFeature() { @@ -122,7 +127,7 @@ public class EndFeature { return featureConfigured; } - public GenerationStep.Feature getFeatureStep() { + public GenerationStep.Decoration getFeatureStep() { return featureStep; } } diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 8f5614c0..4ecbd3cf 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLilySeed; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; public class EndLilyFeature extends UnderwaterPlantScatter { @@ -13,8 +13,8 @@ public class EndLilyFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockEndLilySeed seed = (BlockEndLilySeed) EndBlocks.END_LILY_SEED; + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index af29b267..dc65d14a 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLotusSeed; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; public class EndLotusFeature extends UnderwaterPlantScatter { @@ -13,8 +13,8 @@ public class EndLotusFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockEndLotusSeed seed = (BlockEndLotusSeed) EndBlocks.END_LOTUS_SEED; + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index abd4f05e..207a20ae 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -2,14 +2,14 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLotusLeaf; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -19,7 +19,7 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (canGenerate(world, blockPos)) { generateLeaf(world, blockPos); } @@ -31,33 +31,33 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurface(world, pos); } - private void generateLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); - BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(BlockEndLotusLeaf.SHAPE, TripleShape.BOTTOM)); + private void generateLeaf(WorldGenLevel world, BlockPos pos) { + MutableBlockPos p = new MutableBlockPos(); + BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); + BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, move).with(BlockEndLotusLeaf.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } for (int i = 0; i < 4; i ++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, d1).with(BlockEndLotusLeaf.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { + MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; for (int x = -1; x < 2; x ++) { p.setX(pos.getX() + x); for (int z = -1; z < 2; z ++) { p.setZ(pos.getZ() + z); - if (world.isAir(p) && world.getBlockState(p.down()).isOf(Blocks.WATER)) + if (world.isEmptyBlock(p) && world.getBlockState(p.below()).is(Blocks.WATER)) count ++; } } @@ -65,7 +65,7 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos) && world.getBlockState(blockPos.down()).isOf(Blocks.WATER); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return world.isEmptyBlock(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); } } diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java new file mode 100644 index 00000000..e30c60de --- /dev/null +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -0,0 +1,39 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class FilaluxFeature extends SkyScatterFeature { + public FilaluxFeature() { + super(10); + } + + @Override + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + BlockState vine = EndBlocks.FILALUX.defaultBlockState(); + BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), wings.setValue(BlockStateProperties.FACING, Direction.UP)); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, blockPos.relative(dir), wings.setValue(BlockStateProperties.FACING, dir)); + } + int length = MHelper.randRange(1, 3, random); + for (int i = 1; i <= length; i++) { + TripleShape shape = length > 1 ? TripleShape.TOP : TripleShape.BOTTOM; + if (i > 1) { + shape = i == length ? TripleShape.BOTTOM : TripleShape.MIDDLE; + } + BlocksHelper.setWithoutUpdate(world, blockPos.below(i), vine.setValue(BlockProperties.TRIPLE_SHAPE, shape)); + } + } +} diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index b5b112f9..c1a37cda 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -2,34 +2,36 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class FullHeightScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public FullHeightScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, + float radius); + + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, center.getX(), center.getZ()); + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { POS.set(center.getX(), y, center.getZ()); - if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.down()).isAir()) { + if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.below()).isAir()) { float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random)); for (int i = 0; i < count; i++) { @@ -37,12 +39,13 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, y + 5, center.getZ() + z); int down = BlocksHelper.downRay(world, POS, 16); - if (down > 10) continue; + if (down > 10) + continue; POS.setY(POS.getY() - down); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index c14f5833..b8a1d6f2 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class GlowPillarFeature extends ScatterFeature { @@ -13,13 +13,13 @@ public class GlowPillarFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return EndBlocks.GLOWING_PILLAR_SEED.canPlaceAt(AIR, world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return EndBlocks.GLOWING_PILLAR_SEED.canSurvive(AIR, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.GLOWING_PILLAR_SEED); + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 48f4e46f..73d6b4ec 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockHydraluxSapling; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; public class HydraluxFeature extends UnderwaterPlantScatter { @@ -13,8 +13,8 @@ public class HydraluxFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockHydraluxSapling seed = (BlockHydraluxSapling) EndBlocks.HYDRALUX_SAPLING; + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 895fdc5a..6b9b7da8 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -2,34 +2,36 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class InvertedScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public InvertedScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, + float radius); + + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { POS.set(center.getX(), y, center.getZ()); - if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.up()).isAir()) { + if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.above()).isAir()) { float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(0.5F, 1.5F, random)); for (int i = 0; i < count; i++) { @@ -37,12 +39,13 @@ public abstract class InvertedScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() - 7, center.getZ() + z); int up = BlocksHelper.upRay(world, POS, 16); - if (up > 14) continue; + if (up > 14) + continue; POS.setY(POS.getY() + up); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 0fdb99a6..5800a71f 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class LanceleafFeature extends ScatterFeature { @@ -13,13 +13,13 @@ public class LanceleafFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return EndBlocks.LANCELEAF_SEED.canPlaceAt(AIR, world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return EndBlocks.LANCELEAF_SEED.canSurvive(AIR, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.LANCELEAF_SEED); + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index a2fd9143..899e16d0 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -3,13 +3,14 @@ package ru.betterend.world.features; import java.util.List; import java.util.Random; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.registry.EndTags; +import ru.betterend.util.StructureHelper; public class ListFeature extends NBTStructureFeature { private final List list; @@ -20,50 +21,59 @@ public class ListFeature extends NBTStructureFeature { } @Override - protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { + protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { selected = list.get(random.nextInt(list.size())); - return selected.structure; + return selected.getStructure(); } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { int cx = pos.getX() >> 4; int cz = pos.getZ() >> 4; - return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN); } @Override - protected BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockRotation.random(random); + protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { + return Rotation.getRandom(random); } @Override - protected BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockMirror.values()[random.nextInt(3)]; + protected Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { + return Mirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random) { + protected int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random) { return selected.offsetY; } @Override - protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { + protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return selected.terrainMerge; } @Override - protected void addStructureData(StructurePlacementData data) {} + protected void addStructureData(StructurePlaceSettings data) {} public static final class StructureInfo { public final TerrainMerge terrainMerge; - public final Structure structure; + public final String structurePath; public final int offsetY; - public StructureInfo(Structure structure, int offsetY, TerrainMerge terrainMerge) { + private StructureTemplate structure; + + public StructureInfo(String structurePath, int offsetY, TerrainMerge terrainMerge) { this.terrainMerge = terrainMerge; - this.structure = structure; + this.structurePath = structurePath; this.offsetY = offsetY; } + + public StructureTemplate getStructure() { + if (structure == null) { + structure = StructureHelper.readStructure(structurePath); + } + return structure; + } } } diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index 186fa664..2a859ab1 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -3,10 +3,10 @@ package ru.betterend.world.features; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -18,11 +18,11 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { for (Direction dir: BlocksHelper.DIRECTIONS) { - BlockPos pos = blockPos.offset(dir); + BlockPos pos = blockPos.relative(dir); if (REPLACE.apply(world.getBlockState(pos))) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.MENGER_SPONGE_WET); } @@ -32,7 +32,7 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { static { REPLACE = (state) -> { - if (state.isOf(EndBlocks.END_LOTUS_STEM)) { + if (state.is(EndBlocks.END_LOTUS_STEM)) { return false; } return !state.getFluidState().isEmpty() || state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index 2bb0dac0..8ca4639c 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -4,24 +4,24 @@ import java.io.IOException; import java.io.InputStream; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -29,35 +29,34 @@ import ru.betterend.world.processors.DestructionStructureProcessor; public abstract class NBTStructureFeature extends DefaultFeature { protected static final DestructionStructureProcessor DESTRUCTION = new DestructionStructureProcessor(); - - protected abstract Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract void addStructureData(StructurePlacementData data); - - protected BlockPos getGround(StructureWorldAccess world, BlockPos center) { + + protected abstract StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random); + + protected abstract boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random); + + protected abstract Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random); + + protected abstract Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random); + + protected abstract int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random); + + protected abstract TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random); + + protected abstract void addStructureData(StructurePlaceSettings data); + + protected BlockPos getGround(WorldGenLevel world, BlockPos center) { Biome biome = world.getBiome(center); - Identifier id = EndBiomes.getBiomeID(biome); + ResourceLocation id = EndBiomes.getBiomeID(biome); if (id.getNamespace().contains("moutain") || id.getNamespace().contains("lake")) { int y = getAverageY(world, center); return new BlockPos(center.getX(), y, center.getZ()); - } - else { + } else { int y = getAverageYWG(world, center); return new BlockPos(center.getX(), y, center.getZ()); } } - - protected int getAverageY(StructureWorldAccess world, BlockPos center) { + + protected int getAverageY(WorldGenLevel world, BlockPos center) { int y = getYOnSurface(world, center.getX(), center.getZ()); y += getYOnSurface(world, center.getX() - 2, center.getZ() - 2); y += getYOnSurface(world, center.getX() + 2, center.getZ() - 2); @@ -65,8 +64,8 @@ public abstract class NBTStructureFeature extends DefaultFeature { y += getYOnSurface(world, center.getX() + 2, center.getZ() + 2); return y / 5; } - - protected int getAverageYWG(StructureWorldAccess world, BlockPos center) { + + protected int getAverageYWG(WorldGenLevel world, BlockPos center) { int y = getYOnSurfaceWG(world, center.getX(), center.getZ()); y += getYOnSurfaceWG(world, center.getX() - 2, center.getZ() - 2); y += getYOnSurfaceWG(world, center.getX() + 2, center.getZ() - 2); @@ -74,49 +73,51 @@ public abstract class NBTStructureFeature extends DefaultFeature { y += getYOnSurfaceWG(world, center.getX() + 2, center.getZ() + 2); return y / 5; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); - + if (!canSpawn(world, center, random)) { return false; } - + int posY = center.getY() + 1; - Structure structure = getStructure(world, center, random); - BlockRotation rotation = getRotation(world, center, random); - BlockMirror mirror = getMirror(world, center, random); - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); - - BlockBox bounds = makeBox(center); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + StructureTemplate structure = getStructure(world, center, random); + Rotation rotation = getRotation(world, center, random); + Mirror mirror = getMirror(world, center, random); + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); + + BoundingBox bounds = makeBox(center); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror) + .setBoundingBox(bounds); addStructureData(placementData); - center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - structure.place(world, center, placementData, random); - + center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + structure.placeInWorldChunk(world, center, placementData, random); + TerrainMerge merge = getTerrainMerge(world, center, random); int x1 = center.getX(); int z1 = center.getZ(); int x2 = x1 + offset.getX(); int z2 = z1 + offset.getZ(); if (merge != TerrainMerge.NONE) { - Mutable mut = new Mutable(); - + MutableBlockPos mut = new MutableBlockPos(); + if (x2 < x1) { int a = x1; x1 = x2; x2 = a; } - + if (z2 < z1) { int a = z1; z1 = z2; z2 = a; } - + int surfMax = posY - 1; for (int x = x1; x <= x2; x++) { mut.setX(x); @@ -124,28 +125,27 @@ public abstract class NBTStructureFeature extends DefaultFeature { mut.setZ(z); mut.setY(surfMax); BlockState state = world.getBlockState(mut); - if (!state.isIn(EndTags.GEN_TERRAIN) && state.isSideSolidFullSquare(world, mut, Direction.DOWN)) { + if (!state.is(EndTags.GEN_TERRAIN) && state.isFaceSturdy(world, mut, Direction.DOWN)) { for (int i = 0; i < 10; i++) { mut.setY(mut.getY() - 1); BlockState stateSt = world.getBlockState(mut); - if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { + if (!stateSt.is(EndTags.GEN_TERRAIN)) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); - boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); + SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings() + .getSurfaceBuilderConfig(); + boolean isTop = mut.getY() == surfMax && state.getMaterial().isSolidBlocking(); BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); BlocksHelper.setWithoutUpdate(world, mut, top); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, state); } - } - else { - if (stateSt.isIn(EndTags.END_GROUND) && state.getMaterial().blocksLight()) { + } else { + if (stateSt.is(EndTags.END_GROUND) && state.getMaterial().isSolidBlocking()) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); + SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings() + .getSurfaceBuilderConfig(); BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, state); } } @@ -156,56 +156,53 @@ public abstract class NBTStructureFeature extends DefaultFeature { } } } - BlocksHelper.fixBlocks(world, new BlockPos(x1, center.getY(), z1), new BlockPos(x2, center.getY() + offset.getY(), z2)); - + BlocksHelper.fixBlocks(world, new BlockPos(x1, center.getY(), z1), + new BlockPos(x2, center.getY() + offset.getY(), z2)); + return true; } - - protected BlockBox makeBox(BlockPos pos) { + + protected BoundingBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; int ex = sx + 47; int ez = sz + 47; - return BlockBox.create(sx, 0, sz, ex, 255, ez); + return BoundingBox.createProper(sx, 0, sz, ex, 255, ez); } - - protected static Structure readStructure(Identifier resource) { + + protected static StructureTemplate readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); try { - InputStream inputstream = MinecraftServer.class.getResourceAsStream("/data/" + ns + "/structures/" + nm + ".nbt"); + InputStream inputstream = MinecraftServer.class + .getResourceAsStream("/data/" + ns + "/structures/" + nm + ".nbt"); return readStructureFromStream(inputstream); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } return null; } - - private static Structure readStructureFromStream(InputStream stream) throws IOException { + + private static StructureTemplate readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); - Structure template = new Structure(); - template.fromTag(nbttagcompound); + StructureTemplate template = new StructureTemplate(); + template.load(nbttagcompound); return template; } - + public static enum TerrainMerge { - NONE, - SURFACE, - OBJECT; - + NONE, SURFACE, OBJECT; + public static TerrainMerge getFromString(String type) { if (type.equals("surface")) { return SURFACE; - } - else if (type.equals("object")) { + } else if (type.equals("object")) { return OBJECT; - } - else { + } else { return NONE; } } diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java new file mode 100644 index 00000000..a4bfcd80 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -0,0 +1,26 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.NeonCactusPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class NeonCactusFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + BlockState ground = world.getBlockState(pos.below()); + if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { + return false; + } + + NeonCactusPlantBlock cactus = ((NeonCactusPlantBlock) EndBlocks.NEON_CACTUS); + cactus.growPlant(world, pos, random); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java deleted file mode 100644 index c9f65566..00000000 --- a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.betterend.world.features; - -import java.util.Random; - -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFCapedCone; - -public class OverworldIslandFeature extends DefaultFeature { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(412); - private static final Mutable CENTER = new Mutable(); - private static final SDF FUNCTION; - - @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - CENTER.set(pos); - FUNCTION.fillRecursive(world, pos.down()); - return true; - } - - static { - SDF cone = new SDFCapedCone().setRadius1(0).setRadius2(4).setHeight(4).setBlock(Blocks.STONE); - cone = new SDFTranslate().setTranslate(0, -3, 0).setSource(cone); - cone = new SDFDisplacement().setFunction((pos) -> { - return (float) NOISE.eval(CENTER.getX() + pos.getX(), CENTER.getY() + pos.getY(), CENTER.getZ() + pos.getZ()); - }); - FUNCTION = cone; - } -} diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 56086199..fad40d0e 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -2,42 +2,42 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class ScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public ScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, + float radius); + + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); + + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceWG(world, pos); } - - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { + + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { if (pos.getY() < 5) { return false; - } - else if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + } else if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { return false; } return true; } - - protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { int down = BlocksHelper.downRay(world, pos, 16); if (down > Math.abs(getYOffset() * 2)) { return false; @@ -45,23 +45,24 @@ public abstract class ScatterFeature extends DefaultFeature { pos.setY(pos.getY() - down); return true; } - + protected int getYOffset() { return 5; } - + protected int getChance() { return 1; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = getCenterGround(world, center); - + if (!canSpawn(world, center)) { return false; } - + float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random)); for (int i = 0; i < count; i++) { @@ -69,13 +70,14 @@ public abstract class ScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() + getYOffset(), center.getZ() + z); - if (getGroundPlant(world, POS) && canGenerate(world, random, center, POS, r) && (getChance() < 2 || random.nextInt(getChance()) == 0)) { + if (getGroundPlant(world, POS) && canGenerate(world, random, center, POS, r) + && (getChance() < 2 || random.nextInt(getChance()) == 0)) { generate(world, random, POS); } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java new file mode 100644 index 00000000..0fbac2e2 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -0,0 +1,58 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class SilkMothNestFeature extends DefaultFeature { + private static final MutableBlockPos POS = new MutableBlockPos(); + + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { + BlockState state = world.getBlockState(pos.above()); + if (state.is(BlockTags.LEAVES) || state.is(BlockTags.LOGS)) { + state = world.getBlockState(pos); + if ((state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isEmptyBlock(pos.below())) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (world.getBlockState(pos.below().relative(dir)).getMaterial().blocksMotion()) { + return false; + } + return true; + } + } + } + return false; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); + int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); + POS.set(center); + for (int y = maxY; y > minY; y--) { + POS.setY(y); + if (canGenerate(world, POS)) { + Direction dir = BlocksHelper.randomHorizontal(random); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() + .setValue(BlockStateProperties.HORIZONTAL_FACING, dir).setValue(BlockProperties.ACTIVE, false)); + POS.setY(y - 1); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() + .setValue(BlockStateProperties.HORIZONTAL_FACING, dir)); + return true; + } + } + return false; + } +} diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java new file mode 100644 index 00000000..2f91ca33 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -0,0 +1,42 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.util.BlocksHelper; + +public class SingleInvertedScatterFeature extends InvertedScatterFeature { + private final Block block; + + public SingleInvertedScatterFeature(Block block, int radius) { + super(radius); + this.block = block; + } + + @Override + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + if (!world.isEmptyBlock(blockPos)) { + return false; + } + BlockState state = block.defaultBlockState(); + if (block instanceof AttachedBlock) { + state = state.setValue(BlockStateProperties.FACING, Direction.DOWN); + } + return state.canSurvive(world, blockPos); + } + + @Override + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + BlockState state = block.defaultBlockState(); + if (block instanceof AttachedBlock) { + state = state.setValue(BlockStateProperties.FACING, Direction.DOWN); + } + BlocksHelper.setWithoutUpdate(world, blockPos, state); + } +} diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 89033266..fd58b83f 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -2,12 +2,13 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndCropBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.util.BlocksHelper; public class SinglePlantFeature extends ScatterFeature { @@ -39,26 +40,30 @@ public class SinglePlantFeature extends ScatterFeature { } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return rawHeightmap ? getPosOnSurfaceWG(world, pos) : getPosOnSurface(world, pos); } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); } - else if (plant instanceof BlockPlantWithAge) { + else if (plant instanceof EndCropBlock) { + BlockState state = plant.defaultBlockState().setValue(EndCropBlock.AGE, 3); + BlocksHelper.setWithoutUpdate(world, blockPos, state); + } + else if (plant instanceof EndPlantWithAgeBlock) { int age = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockPlantWithAge.AGE, age); + BlockState state = plant.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, age); BlocksHelper.setWithoutUpdate(world, blockPos, state); } else { diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java new file mode 100644 index 00000000..1ca53a94 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -0,0 +1,54 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public abstract class SkyScatterFeature extends ScatterFeature { + public SkyScatterFeature(int radius) { + super(radius); + } + + @Override + protected int getChance() { + return 10; + } + + @Override + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + if (!world.isEmptyBlock(blockPos)) { + return false; + } + + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (!world.isEmptyBlock(blockPos.relative(dir))) { + return false; + } + } + + int maxD = getYOffset() + 2; + int maxV = getYOffset() - 2; + + return BlocksHelper.upRay(world, blockPos, maxD) > maxV && BlocksHelper.downRay(world, blockPos, maxD) > maxV; + } + + @Override + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { + return true; + } + + @Override + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { + return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); + } + + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { + pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index b24d94bd..9ee99007 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; public class UnderwaterPlantFeature extends UnderwaterPlantScatter { @@ -18,17 +18,17 @@ public class UnderwaterPlantFeature extends UnderwaterPlantScatter { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return super.canSpawn(world, blockPos) && plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return super.canSpawn(world, blockPos) && plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index 9af618c4..c97f15df 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -2,38 +2,38 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; public abstract class UnderwaterPlantScatter extends ScatterFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); public UnderwaterPlantScatter(int radius) { super(radius); } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { POS.setX(pos.getX()); POS.setZ(pos.getZ()); POS.setY(0); - return getGround(world, POS).toImmutable(); + return getGround(world, POS).immutable(); } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.getBlockState(blockPos).isOf(Blocks.WATER); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return world.getBlockState(blockPos).is(Blocks.WATER); } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { - return world.getBlockState(pos).isOf(Blocks.WATER); + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { + return world.getBlockState(pos).is(Blocks.WATER); } @Override - protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { return getGround(world, pos).getY() < 128; } @@ -47,7 +47,7 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { return 5; } - private BlockPos getGround(StructureWorldAccess world, Mutable pos) { + private BlockPos getGround(WorldGenLevel world, MutableBlockPos pos) { while (pos.getY() < 128 && world.getFluidState(pos).isEmpty()) { pos.setY(pos.getY() + 1); } diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 362a31b2..8e31591a 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -2,37 +2,69 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.util.BlocksHelper; public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; + private final boolean vine; public VineFeature(Block vineBlock, int maxLength) { super(6); this.vineBlock = vineBlock; this.maxLength = maxLength; + this.vine = vineBlock instanceof VineBlock; } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos) && vineBlock.canPlaceAt(AIR, world, blockPos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { + BlockState state = world.getBlockState(blockPos); + return state.getMaterial().isReplaceable() && canPlaceBlock(state, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)) - 1; if (h > 2) { - BlocksHelper.setWithoutUpdate(world, blockPos, vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlockState top = getTopState(); + BlockState middle = getMiggleState(); + BlockState bottom = getBottomState(); + BlocksHelper.setWithoutUpdate(world, blockPos, top); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, blockPos.down(i), vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, blockPos.below(i), middle); } - BlocksHelper.setWithoutUpdate(world, blockPos.down(h), vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, blockPos.below(h), bottom); } } + + private boolean canPlaceBlock(BlockState state, WorldGenLevel world, BlockPos blockPos) { + if (vine) { + return ((VineBlock) vineBlock).canGenerate(state, world, blockPos); + } + else { + return vineBlock.canSurvive(state, world, blockPos); + } + } + + private BlockState getTopState() { + BlockState state = vineBlock.defaultBlockState(); + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; + } + + private BlockState getMiggleState() { + BlockState state = vineBlock.defaultBlockState(); + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; + } + + private BlockState getBottomState() { + BlockState state = vineBlock.defaultBlockState(); + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; + } } diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 5c42152e..8d38ffaf 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -2,12 +2,14 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockWallPlant; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.util.BlocksHelper; public class WallPlantFeature extends WallScatterFeature { @@ -19,14 +21,27 @@ public class WallPlantFeature extends WallScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); - return block.canPlaceAt(state, world, pos); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { + if (block instanceof EndWallPlantBlock) { + BlockState state = block.defaultBlockState().setValue(EndWallPlantBlock.FACING, dir); + return block.canSurvive(state, world, pos); + } + else if (block instanceof AttachedBlock) { + BlockState state = block.defaultBlockState().setValue(BlockStateProperties.FACING, dir); + return block.canSurvive(state, world, pos); + } + return block.canSurvive(block.defaultBlockState(), world, pos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); + public void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { + BlockState state = block.defaultBlockState(); + if (block instanceof EndWallPlantBlock) { + state = state.setValue(EndWallPlantBlock.FACING, dir); + } + else if (block instanceof AttachedBlock) { + state = state.setValue(BlockStateProperties.FACING, dir); + } BlocksHelper.setWithoutUpdate(world, pos, state); } } diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index c00159f2..7ca5cb1e 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -2,12 +2,12 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; public class WallPlantOnLogFeature extends WallPlantFeature { public WallPlantOnLogFeature(Block block, int radius) { @@ -15,9 +15,9 @@ public class WallPlantOnLogFeature extends WallPlantFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockPos blockPos = pos.offset(dir.getOpposite()); + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { + BlockPos blockPos = pos.relative(dir.getOpposite()); BlockState blockState = world.getBlockState(blockPos); - return blockState.isIn(BlockTags.LOGS); + return blockState.is(BlockTags.LOGS); } } diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 38e63bf4..977122bf 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -2,47 +2,47 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class WallScatterFeature extends DefaultFeature { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private final int radius; - + public WallScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); - - public abstract void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); + + public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { return false; } int py = MHelper.randRange(minY, maxY, random); - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); for (int x = -radius; x <= radius; x++) { mut.setX(center.getX() + x); for (int y = -radius; y <= radius; y++) { mut.setY(py + y); for (int z = -radius; z <= radius; z++) { mut.setZ(center.getZ() + z); - if (random.nextInt(4) == 0 && world.isAir(mut)) { + if (random.nextInt(4) == 0 && world.isEmptyBlock(mut)) { shuffle(random); - for (Direction dir: DIR) { + for (Direction dir : DIR) { if (canGenerate(world, random, mut, dir)) { generate(world, random, mut, dir); break; @@ -52,10 +52,10 @@ public abstract class WallScatterFeature extends DefaultFeature { } } } - + return true; } - + private void shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index 2e17a8f7..740f853e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -3,15 +3,15 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -28,31 +28,38 @@ public class BushFeature extends DefaultFeature { private static final Function REPLACE; private final Block leaves; private final Block stem; - + public BushFeature(Block leaves, Block stem) { this.leaves = leaves; this.stem = stem; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND) + && !world.getBlockState(pos.above()).getBlock().is(EndTags.END_GROUND)) + return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getPos().getManhattanDistance(pos); + int distance = info.getPos().distManhattan(pos); if (distance < 7) { - return info.getState().with(LeavesBlock.DISTANCE, distance); - } - else { + return info.getState().setValue(LeavesBlock.DISTANCE, distance); + } else { return AIR; } } @@ -60,16 +67,21 @@ public class BushFeature extends DefaultFeature { }); sphere.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, stem); - for (Direction d: Direction.values()) { - BlockPos p = pos.offset(d); - if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); + if (world.isEmptyBlock(p)) { + if (leaves instanceof LeavesBlock) { + BlocksHelper.setWithoutUpdate(world, p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); + } else { + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); + } } } - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java new file mode 100644 index 00000000..79713f00 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -0,0 +1,108 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class BushWithOuterFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); + private static final Function REPLACE; + private final Block outer_leaves; + private final Block leaves; + private final Block stem; + + public BushWithOuterFeature(Block leaves, Block outer_leaves, Block stem) { + this.outer_leaves = outer_leaves; + this.leaves = leaves; + this.stem = stem; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND) + && !world.getBlockState(pos.above()).getBlock().is(EndTags.END_GROUND)) + return false; + + float radius = MHelper.randRange(1.8F, 3.5F, random); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); + sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere.setReplaceFunction(REPLACE); + sphere.addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getPos().distManhattan(pos); + if (distance < 7) { + return info.getState().setValue(LeavesBlock.DISTANCE, distance); + } else { + return AIR; + } + } + return info.getState(); + }).addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + MHelper.shuffle(DIRECTIONS, random); + for (Direction dir : DIRECTIONS) { + if (info.getState(dir).isAir()) { + info.setBlockPos(info.getPos().relative(dir), + outer_leaves.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); + } + } + } + return info.getState(); + }); + sphere.fillRecursive(world, pos); + BlocksHelper.setWithoutUpdate(world, pos, stem); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); + if (world.isEmptyBlock(p)) { + if (leaves instanceof LeavesBlock) { + BlocksHelper.setWithoutUpdate(world, p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); + } else { + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); + } + } + } + + return true; + } + + static { + REPLACE = (state) -> { + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java deleted file mode 100644 index 75ace9c2..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.FullHeightScatterFeature; - -public class CaveBushFeature extends FullHeightScatterFeature { - public CaveBushFeature(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.getBlockState(blockPos.down()).isOf(EndBlocks.CAVE_MOSS); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(0.8F, 2.5F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos); - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java deleted file mode 100644 index fac99a1b..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.InvertedScatterFeature; - -public class CaveBushFeatureCeil extends InvertedScatterFeature { - public CaveBushFeatureCeil(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos.down()) - && world.getBlockState(blockPos.up()).isIn(EndTags.GEN_TERRAIN) - && world.getBlockState(blockPos.down(BlocksHelper.downRay(world, blockPos.down(), 64) + 2)).isIn(EndTags.GEN_TERRAIN); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(1.0F, 3.2F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos.down()); - BlocksHelper.setWithoutUpdate(world, blockPos.down(), EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java new file mode 100644 index 00000000..3b5de04e --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -0,0 +1,48 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class LargeAmaranitaFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + MutableBlockPos mut = new MutableBlockPos().set(pos); + int height = MHelper.randRange(2, 3, random); + for (int i = 1; i < height; i++) { + mut.setY(mut.getY() + 1); + if (!world.isEmptyBlock(mut)) { + return false; + } + } + mut.set(pos); + + BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.defaultBlockState(); + BlocksHelper.setWithUpdate(world, mut, state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + if (height > 2) { + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + } + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java new file mode 100644 index 00000000..5598f080 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -0,0 +1,69 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.BlockProperties.LumecornShape; +import ru.betterend.blocks.LumecornBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class Lumecorn extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + int height = MHelper.randRange(4, 7, random); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 1; i < height; i++) { + mut.move(Direction.UP); + if (!world.isEmptyBlock(mut)) { + return false; + } + } + mut.set(pos); + BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, + LumecornShape.LIGHT_TOP_MIDDLE); + BlockState middle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, + LumecornShape.LIGHT_MIDDLE); + BlockState bottom = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, + LumecornShape.LIGHT_BOTTOM); + BlockState top = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); + if (height == 4) { + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); + return true; + } + if (random.nextBoolean()) { + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + } else { + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); + height--; + } + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); + for (int i = 4; i < height; i++) { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), middle); + } + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); + return false; + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index f6134344..a6beb01d 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -6,18 +6,18 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -34,74 +34,84 @@ import ru.betterend.world.features.DefaultFeature; public class TenaneaBushFeature extends DefaultFeature { private static final Function REPLACE; private static final Direction[] DIRECTIONS = Direction.values(); - - public TenaneaBushFeature() {} - + + public TenaneaBushFeature() { + } + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - BlockState leaves = EndBlocks.TENANEA_LEAVES.getDefaultState(); + BlockState leaves = EndBlocks.TENANEA_LEAVES.defaultBlockState(); SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); List support = Lists.newArrayList(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getPos().getManhattanDistance(pos); + int distance = info.getPos().distManhattan(pos); if (distance < 7) { if (random.nextInt(4) == 0 && info.getStateDown().isAir()) { - BlockPos d = info.getPos().down(); + BlockPos d = info.getPos().below(); support.add(d); } - + MHelper.shuffle(DIRECTIONS, random); - for (Direction d: DIRECTIONS) { + for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState().with(BlockFur.FACING, d)); + info.setBlockPos(info.getPos().relative(d), + EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().setValue(FurBlock.FACING, d)); } } - - return info.getState().with(LeavesBlock.DISTANCE, distance); - } - else { + + return info.getState().setValue(LeavesBlock.DISTANCE, distance); + } else { return AIR; } } return info.getState(); }); sphere.fillRecursive(world, pos); - BlockState stem = EndBlocks.TENANEA.bark.getDefaultState(); + BlockState stem = EndBlocks.TENANEA.bark.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, stem); - for (Direction d: Direction.values()) { - BlockPos p = pos.offset(d); - if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, leaves.with(LeavesBlock.DISTANCE, 1)); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves.setValue(LeavesBlock.DISTANCE, 1)); } } - - Mutable mut = new Mutable(); - BlockState top = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); + + MutableBlockPos mut = new MutableBlockPos(); + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); - if (state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) { + if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).isOf(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.above()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.down())) { + if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } - else { + } else { break; } } @@ -109,10 +119,10 @@ public class TenaneaBushFeature extends DefaultFeature { } } }); - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java new file mode 100644 index 00000000..25e2de29 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -0,0 +1,49 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.primitive.SDFHexPrism; +import ru.betterend.world.features.DefaultFeature; + +public class BigAuroraCrystalFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); + int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); + + if (maxY - minY < 10) { + return false; + } + + int y = MHelper.randRange(minY, maxY, random); + pos = new BlockPos(pos.getX(), y, pos.getZ()); + + int height = MHelper.randRange(5, 25, random); + SDF prism = new SDFHexPrism().setHeight(height).setRadius(MHelper.randRange(1.7F, 3F, random)) + .setBlock(EndBlocks.AURORA_CRYSTAL); + Vector3f vec = MHelper.randomHorizontal(random); + prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); + prism.setReplaceFunction((bState) -> { + return bState.getMaterial().isReplaceable() || bState.is(EndTags.GEN_TERRAIN) + || bState.getMaterial().equals(Material.PLANT) || bState.getMaterial().equals(Material.LEAVES); + }); + prism.fillRecursive(world, pos); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java new file mode 100644 index 00000000..82f9feb8 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -0,0 +1,210 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class DesertLakeFeature extends DefaultFeature { + private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); + private static final MutableBlockPos POS = new MutableBlockPos(); + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + double radius = MHelper.randRange(8.0, 15.0, random); + double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); + int dist = MHelper.floor(radius); + int dist2 = MHelper.floor(radius * 1.5); + int bott = MHelper.floor(depth); + blockPos = getPosOnSurfaceWG(world, blockPos); + + if (blockPos.getY() < 10) return false; + + int waterLevel = blockPos.getY(); + + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + BlockState state; + + int minX = blockPos.getX() - dist2; + int maxX = blockPos.getX() + dist2; + int minZ = blockPos.getZ() - dist2; + int maxZ = blockPos.getZ() + dist2; + int maskMinX = minX - 1; + int maskMinZ = minZ - 1; + + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; + for (int x = minX; x <= maxX; x++) { + POS.setX(x); + int mx = x - maskMinX; + for (int z = minZ; z <= maxZ; z++) { + POS.setZ(z); + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + for (int y = waterLevel + 1; y <= waterLevel + 20; y++) { + POS.setY(y); + FluidState fluid = world.getFluidState(POS); + if (!fluid.isEmpty()) { + for (int i = -1; i < 2; i++) { + int px = mx + i; + for (int j = -1; j < 2; j++) { + int pz = mz + j; + mask[px][pz] = true; + } + } + break; + } + } + } + } + } + + for (int x = minX; x <= maxX; x++) { + POS.setX(x); + int x2 = x - blockPos.getX(); + x2 *= x2; + int mx = x - maskMinX; + for (int z = minZ; z <= maxZ; z++) { + POS.setZ(z); + int z2 = z - blockPos.getZ(); + z2 *= z2; + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + double size = 1; + for (int y = blockPos.getY(); y <= blockPos.getY() + 20; y++) { + POS.setY(y); + double add = y - blockPos.getY(); + if (add > 5) { + size *= 0.8; + add = 5; + } + double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; + if (r > 0) { + r *= r; + if (x2 + z2 <= r) { + state = world.getBlockState(POS); + if (state.is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, POS, AIR); + } + pos = POS.below(); + if (world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { + state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + if (y > waterLevel + 1) + BlocksHelper.setWithoutUpdate(world, pos, state); + else if (y > waterLevel) + BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + else + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + } + } + } + else { + break; + } + } + } + } + } + + double aspect = ((double) radius / (double) depth); + + for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { + POS.setX(x); + int x2 = x - blockPos.getX(); + x2 *= x2; + int mx = x - maskMinX; + for (int z = blockPos.getZ() - dist; z <= blockPos.getZ() + dist; z++) { + POS.setZ(z); + int z2 = z - blockPos.getZ(); + z2 *= z2; + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + for (int y = blockPos.getY() - bott; y < blockPos.getY(); y++) { + POS.setY(y); + double y2 = (double) (y - blockPos.getY()) * aspect; + y2 *= y2; + double r = radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75); + double rb = r * 1.2; + r *= r; + rb *= rb; + if (y2 + x2 + z2 <= r) { + state = world.getBlockState(POS); + if (canReplace(state)) { + state = world.getBlockState(POS.above()); + state = canReplace(state) ? (y < waterLevel ? WATER : AIR) : state; + BlocksHelper.setWithoutUpdate(world, POS, state); + } + pos = POS.below(); + if (world.getBlockState(pos).getBlock().is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + } + pos = POS.above(); + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { + BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); + pos = pos.above(); + } + } + // Make border + else if (y2 + x2 + z2 <= rb) { + state = world.getBlockState(POS); + if (state.is(EndTags.GEN_TERRAIN) && world.isEmptyBlock(POS.above())) { + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.END_MOSS); + } + else if (y < waterLevel) { + if (world.isEmptyBlock(POS.above())) { + state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); + } + else { + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); + } + } + } + } + } + } + } + + BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); + + return true; + } + + private boolean canReplace(BlockState state) { + return state.getMaterial().isReplaceable() + || state.is(EndTags.GEN_TERRAIN) + || state.is(EndBlocks.ENDSTONE_DUST) + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.WATER_PLANT) + || state.getMaterial().equals(Material.CORAL); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 8c6bbed3..e083d61f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -2,15 +2,15 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -19,46 +19,47 @@ import ru.betterend.util.MHelper; import ru.betterend.world.features.DefaultFeature; public class EndLakeFeature extends DefaultFeature { - private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState(); + private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); int dist2 = MHelper.floor(radius * 1.5); int bott = MHelper.floor(depth); blockPos = getPosOnSurfaceWG(world, blockPos); + if (blockPos.getY() < 10) return false; - + int waterLevel = blockPos.getY(); - - BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).up(10), 20); + + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - - pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).up(10), 20); + + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - - pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).up(10), 20); + + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - - pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).up(10), 20); + + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); BlockState state; - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; int maskMinX = minX - 1; int maskMinZ = minZ - 1; - + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -84,7 +85,7 @@ public class EndLakeFeature extends DefaultFeature { } } } - + for (int x = minX; x <= maxX; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -109,18 +110,18 @@ public class EndLakeFeature extends DefaultFeature { r *= r; if (x2 + z2 <= r) { state = world.getBlockState(POS); - if (state.isIn(EndTags.GEN_TERRAIN)) { + if (state.is(EndTags.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } - pos = POS.down(); - if (world.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + pos = POS.below(); + if (world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { + state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) - BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); else - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } } } @@ -131,7 +132,7 @@ public class EndLakeFeature extends DefaultFeature { } } } - + double aspect = ((double) radius / (double) depth); for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { @@ -156,49 +157,48 @@ public class EndLakeFeature extends DefaultFeature { if (y2 + x2 + z2 <= r) { state = world.getBlockState(POS); if (canReplace(state)) { - state = world.getBlockState(POS.up()); + state = world.getBlockState(POS.above()); state = canReplace(state) ? (y < waterLevel ? WATER : AIR) : state; BlocksHelper.setWithoutUpdate(world, POS, state); } - pos = POS.down(); - if (world.getBlockState(pos).getBlock().isIn(EndTags.GEN_TERRAIN)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.getDefaultState()); + pos = POS.below(); + if (world.getBlockState(pos).getBlock().is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } - pos = POS.up(); + pos = POS.above(); while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); - pos = pos.up(); + pos = pos.above(); } } // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { - if (world.isAir(POS.up())) { - state = world.getBiome(POS).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.getDefaultState()); - BlocksHelper.setWithoutUpdate(world, POS.down(), END_STONE); + if (world.isEmptyBlock(POS.above())) { + state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } else { - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.getDefaultState()); - BlocksHelper.setWithoutUpdate(world, POS.down(), END_STONE); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } - //} } } } } } - + BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); - + return true; } - + private boolean canReplace(BlockState state) { return state.getMaterial().isReplaceable() - || state.isIn(EndTags.GEN_TERRAIN) - || state.isOf(EndBlocks.ENDSTONE_DUST) + || state.is(EndTags.GEN_TERRAIN) + || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.UNDERWATER_PLANT) - || state.getMaterial().equals(Material.UNUSED_PLANT); + || state.getMaterial().equals(Material.WATER_PLANT) + || state.getMaterial().equals(Material.CORAL); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java new file mode 100644 index 00000000..0613e2ac --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -0,0 +1,61 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.world.features.DefaultFeature; + +public class FallenPillarFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.below(5)).is(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(20F, 40F, random); + float radius = MHelper.randRange(2F, 4F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + pillar = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.x() * 0.3, vec.y() * 0.3, vec.z() * 0.3) * 0.5F); + }).setSource(pillar); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 600f0ddf..878fba9a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -5,11 +5,12 @@ import java.util.Random; import com.google.common.collect.Lists; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -20,14 +21,16 @@ import ru.betterend.util.sdf.primitive.SDFSphere; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { int minY = getYOnSurface(world, pos.getX(), pos.getZ()); - int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); + int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) + : MHelper.randRange(64, 192, random); pos = new BlockPos(pos.getX(), y, pos.getZ()); - + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); int count = MHelper.randRange(3, 5, random); - + for (int i = 0; i < count; i++) { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); @@ -36,30 +39,34 @@ public class FloatingSpireFeature extends SpireFeature { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F + + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (info.getStateUp().isAir()) { if (random.nextInt(16) == 0) { - support.add(info.getPos().up()); + support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } else if (info.getState(Direction.UP, 3).isAir()) { + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() + .getUnderMaterial(); } return info.getState(); }); sdf.fillRecursive(world, center); - + support.forEach((bpos) -> { if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); } }); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index fdc0fcae..40655747 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -3,19 +3,20 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHydrothermalVent; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -32,7 +33,7 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFFlatland; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; @@ -43,197 +44,220 @@ public class GeyserFeature extends DefaultFeature { protected static final Function REPLACE2; private static final Function IGNORE; private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); - - if (pos.getY() > 57) { - int halfHeight = MHelper.randRange(10, 20, random); - float radius1 = halfHeight * 0.5F; - float radius2 = halfHeight * 0.1F + 0.5F; - SDF sdf = new SDFCapedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); - sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); - - int count = halfHeight; - for (int i = 0; i < count; i++) { - int py = i << 1; - float delta = (float) i / (float) (count - 1); - float radius = MathHelper.lerp(delta, radius1, radius2) * 1.3F; - - SDF bowl = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); - - SDF brimstone = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); - brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); - bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); - - SDF water = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); - water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); - bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); - - final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextLong()); - final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); - - bowl = new SDFCoordModify().setFunction((vec) -> { - float dx = (float) noise1.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - float dz = (float) noise2.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - vec.set(vec.getX() + dx, vec.getY(), vec.getZ() + dz); - }).setSource(bowl); - - SDF cut = new SDFFlatland().setBlock(Blocks.AIR); - cut = new SDFInvert().setSource(cut); - cut = new SDFTranslate().setTranslate(0, radius - 2, 0).setSource(cut); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); - - bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); - bowl = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, i * 4F).setSource(bowl); - sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); - } - sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); - - radius2 = radius2 * 0.5F; - if (radius2 < 0.7F) { - radius2 = 0.7F; - } - final OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - - SDFPrimitive obj1; - SDFPrimitive obj2; - - obj1 = new SDFCapedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); - sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); - sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.3F, vec.getY() * 0.3F, vec.getZ() * 0.3F) * 0.5F; - }).setSource(sdf); - - obj2 = new SDFSphere().setRadius(radius1); - SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); - cave = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1F, vec.getY() * 0.1F, vec.getZ() * 0.1F) * 2F; - }).setSource(cave); - cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); - - sdf = new SDFSmoothUnion().setRadius(5).setSourceA(cave).setSourceB(sdf); - - obj1.setBlock(WATER); - obj2.setBlock(WATER); - sdf.setReplaceFunction(REPLACE2); - sdf.fillRecursive(world, pos); - - obj1.setBlock(EndBlocks.BRIMSTONE); - obj2.setBlock(EndBlocks.BRIMSTONE); - new SDFDisplacement().setFunction((vec) -> { - return -2F; - }).setSource(sdf).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - obj1.setBlock(EndBlocks.SULPHURIC_ROCK.stone); - obj2.setBlock(EndBlocks.SULPHURIC_ROCK.stone); - new SDFDisplacement().setFunction((vec) -> { - return -4F; - }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - obj1.setBlock(Blocks.END_STONE); - obj2.setBlock(Blocks.END_STONE); - new SDFDisplacement().setFunction((vec) -> { - return -6F; - }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - BlocksHelper.setWithoutUpdate(world, pos, WATER); - Mutable mut = new Mutable().set(pos); - count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); - for (int i = 0; i < count; i++) { - BlocksHelper.setWithoutUpdate(world, mut, WATER); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, mut.offset(dir), WATER); - } - mut.setY(mut.getY() + 1); - } - - for (int i = 0; i < 150; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 4 + 0.5)); - float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); - int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); - if (dist >= 0) { - BlockState state = world.getBlockState(mut); - while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { - mut.setY(mut.getY() - 1); - state = world.getBlockState(mut); - } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { - for (int j = 0; j <= dist; j++) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); - MHelper.shuffle(HORIZONTAL, random); - for (Direction dir: HORIZONTAL) { - BlockPos p = mut.offset(dir); - if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); - } - } - mut.setY(mut.getY() + 1); - } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.ACTIVATED, distRaw < 2); - BlocksHelper.setWithoutUpdate(world, mut, state); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - } - } - } - } - - for (int i = 0; i < 10; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); - float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); - int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); - if (dist >= 0) { - BlockState state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - mut.setY(mut.getY() - 1); - state = world.getBlockState(mut); - } - if (state.isIn(EndTags.GEN_TERRAIN)) { - for (int j = 0; j <= dist; j++) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); - mut.setY(mut.getY() + 1); - } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.ACTIVATED, distRaw < 2); - BlocksHelper.setWithoutUpdate(world, mut, state); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - } - } - } - } - - EndFeatures.SULPHURIC_LAKE.getFeature().generate(world, chunkGenerator, random, pos, null); - - double distance = radius1 * 1.7; - BlockPos start = pos.add(-distance, -halfHeight - 15 - distance, -distance); - BlockPos end = pos.add(distance, -halfHeight - 5 + distance, distance); - BlocksHelper.fixBlocks(world, start, end); - - return true; + + if (pos.getY() < 10) { + return false; } - - return false; + + MutableBlockPos bpos = new MutableBlockPos().set(pos); + bpos.setY(bpos.getY() - 1); + BlockState state = world.getBlockState(bpos); + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + + if (pos.getY() - bpos.getY() < 25) { + return false; + } + + int halfHeight = MHelper.randRange(10, 20, random); + float radius1 = halfHeight * 0.5F; + float radius2 = halfHeight * 0.1F + 0.5F; + SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); + sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); + + int count = halfHeight; + for (int i = 0; i < count; i++) { + int py = i << 1; + float delta = (float) i / (float) (count - 1); + float radius = Mth.lerp(delta, radius1, radius2) * 1.3F; + + SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); + + SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) + .setBlock(EndBlocks.BRIMSTONE); + brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); + bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); + + SDF water = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); + water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); + bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); + + final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextLong()); + final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); + + bowl = new SDFCoordModify().setFunction((vec) -> { + float dx = (float) noise1.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); + float dz = (float) noise2.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); + vec.set(vec.x() + dx, vec.y(), vec.z() + dz); + }).setSource(bowl); + + SDF cut = new SDFFlatland().setBlock(Blocks.AIR); + cut = new SDFInvert().setSource(cut); + cut = new SDFTranslate().setTranslate(0, radius - 2, 0).setSource(cut); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); + + bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); + bowl = new SDFRotation().setRotation(Vector3f.YP, i * 4F).setSource(bowl); + sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); + } + sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); + + radius2 = radius2 * 0.5F; + if (radius2 < 0.7F) { + radius2 = 0.7F; + } + final OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + + SDFPrimitive obj1; + SDFPrimitive obj2; + + obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); + sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); + sdf = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.3F, vec.y() * 0.3F, vec.z() * 0.3F) * 0.5F; + }).setSource(sdf); + + obj2 = new SDFSphere().setRadius(radius1); + SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); + cave = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.1F, vec.y() * 0.1F, vec.z() * 0.1F) * 2F; + }).setSource(cave); + cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); + + sdf = new SDFSmoothUnion().setRadius(5).setSourceA(cave).setSourceB(sdf); + + obj1.setBlock(WATER); + obj2.setBlock(WATER); + sdf.setReplaceFunction(REPLACE2); + sdf.fillRecursive(world, pos); + + obj1.setBlock(EndBlocks.BRIMSTONE); + obj2.setBlock(EndBlocks.BRIMSTONE); + new SDFDisplacement().setFunction((vec) -> { + return -2F; + }).setSource(sdf).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + obj1.setBlock(EndBlocks.SULPHURIC_ROCK.stone); + obj2.setBlock(EndBlocks.SULPHURIC_ROCK.stone); + new SDFDisplacement().setFunction((vec) -> { + return -4F; + }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + obj1.setBlock(Blocks.END_STONE); + obj2.setBlock(Blocks.END_STONE); + new SDFDisplacement().setFunction((vec) -> { + return -6F; + }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + BlocksHelper.setWithoutUpdate(world, pos, WATER); + MutableBlockPos mut = new MutableBlockPos().set(pos); + count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); + for (int i = 0; i < count; i++) { + BlocksHelper.setWithoutUpdate(world, mut, WATER); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, mut.relative(dir), WATER); + } + mut.setY(mut.getY() + 1); + } + + for (int i = 0; i < 150; i++) { + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 4 + 0.5)); + float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); + int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); + if (dist >= 0) { + state = world.getBlockState(mut); + while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.WATER_PLANT)) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); + MHelper.shuffle(HORIZONTAL, random); + for (Direction dir : HORIZONTAL) { + BlockPos p = mut.relative(dir); + if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() + .setValue(HorizontalDirectionalBlock.FACING, dir)); + } + } + mut.setY(mut.getY() + 1); + } + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, + distRaw < 2); + BlocksHelper.setWithoutUpdate(world, mut, state); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + } + } + } + } + + for (int i = 0; i < 10; i++) { + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); + float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); + int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); + if (dist >= 0) { + state = world.getBlockState(mut); + while (state.is(Blocks.WATER)) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.is(EndTags.GEN_TERRAIN)) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); + mut.setY(mut.getY() + 1); + } + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, + distRaw < 2); + BlocksHelper.setWithoutUpdate(world, mut, state); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + } + } + } + } + + EndFeatures.SULPHURIC_LAKE.getFeature().place(world, chunkGenerator, random, pos, null); + + double distance = radius1 * 1.7; + BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); + BlockPos end = pos.offset(distance, -halfHeight - 5 + distance, distance); + BlocksHelper.fixBlocks(world, start, end); + + return true; } - + static { REPLACE1 = (state) -> { - return state.isAir() || (state.isIn(EndTags.GEN_TERRAIN)); + return state.isAir() || (state.is(EndTags.GEN_TERRAIN)); }; - + REPLACE2 = (state) -> { - if (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(EndBlocks.HYDROTHERMAL_VENT) || state.isOf(EndBlocks.SULPHUR_CRYSTAL)) { + if (state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + || state.is(EndBlocks.SULPHUR_CRYSTAL)) { return true; } if (state.getMaterial().equals(Material.PLANT)) { @@ -241,9 +265,10 @@ public class GeyserFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { - return state.isOf(Blocks.WATER) || state.isOf(Blocks.CAVE_AIR) || state.isOf(EndBlocks.SULPHURIC_ROCK.stone) || state.isOf(EndBlocks.BRIMSTONE); + return state.is(Blocks.WATER) || state.is(Blocks.CAVE_AIR) || state.is(EndBlocks.SULPHURIC_ROCK.stone) + || state.is(EndBlocks.BRIMSTONE); }; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index c0712716..7dc540e8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -4,19 +4,20 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFRotation; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.world.features.DefaultFeature; public class IceStarFeature extends DefaultFeature { @@ -24,64 +25,64 @@ public class IceStarFeature extends DefaultFeature { private final float maxSize; private final int minCount; private final int maxCount; - + public IceStarFeature(float minSize, float maxSize, int minCount, int maxCount) { this.minSize = minSize; this.maxSize = maxSize; this.minCount = minCount; this.maxCount = maxCount; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCapedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size) + .setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); - for (Vector3f point: points) { + for (Vector3f point : points) { SDF rotated = spike; point = MHelper.normalize(point); - float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); + float angle = MHelper.angle(Vector3f.YP, point); if (angle > 0.01F && angle < 3.14F) { - Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); + Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } - else if (angle > 1) { - rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); + } else if (angle > 1) { + rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } - + int x1 = (pos.getX() >> 4) << 4; int z1 = (pos.getZ() >> 4) << 4; pos = new BlockPos(x1 + random.nextInt(16), MHelper.randRange(32, 128, random), z1 + random.nextInt(16)); - + final float ancientRadius = size * 0.7F; final float denseRadius = size * 0.9F; final float iceRadius = size < 7 ? size * 5 : size * 1.3F; final float randScale = size * 0.3F; - + final BlockPos center = pos; - final BlockState ice = EndBlocks.EMERALD_ICE.getDefaultState(); - final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.getDefaultState(); - final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); + final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); + final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); + final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - - sdf.setPostProcess((info) -> { + + sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } - else if (distance < denseRadius) { + } else if (distance < denseRadius) { return dense; - } - else if (distance < iceRadius) { + } else if (distance < iceRadius) { return ice; } return info.getState(); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java new file mode 100644 index 00000000..4f10ad23 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -0,0 +1,69 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianBoulderFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + return false; + } + + int count = MHelper.randRange(1, 5, random); + for (int i = 0; i < count; i++) { + BlockPos p = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); + makeBoulder(world, p, random); + } + + return true; + } + + private void makeBoulder(WorldGenLevel world, BlockPos pos, Random random) { + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + return; + } + + float radius = MHelper.randRange(1F, 5F, random); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.OBSIDIAN); + float sx = MHelper.randRange(0.7F, 1.3F, random); + float sy = MHelper.randRange(0.7F, 1.3F, random); + float sz = MHelper.randRange(0.7F, 1.3F, random); + sphere = new SDFScale3D().setScale(sx, sy, sz).setSource(sphere); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 1.5F); + }).setSource(sphere); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); + sphere.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java new file mode 100644 index 00000000..66d1bc3d --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -0,0 +1,69 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFFlatland; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianPillarBasementFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.below(5)).is(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(10F, 35F, random); + float radius = MHelper.randRange(2F, 5F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, height * 0.5F - 3, 0).setSource(pillar); + SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + cut = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.x() * 0.2, vec.z() * 0.2) * 3); + }).setSource(cut); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = random.nextFloat() * 0.5F + (float) Math.PI; + cut = new SDFRotation().setRotation(vec, angle).setSource(cut); + cut = new SDFTranslate().setTranslate(0, height * 0.7F - 3, 0).setSource(cut); + pillar = new SDFSubtraction().setSourceA(pillar).setSourceB(cut); + vec = MHelper.randomHorizontal(random); + angle = random.nextFloat() * 0.2F; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index d1d1b37f..b1ec8284 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -2,12 +2,12 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -20,54 +20,55 @@ public class OreLayerFeature extends DefaultFeature { private static final SDFSphere SPHERE; private static final SDFCoordModify NOISE; private static final SDF FUNCTION; - + private final BlockState state; private final float radius; private final int minY; private final int maxY; private OpenSimplexNoise noise; - + public OreLayerFeature(BlockState state, float radius, int minY, int maxY) { this.state = state; this.radius = radius; this.minY = minY; this.maxY = maxY; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); int posZ = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getZ(); int posY = MHelper.randRange(minY, maxY, random); - + if (noise == null) { noise = new OpenSimplexNoise(world.getSeed()); } - + SPHERE.setRadius(radius).setBlock(state); NOISE.setFunction((vec) -> { - double x = (vec.getX() + pos.getX()) * 0.1; - double z = (vec.getZ() + pos.getZ()) * 0.1; + double x = (vec.x() + pos.getX()) * 0.1; + double z = (vec.z() + pos.getZ()) * 0.1; double offset = noise.eval(x, z); - vec.set(vec.getX(), vec.getY() + (float) offset * 8, vec.getZ()); + vec.set(vec.x(), vec.y() + (float) offset * 8, vec.z()); }); FUNCTION.fillRecursive(world, new BlockPos(posX, posY, posZ)); return true; } - + static { SPHERE = new SDFSphere(); NOISE = new SDFCoordModify(); - + SDF body = SPHERE; body = new SDFScale3D().setScale(1, 0.2F, 1).setSource(body); body = NOISE.setSource(body); body.setReplaceFunction((state) -> { - return state.isOf(Blocks.END_STONE); + return state.is(Blocks.END_STONE); }); - + FUNCTION = body; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java deleted file mode 100644 index f254386b..00000000 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ /dev/null @@ -1,187 +0,0 @@ -package ru.betterend.world.features.terrain; - -import java.util.Random; -import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndStructures; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFRotation; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFHexPrism; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.DefaultFeature; - -public class RoundCaveFeature extends DefaultFeature { - private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); - - @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { - return false; - } - - int radius = MHelper.randRange(10, 30, random); - int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE, pos.getX(), pos.getZ()); - - Mutable bpos = new Mutable(); - bpos.setX(pos.getX()); - bpos.setZ(pos.getZ()); - bpos.setY(top); - while (top > bottom && !world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - bpos.setY(--top); - } - top -= radius * 1.3F + 5; - - if (top <= bottom) { - return false; - } - - pos = new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); - - OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, pos.getX(), pos.getZ())); - - int x1 = pos.getX() - radius - 5; - int z1 = pos.getZ() - radius - 5; - int x2 = pos.getX() + radius + 5; - int z2 = pos.getZ() + radius + 5; - int y1 = MHelper.floor(pos.getY() - (radius + 5) / 1.6); - int y2 = MHelper.floor(pos.getY() + (radius + 5) / 1.6); - - double hr = radius * 0.75; - double nr = radius * 0.25; - - Set bushes = Sets.newHashSet(); - BlockState terrain = EndBlocks.CAVE_MOSS.getDefaultState(); - for (int x = x1; x <= x2; x++) { - int xsq = x - pos.getX(); - xsq *= xsq; - bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - pos.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - pos.getY(); - ysq *= 1.6; - ysq *= ysq; - bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double r2 = r + 5; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - BlockState state = world.getBlockState(bpos); - if (isReplaceable(state)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() + 1); - state = world.getBlockState(bpos); - } - - bpos.setY(y - 1); - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } - } - bpos.setY(y - 1); - if (world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - BlocksHelper.setWithoutUpdate(world, bpos, terrain); - } - } - else if (dist < r2 * r2) { - BlockState state = world.getBlockState(bpos); - if (!state.getFluidState().isEmpty()) { - BlocksHelper.setWithoutUpdate(world, bpos, Blocks.END_STONE.getDefaultState()); - } - else if (world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - if (world.isAir(bpos.down())) { - int h = BlocksHelper.downRay(world, bpos.down(), 64); - if (h > 6 && h < 32 && world.getBlockState(bpos.down(h + 3)).isIn(EndTags.GEN_TERRAIN)) { - bushes.add(bpos.down()); - } - } - else if (world.isAir(bpos.up())) { - int h = BlocksHelper.upRay(world, bpos.up(), 64); - if (h > 6 && h < 32 && world.getBlockState(bpos.up(h + 3)).isIn(EndTags.GEN_TERRAIN)) { - bushes.add(bpos.up()); - } - } - } - } - } - } - } - bushes.forEach((cpos) -> { - if (random.nextInt(32) == 0) { - generateBush(world, random, cpos); - } - }); - - if (random.nextBoolean() && world.getBiome(pos).getGenerationSettings().hasStructureFeature(EndStructures.MOUNTAIN.getStructure())) { - pos = pos.add(random.nextGaussian() * 5, random.nextGaussian() * 5, random.nextGaussian() * 5); - BlockPos down = pos.down(BlocksHelper.downRay(world, pos, 64) + 2); - if (isReplaceable(world.getBlockState(down))) { - SDF prism = new SDFHexPrism().setHeight(radius * MHelper.randRange(0.6F, 0.75F, random)).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); - float angleY = MHelper.randRange(0, MHelper.PI2, random); - float vx = (float) Math.sin(angleY); - float vz = (float) Math.sin(angleY); - prism = new SDFRotation().setRotation(new Vector3f(vx, 0, vz), random.nextFloat()).setSource(prism); - prism.setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() - || state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); - }); - prism.fillRecursive(world, pos); - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); - } - } - - BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); - - return true; - } - - private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); - } - - private void generateBush(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(1.0F, 3.2F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.fillRecursive(world, blockPos); - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.CAVE_BUSH); - } -} diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java new file mode 100644 index 00000000..d35ce510 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -0,0 +1,39 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.features.DefaultFeature; + +public class SingleBlockFeature extends DefaultFeature { + private final Block block; + + public SingleBlockFeature(Block block) { + this.block = block; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN)) { + return false; + } + + BlockState state = block.defaultBlockState(); + if (block.getStateDefinition().getProperty("waterlogged") != null) { + boolean waterlogged = !world.getFluidState(pos).isEmpty(); + state = state.setValue(BlockStateProperties.WATERLOGGED, waterlogged); + } + BlocksHelper.setWithoutUpdate(world, pos, state); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java new file mode 100644 index 00000000..ee4be50f --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -0,0 +1,55 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class SmaragdantCrystalFeature extends DefaultFeature { + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN)) { + return false; + } + + MutableBlockPos mut = new MutableBlockPos(); + int count = MHelper.randRange(15, 30, random); + BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.defaultBlockState(); + BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState(); + for (int i = 0; i < count; i++) { + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(1.5F - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(3); + if (dist > 0) { + BlockState state = world.getBlockState(mut); + for (int n = 0; n < 10 && state.isAir(); n++) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.is(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.above()).is(crystal.getBlock())) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, crystal); + mut.setY(mut.getY() + 1); + } + boolean waterlogged = !world.getFluidState(mut).isEmpty(); + BlocksHelper.setWithoutUpdate(world, mut, + shard.setValue(BlockStateProperties.WATERLOGGED, waterlogged)); + } + } + } + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 99d697ee..bcb3c382 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -6,14 +6,15 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -28,54 +29,61 @@ import ru.betterend.world.features.DefaultFeature; public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() > 57) { - SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); - int count = MHelper.randRange(3, 7, random); - for (int i = 0; i < count; i++) { - float rMin = (i * 1.3F) + 2.5F; - sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); - } - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); - }).setSource(sdf); - final BlockPos center = pos; - List support = Lists.newArrayList(); - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { - if (info.getStateUp().isAir()) { - if (random.nextInt(16) == 0) { - support.add(info.getPos().up()); - } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - return info.getState(); - }); - sdf.fillRecursive(world, center); - - support.forEach((bpos) -> { - if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); - } - }); - - return true; + if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(EndTags.GEN_TERRAIN) + || !world.getBlockState(pos.below(6)).is(EndTags.GEN_TERRAIN)) { + return false; } - return false; + + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); + int count = MHelper.randRange(3, 7, random); + for (int i = 0; i < count; i++) { + float rMin = (i * 1.3F) + 2.5F; + sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); + } + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sdf = new SDFDisplacement().setFunction((vec) -> { + return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F + + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); + }).setSource(sdf); + final BlockPos center = pos; + List support = Lists.newArrayList(); + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (info.getStateUp().isAir()) { + if (random.nextInt(16) == 0) { + support.add(info.getPos().above()); + } + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } else if (info.getState(Direction.UP, 3).isAir()) { + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() + .getUnderMaterial(); + } + return info.getState(); + }).fillRecursive(world, center); + + support.forEach((bpos) -> { + if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { + EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + } + }); + + return true; } - + protected SDF addSegment(SDF sdf, float radius, Random random) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.END_STONE); - SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0).setSource(sdf); + SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0) + .setSource(sdf); return new SDFSmoothUnion().setRadius(radius * 0.5F).setSourceA(sphere).setSourceB(offseted); } - + static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() instanceof LeavesBlock) { diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java new file mode 100644 index 00000000..76522f31 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -0,0 +1,79 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.basis.StalactiteBlock; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.features.DefaultFeature; + +public class StalactiteFeature extends DefaultFeature { + private final boolean ceiling; + private final Block[] ground; + private final Block block; + + public StalactiteFeature(boolean ceiling, Block block, Block... ground) { + this.ceiling = ceiling; + this.ground = ground; + this.block = block; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { + return false; + } + + MutableBlockPos mut = new MutableBlockPos().set(pos); + int height = random.nextInt(16); + int dir = ceiling ? -1 : 1; + boolean stalagnate = false; + + for (int i = 1; i <= height; i++) { + mut.setY(pos.getY() + i * dir); + BlockState state = world.getBlockState(mut); + if (!state.getMaterial().isReplaceable()) { + stalagnate = state.is(EndTags.GEN_TERRAIN); + height = i; + break; + } + } + + if (!stalagnate && height > 7) { + height = random.nextInt(8); + } + + float center = height * 0.5F; + for (int i = 0; i < height; i++) { + mut.setY(pos.getY() + i * dir); + int size = stalagnate ? Mth.clamp((int) (Mth.abs(i - center) + 1), 1, 7) : height - i - 1; + boolean waterlogged = !world.getFluidState(mut).isEmpty(); + BlockState base = block.defaultBlockState().setValue(StalactiteBlock.SIZE, size) + .setValue(BlockStateProperties.WATERLOGGED, waterlogged); + BlockState state = stalagnate ? base.setValue(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) + : base.setValue(StalactiteBlock.IS_FLOOR, dir > 0); + BlocksHelper.setWithoutUpdate(world, mut, state); + } + + return true; + } + + private boolean isGround(Block block) { + for (Block b : ground) { + if (b == block) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index 73728a0f..639ffb06 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -2,14 +2,14 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -19,12 +19,13 @@ import ru.betterend.world.features.DefaultFeature; public class SulphurHillFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; } - + int count = MHelper.randRange(5, 13, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); for (int i = 0; i < count; i++) { @@ -38,14 +39,14 @@ public class SulphurHillFeature extends DefaultFeature { } return true; } - - private void makeCircle(StructureWorldAccess world, BlockPos pos, OpenSimplexNoise noise, Random random) { + + private void makeCircle(WorldGenLevel world, BlockPos pos, OpenSimplexNoise noise, Random random) { int radius = MHelper.randRange(5, 9, random); int min = -radius - 3; int max = radius + 4; - Mutable mut = new Mutable(); - BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.getDefaultState(); - BlockState brimstone = EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + MutableBlockPos mut = new MutableBlockPos(); + BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); + BlockState brimstone = EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); for (int x = min; x < max; x++) { int x2 = x * x; int px = pos.getX() + x; @@ -60,7 +61,7 @@ public class SulphurHillFeature extends DefaultFeature { int d = x2 + z2; mut.setY(pos.getY()); BlockState state = world.getBlockState(mut); - if (state.getMaterial().isReplaceable() || state.isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.getMaterial().isReplaceable() || state.is(EndBlocks.HYDROTHERMAL_VENT)) { if (d < r2 * r2) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.WATER); mut.move(Direction.DOWN); @@ -76,8 +77,7 @@ public class SulphurHillFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, rock); mut.move(Direction.DOWN); } - } - else if (d < r1 * r1) { + } else if (d < r1 * r1) { BlocksHelper.setWithoutUpdate(world, mut, brimstone); mut.move(Direction.DOWN); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index de611ef1..58e0480f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -5,19 +5,19 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockSulphurCrystal; +import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -26,38 +26,58 @@ import ru.betterend.util.MHelper; import ru.betterend.world.features.DefaultFeature; public class SulphuricCaveFeature extends DefaultFeature { - private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); - private static final BlockState WATER = Blocks.WATER.getDefaultState(); + private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); + private static final BlockState WATER = Blocks.WATER.defaultBlockState(); private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { int radius = MHelper.randRange(10, 30, random); - int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()) - radius - 5; - + + int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + MutableBlockPos bpos = new MutableBlockPos(); + bpos.setX(pos.getX()); + bpos.setZ(pos.getZ()); + bpos.setY(top - 1); + + BlockState state = world.getBlockState(bpos); + while (!state.is(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + if (bpos.getY() < 10) { + return false; + } + top = (int) (bpos.getY() - (radius * 1.3F + 5)); + + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + int bottom = (int) (bpos.getY() + radius * 1.3F + 5); + if (top <= bottom) { return false; } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); pos = new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); - + OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, pos.getX(), pos.getZ())); - + int x1 = pos.getX() - radius - 5; int z1 = pos.getZ() - radius - 5; int x2 = pos.getX() + radius + 5; int z2 = pos.getZ() + radius + 5; int y1 = MHelper.floor(pos.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(pos.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - - BlockState state; + Set brimstone = Sets.newHashSet(); - BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.getDefaultState(); + BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); int waterLevel = pos.getY() + MHelper.randRange(MHelper.floor(radius * 0.8), radius, random); for (int x = x1; x <= x2; x++) { int xsq = x - pos.getX(); @@ -80,15 +100,14 @@ public class SulphuricCaveFeature extends DefaultFeature { if (isReplaceable(state)) { BlocksHelper.setWithoutUpdate(world, mut, y < waterLevel ? WATER : CAVE_AIR); } - } - else if (dist < r2 * r2) { + } else if (dist < r2 * r2) { state = world.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(Blocks.AIR)) { - double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; + if (state.is(EndTags.GEN_TERRAIN) || state.is(Blocks.AIR)) { + double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; if (v > 0.4) { - brimstone.add(mut.toImmutable()); - } - else { + brimstone.add(mut.immutable()); + } else { BlocksHelper.setWithoutUpdate(world, mut, rock); } } @@ -99,26 +118,30 @@ public class SulphuricCaveFeature extends DefaultFeature { brimstone.forEach((blockPos) -> { placeBrimstone(world, blockPos, random); }); - + if (random.nextInt(4) == 0) { int count = MHelper.randRange(5, 20, random); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 0, MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(3 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 0, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(3 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(2); if (dist > 0) { state = world.getBlockState(mut); - while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { + while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.WATER_PLANT)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); - for (Direction dir: HORIZONTAL) { - BlockPos p = mut.offset(dir); - if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); + for (Direction dir : HORIZONTAL) { + BlockPos p = mut.relative(dir); + if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() + .setValue(HorizontalDirectionalBlock.FACING, dir)); } } mut.setY(mut.getY() + 1); @@ -126,9 +149,10 @@ public class SulphuricCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.HYDROTHERMAL_VENT); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - world.getBlockTickScheduler().schedule(mut, EndBlocks.VENT_BUBBLE_COLUMN, MHelper.randRange(8, 32, random)); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); + world.getBlockTicks().scheduleTick(mut, EndBlocks.VENT_BUBBLE_COLUMN, + MHelper.randRange(8, 32, random)); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); } @@ -136,48 +160,43 @@ public class SulphuricCaveFeature extends DefaultFeature { } } } - + BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); - + return true; } - + private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) - || state.isOf(EndBlocks.HYDROTHERMAL_VENT) - || state.isOf(EndBlocks.VENT_BUBBLE_COLUMN) - || state.isOf(EndBlocks.SULPHUR_CRYSTAL) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.UNDERWATER_PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + || state.is(EndBlocks.VENT_BUBBLE_COLUMN) || state.is(EndBlocks.SULPHUR_CRYSTAL) + || state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.WATER_PLANT) || state.getMaterial().equals(Material.LEAVES); } - - private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { + + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); - if (state.get(BlockProperties.ACTIVE)) { + if (state.getValue(BlockProperties.ACTIVE)) { makeShards(world, pos, random); } } - - private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isOf(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { + return EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); } } - return EndBlocks.BRIMSTONE.getDefaultState(); + return EndBlocks.BRIMSTONE.defaultBlockState(); } - - private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; - if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { - BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.AGE, random.nextInt(3)); + if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { + BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index b368a575..46ac438e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -5,17 +5,17 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockSulphurCrystal; +import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -25,24 +25,25 @@ import ru.betterend.world.features.DefaultFeature; public class SulphuricLakeFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + NoneFeatureConfiguration featureConfig) { blockPos = getPosOnSurfaceWG(world, blockPos); - + if (blockPos.getY() < 57) { return false; } - + double radius = MHelper.randRange(10.0, 20.0, random); int dist2 = MHelper.floor(radius * 1.5); - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; - + Set brimstone = Sets.newHashSet(); for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -59,145 +60,140 @@ public class SulphuricLakeFeature extends DefaultFeature { int dist = x2 + z2; if (dist <= r) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(POS).is(EndTags.GEN_TERRAIN)) { if (isBorder(world, POS)) { if (random.nextInt(8) > 0) { - brimstone.add(POS.toImmutable()); + brimstone.add(POS.immutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); } } - } - else { + } else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); - world.getFluidTickScheduler().schedule(POS, Fluids.WATER, 0); - brimstone.add(POS.down()); + world.getLiquidTicks().scheduleTick(POS, Fluids.WATER, 0); + brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); if (random.nextBoolean()) { - brimstone.add(POS.down(3)); + brimstone.add(POS.below(3)); } } - } - else { - brimstone.add(POS.toImmutable()); + } else { + brimstone.add(POS.immutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); } } } - } - else { + } else { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); brimstone.remove(POS); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlockPos offseted = POS.offset(dir); - if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos offseted = POS.relative(dir); + if (world.getBlockState(offseted).is(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); } } if (isDeepWater(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS.move(Direction.DOWN), Blocks.WATER); brimstone.remove(POS); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlockPos offseted = POS.offset(dir); - if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos offseted = POS.relative(dir); + if (world.getBlockState(offseted).is(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); } } } - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); if (random.nextBoolean()) { - brimstone.add(POS.down(3)); + brimstone.add(POS.below(3)); } } } } - } - else if (dist < r2) { + } else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { - brimstone.add(POS.toImmutable()); + if (world.getBlockState(POS).is(EndTags.GEN_TERRAIN)) { + brimstone.add(POS.immutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); } } } } } } - + brimstone.forEach((bpos) -> { placeBrimstone(world, bpos, random); }); - + return true; } - - private boolean isBorder(StructureWorldAccess world, BlockPos pos) { + + private boolean isBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y) { return true; } } return false; } - - private boolean isAbsoluteBorder(StructureWorldAccess world, BlockPos pos) { + + private boolean isAbsoluteBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() - 2; - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { return true; } } return false; } - - private boolean isDeepWater(StructureWorldAccess world, BlockPos pos) { + + private boolean isDeepWater(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y - || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 2, pos.getZ() + dir.getOffsetZ() * 2) < y - || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y + || getYOnSurface(world, pos.getX() + dir.getStepX() * 2, pos.getZ() + dir.getStepZ() * 2) < y + || getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { return false; } } return true; } - - private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { + + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); - if (state.get(BlockProperties.ACTIVE)) { + if (state.getValue(BlockProperties.ACTIVE)) { makeShards(world, pos, random); } } - - private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isOf(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { + return EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); } } - return EndBlocks.BRIMSTONE.getDefaultState(); + return EndBlocks.BRIMSTONE.defaultBlockState(); } - - private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; - if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { - BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.AGE, random.nextInt(3)); + if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { + BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 413d0b6c..84ce8055 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -2,13 +2,13 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHydrothermalVent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -17,25 +17,31 @@ import ru.betterend.world.features.DefaultFeature; public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (pos.getY() < 57) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.below(3)).is(EndTags.GEN_TERRAIN)) { return false; } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); - BlockState vent = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.WATERLOGGED, false); + BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.WATERLOGGED, + false); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(2); if (dist > 0) { BlockState state = world.getBlockState(mut); for (int n = 0; n < 10 && state.isAir(); n++) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); @@ -44,7 +50,7 @@ public class SurfaceVentFeature extends DefaultFeature { } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java new file mode 100644 index 00000000..91aa7714 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -0,0 +1,134 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; +import java.util.function.Supplier; + +import com.google.common.collect.Sets; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.features.DefaultFeature; + +public class CaveChunkPopulatorFeature extends DefaultFeature { + private Supplier supplier; + + public CaveChunkPopulatorFeature(Supplier biome) { + this.supplier = biome; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + int sx = (pos.getX() >> 4) << 4; + int sz = (pos.getZ() >> 4) << 4; + MutableBlockPos min = new MutableBlockPos().set(pos); + MutableBlockPos max = new MutableBlockPos().set(pos); + fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); + EndCaveBiome biome = supplier.get(); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + BlocksHelper.fixBlocks(world, min, max); + return true; + } + + protected void fillSets(int sx, int sz, ChunkAccess chunk, Set floorPositions, + Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { + MutableBlockPos mut = new MutableBlockPos(); + MutableBlockPos mut2 = new MutableBlockPos(); + MutableBlockPos mut3 = new MutableBlockPos(); + for (int x = 0; x < 16; x++) { + mut.setX(x); + mut2.setX(x); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + mut2.setZ(z); + mut2.setY(0); + for (int y = 1; y < chunk.getMaxBuildHeight(); y++) { + mut.setY(y); + BlockState top = chunk.getBlockState(mut); + BlockState bottom = chunk.getBlockState(mut2); + if (top.isAir() && (bottom.is(EndTags.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { + mut3.set(mut2).move(sx, 0, sz); + floorPositions.add(mut3.immutable()); + updateMin(mut3, min); + updateMax(mut3, max); + } else if (bottom.isAir() && (top.is(EndTags.GEN_TERRAIN) || top.is(Blocks.STONE))) { + mut3.set(mut).move(sx, 0, sz); + ceilPositions.add(mut3.immutable()); + updateMin(mut3, min); + updateMax(mut3, max); + } + mut2.setY(y); + } + } + } + } + + private void updateMin(BlockPos pos, MutableBlockPos min) { + if (pos.getX() < min.getX()) { + min.setX(pos.getX()); + } + if (pos.getY() < min.getY()) { + min.setY(pos.getY()); + } + if (pos.getZ() < min.getZ()) { + min.setZ(pos.getZ()); + } + } + + private void updateMax(BlockPos pos, MutableBlockPos max) { + if (pos.getX() > max.getX()) { + max.setX(pos.getX()); + } + if (pos.getY() > max.getY()) { + max.setY(pos.getY()); + } + if (pos.getZ() > max.getZ()) { + max.setZ(pos.getZ()); + } + } + + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, + BlockState surfaceBlock) { + float density = biome.getFloorDensity(); + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.above(), null); + } + } + }); + } + + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { + float density = biome.getCeilDensity(); + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.below(), null); + } + } + }); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java new file mode 100644 index 00000000..9af35a84 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -0,0 +1,256 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.List; +import java.util.Random; +import java.util.Set; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.interfaces.IBiomeArray; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.features.DefaultFeature; + +public abstract class EndCaveFeature extends DefaultFeature { + protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); + protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); + private static final Vec3i[] SPHERE; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { + return false; + } + + if (biomeMissingCaves(world, pos)) { + return false; + } + + int radius = MHelper.randRange(10, 30, random); + BlockPos center = findPos(world, pos, radius, random); + + if (center == null) { + return false; + } + + EndCaveBiome biome = EndBiomes.getCaveBiome(random); + Set caveBlocks = generate(world, center, radius, random); + if (!caveBlocks.isEmpty()) { + if (biome != null) { + setBiomes(world, biome, caveBlocks); + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + MutableBlockPos mut = new MutableBlockPos(); + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.immutable()); + } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.immutable()); + } + } + }); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + placeWalls(world, biome, caveBlocks, random); + } + fixBlocks(world, caveBlocks); + } + + return true; + } + + protected abstract Set generate(WorldGenLevel world, BlockPos center, int radius, Random random); + + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + float density = biome.getFloorDensity(); + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.above(), null); + } + } + }); + } + + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { + float density = biome.getCeilDensity(); + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.below(), null); + } + } + }); + } + + protected void placeWalls(WorldGenLevel world, EndCaveBiome biome, Set positions, Random random) { + Set placed = Sets.newHashSet(); + positions.forEach(pos -> { + if (random.nextInt(4) == 0 && hasOpenSide(pos, positions)) { + BlockState wallBlock = biome.getWall(pos); + if (wallBlock != null) { + for (Vec3i offset: SPHERE) { + BlockPos wallPos = pos.offset(offset); + if (!positions.contains(wallPos) && !placed.contains(wallPos) && world.getBlockState(wallPos).is(EndTags.GEN_TERRAIN)) { + wallBlock = biome.getWall(wallPos); + BlocksHelper.setWithoutUpdate(world, wallPos, wallBlock); + placed.add(wallPos); + } + } + } + } + }); + } + + private boolean hasOpenSide(BlockPos pos, Set positions) { + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (!positions.contains(pos.relative(dir))) { + return true; + } + } + return false; + } + + protected void setBiomes(WorldGenLevel world, EndCaveBiome biome, Set blocks) { + blocks.forEach((pos) -> setBiome(world, pos, biome)); + } + + protected void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { + IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); + if (array != null) { + Biome bio = EndBiomes.getActualBiome(biome); + array.be_setBiome(bio, pos); + } + } + + private BlockPos findPos(WorldGenLevel world, BlockPos pos, int radius, Random random) { + int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + MutableBlockPos bpos = new MutableBlockPos(); + bpos.setX(pos.getX()); + bpos.setZ(pos.getZ()); + bpos.setY(top - 1); + + BlockState state = world.getBlockState(bpos); + while (!state.is(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + if (bpos.getY() < 10) { + return null; + } + top = (int) (bpos.getY() - (radius * 1.3F + 5)); + + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + int bottom = (int) (bpos.getY() + radius * 1.3F + 5); + + if (top <= bottom) { + return null; + } + + return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); + } + + protected void fixBlocks(WorldGenLevel world, Set caveBlocks) { + BlockPos pos = caveBlocks.iterator().next(); + MutableBlockPos start = new MutableBlockPos().set(pos); + MutableBlockPos end = new MutableBlockPos().set(pos); + caveBlocks.forEach((bpos) -> { + if (bpos.getX() < start.getX()) { + start.setX(bpos.getX()); + } + if (bpos.getX() > end.getX()) { + end.setX(bpos.getX()); + } + + if (bpos.getY() < start.getY()) { + start.setY(bpos.getY()); + } + if (bpos.getY() > end.getY()) { + end.setY(bpos.getY()); + } + + if (bpos.getZ() < start.getZ()) { + start.setZ(bpos.getZ()); + } + if (bpos.getZ() > end.getZ()) { + end.setZ(bpos.getZ()); + } + }); + BlocksHelper.fixBlocks(world, start.offset(-2, -2, -2), end.offset(2, 2, 2)); + } + + protected boolean isWaterNear(WorldGenLevel world, BlockPos pos) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (!world.getFluidState(pos.relative(dir, 5)).isEmpty()) { + return true; + } + } + return false; + } + + protected boolean biomeMissingCaves(WorldGenLevel world, BlockPos pos) { + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + Biome biome = world.getBiome(pos.offset(x << 4, 0, z << 4)); + EndBiome endBiome = EndBiomes.getFromBiome(biome); + if (!endBiome.hasCaves() && EndBiomes.LAND_BIOMES.containsImmutable(endBiome.getID())) { + return true; + } + } + } + return false; + } + + static { + List prePos = Lists.newArrayList(); + int radius = 5; + int r2 = radius * radius; + for (int x = -radius; x <= radius; x++) { + int x2 = x * x; + for (int y = -radius; y <= radius; y++) { + int y2 = y * y; + for (int z = -radius; z <= radius; z++) { + int z2 = z * z; + if (x2 + y2 + z2 < r2) { + prePos.add(new Vec3i(x, y, z)); + } + } + } + } + SPHERE = prePos.toArray(new Vec3i[] {}); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java new file mode 100644 index 00000000..726d1873 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -0,0 +1,84 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; + +import com.google.common.collect.Sets; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class RoundCaveFeature extends EndCaveFeature { + @Override + protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { + OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); + + int x1 = center.getX() - radius - 5; + int z1 = center.getZ() - radius - 5; + int x2 = center.getX() + radius + 5; + int z2 = center.getZ() + radius + 5; + int y1 = MHelper.floor(center.getY() - (radius + 5) / 1.6); + int y2 = MHelper.floor(center.getY() + (radius + 5) / 1.6); + + double hr = radius * 0.75; + double nr = radius * 0.25; + + BlockState state; + MutableBlockPos bpos = new MutableBlockPos(); + Set blocks = Sets.newHashSet(); + for (int x = x1; x <= x2; x++) { + int xsq = x - center.getX(); + xsq *= xsq; + bpos.setX(x); + for (int z = z1; z <= z2; z++) { + int zsq = z - center.getZ(); + zsq *= zsq; + bpos.setZ(z); + for (int y = y1; y <= y2; y++) { + int ysq = y - center.getY(); + ysq *= 1.6; + ysq *= ysq; + bpos.setY(y); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + double dist = xsq + ysq + zsq; + if (dist < r * r) { + state = world.getBlockState(bpos); + if (isReplaceable(state) && !isWaterNear(world, bpos)) { + BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); + blocks.add(bpos.immutable()); + + while (state.getMaterial().equals(Material.LEAVES)) { + BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); + bpos.setY(bpos.getY() + 1); + state = world.getBlockState(bpos); + } + + bpos.setY(y - 1); + while (state.getMaterial().equals(Material.LEAVES)) { + BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + } + } + } + } + } + + return blocks; + } + + private boolean isReplaceable(BlockState state) { + return state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java new file mode 100644 index 00000000..c414c6a0 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -0,0 +1,149 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; + +import com.google.common.collect.Sets; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.biome.cave.EndCaveBiome; + +public class TunelCaveFeature extends EndCaveFeature { + private static final OpenSimplexNoise BIOME_NOISE_X = new OpenSimplexNoise("biome_noise_x".hashCode()); + private static final OpenSimplexNoise BIOME_NOISE_Z = new OpenSimplexNoise("biome_noise_z".hashCode()); + + private Set generate(WorldGenLevel world, BlockPos center, Random random) { + int x1 = (center.getX() >> 4) << 4; + int z1 = (center.getZ() >> 4) << 4; + int x2 = x1 + 16; + int z2 = z1 + 16; + int y2 = world.getHeight(); + Random rand = new Random(world.getSeed()); + OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); + OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); + OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); + + Set positions = Sets.newHashSet(); + MutableBlockPos pos = new MutableBlockPos(); + for (int x = x1; x < x2; x++) { + pos.setX(x); + for (int z = z1; z < z2; z++) { + pos.setZ(z); + for (int y = 0; y < y2; y++) { + pos.setY(y); + float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); + float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F;//Mth.abs(y - 50 + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F; + float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; + vert *= vert; + if (val + vert + dist < 0.15 && world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, AIR); + positions.add(pos.immutable()); + } + } + } + } + return positions; + } + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { + return false; + } + + if (biomeMissingCaves(world, pos)) { + return false; + } + + EndCaveBiome biome = EndBiomes.getCaveBiome(random); + Set preCaveBlocks = generate(world, pos, random); + Set caveBlocks = mutateBlocks(preCaveBlocks); + if (!caveBlocks.isEmpty()) { + if (biome != null) { + setBiomes(world, biome, caveBlocks); + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + MutableBlockPos mut = new MutableBlockPos(); + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.immutable()); + } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.immutable()); + } + } + }); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + placeWalls(world, biome, caveBlocks, random); + } + fixBlocks(world, preCaveBlocks); + } + + return true; + } + + private Set mutateBlocks(Set caveBlocks) { + Set result = Sets.newHashSet(); + caveBlocks.forEach(pos -> { + int dx = pos.getX() + (int) (BIOME_NOISE_X.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 5); + int dz = pos.getZ() + (int) (BIOME_NOISE_Z.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 5); + if ((dx >> 4) == (pos.getX() >> 4) && (dz >> 4) == (pos.getZ() >> 4)) { + result.add(pos); + } + }); + return result; + } + + @Override + protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { + return null; + } + + @Override + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + float density = biome.getFloorDensity() * 0.2F; + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.above(), null); + } + } + }); + } + + @Override + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { + float density = biome.getCeilDensity() * 0.2F; + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.below(), null); + } + } + }); + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index a7bbce31..47f71a2b 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -5,17 +5,17 @@ import java.util.Random; import java.util.function.Function; import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -40,99 +40,106 @@ public class DragonTreeFeature extends DefaultFeature { private static final List SIDE1; private static final List SIDE2; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(10, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - + Vector3f last = SplineHelper.getPos(spline, 3.5F); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); float radius = size * MHelper.randRange(0.5F, 0.7F, random); - makeCap(world, pos.add(last.getX(), last.getY(), last.getZ()), radius, random, noise); - + makeCap(world, pos.offset(last.x(), last.y(), last.z()), radius, random, noise); + last = spline.get(0); - makeRoots(world, pos.add(last.getX(), last.getY(), last.getZ()), radius, random); - + makeRoots(world, pos.offset(last.x(), last.y(), last.z()), radius, random); + radius = MHelper.randRange(1.2F, 2.3F, random); SDF function = SplineHelper.buildSDF(spline, radius, 1.2F, (bpos) -> { - return EndBlocks.DRAGON_TREE.bark.getDefaultState(); + return EndBlocks.DRAGON_TREE.bark.defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); - + return true; } - - private void makeCap(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + + private void makeCap(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { int count = (int) radius; - int offset = (int) (BRANCH.get(BRANCH.size() - 1).getY() * radius); + int offset = (int) (BRANCH.get(BRANCH.size() - 1).y() * radius); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(BRANCH); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE1); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE2); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } - leavesBall(world, pos.up(offset), radius * 1.15F + 2, random, noise); + leavesBall(world, pos.above(offset), radius * 1.15F + 2, random, noise); } - - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } } } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 1.5F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + MutableBlockPos mut = new MutableBlockPos(); + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.DRAGON_TREE.bark.getDefaultState()); + info.setState(EndBlocks.DRAGON_TREE.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -146,9 +153,9 @@ public class DragonTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -159,16 +166,16 @@ public class DragonTreeFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.add(random.nextGaussian() * 1, random.nextGaussian() * 1, random.nextGaussian() * 1); + BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, + random.nextGaussian() * 1); boolean place = true; - for (Direction d: Direction.values()) { - BlockState state = world.getBlockState(p.offset(d)); - if (!EndBlocks.DRAGON_TREE.isTreeLog(state) && !state.isOf(EndBlocks.DRAGON_TREE_LEAVES)) { + for (Direction d : Direction.values()) { + BlockState state = world.getBlockState(p.relative(d)); + if (!EndBlocks.DRAGON_TREE.isTreeLog(state) && !state.is(EndBlocks.DRAGON_TREE_LEAVES)) { place = false; break; } @@ -178,13 +185,13 @@ public class DragonTreeFeature extends DefaultFeature { } } } - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark); } - + static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.DRAGON_TREE_LEAVES) { @@ -195,43 +202,36 @@ public class DragonTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.DRAGON_TREE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.DRAGON_TREE.log.getDefaultState(); + if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.DRAGON_TREE.log.defaultBlockState(); } return info.getState(); }; - - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), - new Vector3f(0.1F, 0.3F, 0), - new Vector3f(0.4F, 0.6F, 0), - new Vector3f(0.8F, 0.8F, 0), - new Vector3f(1, 1, 0)); - SIDE1 = Lists.newArrayList(new Vector3f(0.4F, 0.6F, 0), - new Vector3f(0.8F, 0.8F, 0), - new Vector3f(1, 1, 0)); + + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.1F, 0.3F, 0), new Vector3f(0.4F, 0.6F, 0), + new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); + SIDE1 = Lists.newArrayList(new Vector3f(0.4F, 0.6F, 0), new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); SIDE2 = SplineHelper.copySpline(SIDE1); - + Vector3f offset1 = new Vector3f(-0.4F, -0.6F, 0); Vector3f offset2 = new Vector3f(0.4F, 0.6F, 0); - + SplineHelper.offset(SIDE1, offset1); SplineHelper.offset(SIDE2, offset1); SplineHelper.rotateSpline(SIDE1, 0.5F); SplineHelper.rotateSpline(SIDE2, -0.5F); SplineHelper.offset(SIDE1, offset2); SplineHelper.offset(SIDE2, offset2); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.7F, 0), - new Vector3f(0.3F, 0.3F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.2F, 0)); + + ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.7F, 0), new Vector3f(0.3F, 0.3F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.2F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java new file mode 100644 index 00000000..1f89af04 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -0,0 +1,349 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.world.features.DefaultFeature; + +public class GiganticAmaranitaFeature extends DefaultFeature { + private static final Function REPLACE; + private static final Function IGNORE; + private static final Function POST; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + float size = MHelper.randRange(5, 10, random); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 5); + SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); + + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { + return false; + } + BlocksHelper.setWithoutUpdate(world, pos, AIR); + + float radius = size * 0.17F;// MHelper.randRange(0.8F, 1.2F, random); + SDF function = SplineHelper.buildSDF(spline, radius, 0.2F, (bpos) -> { + return EndBlocks.AMARANITA_STEM.defaultBlockState(); + }); + + Vector3f capPos = spline.get(spline.size() - 1); + makeHead(world, pos.offset(capPos.x() + 0.5F, capPos.y() + 1.5F, capPos.z() + 0.5F), Mth.floor(size / 1.6F)); + + function.setReplaceFunction(REPLACE); + function.addPostProcess(POST); + function.fillRecursiveIgnore(world, pos, IGNORE); + + for (int i = 0; i < 3; i++) { + List copy = SplineHelper.copySpline(spline); + SplineHelper.offsetParts(copy, random, 0.2F, 0, 0.2F); + SplineHelper.fillSplineForce(copy, world, EndBlocks.AMARANITA_HYPHAE.defaultBlockState(), pos, REPLACE); + } + + return true; + } + + private void makeHead(WorldGenLevel world, BlockPos pos, int radius) { + MutableBlockPos mut = new MutableBlockPos(); + if (radius < 2) { + for (int i = -1; i < 2; i++) { + mut.set(pos).move(Direction.NORTH, 2).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.SOUTH, 2).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.EAST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.WEST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + for (int x = -1; x < 2; x++) { + for (int z = -1; z < 2; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + int h = radius + 1; + for (int y = 0; y < h; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -1; x < 2; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 2; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + mut.setY(pos.getY() + h + 1); + for (int x = -1; x < 2; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 2; z++) { + mut.setZ(pos.getZ() + z); + if ((x == 0 || z == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } else if (radius < 4) { + pos = pos.offset(-1, 0, -1); + for (int i = -2; i < 2; i++) { + mut.set(pos).move(Direction.NORTH, 2).move(Direction.WEST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.WEST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.WEST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + for (int x = -1; x < 3; x++) { + for (int z = -1; z < 3; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if ((x >> 1) == 0 || (z >> 1) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; + int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; + BlockPos offseted = mut.relative(axis, distance); + if (world.getBlockState(offseted).getMaterial().isReplaceable()) { + Direction dir = Direction.fromAxisAndDirection(axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR + .defaultBlockState().setValue(AttachedBlock.FACING, dir)); + } + mut.move(Direction.DOWN); + } + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + int h = radius - 1; + for (int y = 0; y < h; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -1; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + mut.setY(pos.getY() + h + 1); + for (int x = -1; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (((x >> 1) == 0 || (z >> 1) == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } else { + for (int i = -2; i < 3; i++) { + mut.set(pos).move(Direction.NORTH, 3).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.NORTH); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.SOUTH); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.EAST); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.WEST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.WEST); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + + for (int i = 0; i < 4; i++) { + mut.set(pos).move(Direction.UP).move(BlocksHelper.HORIZONTAL[i], 3) + .move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if ((x / 2) == 0 || (z / 2) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; + int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; + BlockPos offseted = mut.relative(axis, distance); + if (world.getBlockState(offseted).getMaterial().isReplaceable()) { + Direction dir = Direction.fromAxisAndDirection(axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR + .defaultBlockState().setValue(AttachedBlock.FACING, dir)); + } + mut.move(Direction.DOWN); + } + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + for (int y = 0; y < 3; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -2; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -2; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + int h = radius + 1; + for (int y = 4; y < h; y++) { + mut.setY(pos.getY() + y); + for (int x = -2; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -2; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (y < 6) { + if (((x / 2) == 0 || (z / 2) == 0) + && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } else { + if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) + && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + } + } + } + + static { + REPLACE = (state) -> { + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + IGNORE = (state) -> { + return EndBlocks.DRAGON_TREE.isTreeLog(state); + }; + + POST = (info) -> { + if (!info.getStateUp().is(EndBlocks.AMARANITA_STEM) || !info.getStateDown().is(EndBlocks.AMARANITA_STEM)) { + return EndBlocks.AMARANITA_HYPHAE.defaultBlockState(); + } + return info.getState(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 8cbfa954..75ac74f7 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -5,16 +5,17 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHelixTreeLeaves; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.phys.AABB; +import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -31,16 +32,18 @@ import ru.betterend.world.features.DefaultFeature; public class HelixTreeFeature extends DefaultFeature { private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float angle = random.nextFloat() * MHelper.PI2; float radiusRange = MHelper.randRange(4.5F, 6F, random); float scale = MHelper.randRange(0.5F, 1F, random); - + float dx; float dz; List spline = new ArrayList(10); @@ -50,129 +53,139 @@ public class HelixTreeFeature extends DefaultFeature { dz = (float) Math.cos(i + angle) * radius; spline.add(new Vector3f(dx, i * 2, dz)); } - SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.getDefaultState(); }); - SDF rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(sdf); + SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { + return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + }); + SDF rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(sdf); sdf = new SDFUnion().setSourceA(rotated).setSourceB(sdf); - + Vector3f lastPoint = spline.get(spline.size() - 1); List spline2 = SplineHelper.makeSpline(0, 0, 0, 0, 20, 0, 5); - SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.getDefaultState(); }); - stem = new SDFTranslate().setTranslate(lastPoint.getX(), lastPoint.getY(), lastPoint.getZ()).setSource(stem); + SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { + return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + }); + stem = new SDFTranslate().setTranslate(lastPoint.x(), lastPoint.y(), lastPoint.z()).setSource(stem); sdf = new SDFSmoothUnion().setRadius(3).setSourceA(sdf).setSourceB(stem); - + sdf = new SDFScale().setScale(scale).setSource(sdf); dx = 30 * scale; float dy1 = -20 * scale; float dy2 = 100 * scale; - sdf.setPostProcess(POST).fillArea(world, pos, new Box(pos.add(-dx, dy1, -dx), pos.add(dx, dy2, dx))); + sdf.addPostProcess(POST).fillArea(world, pos, new AABB(pos.offset(-dx, dy1, -dx), pos.offset(dx, dy2, dx))); SplineHelper.scale(spline, scale); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.getDefaultState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.rotateSpline(spline, (float) Math.PI); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.getDefaultState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.scale(spline2, scale); - BlockPos leafStart = pos.add(lastPoint.getX() + 0.5, lastPoint.getY() + 0.5, lastPoint.getZ() + 0.5); - SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.getDefaultState(), leafStart, (state) -> { - return state.getMaterial().isReplaceable(); - }); - + BlockPos leafStart = pos.offset(lastPoint.x() + 0.5, lastPoint.y() + 0.5, lastPoint.z() + 0.5); + SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.defaultBlockState(), leafStart, + (state) -> { + return state.getMaterial().isReplaceable(); + }); + spline.clear(); - for (int i = 0; i <= 20; i++) { - float radius = 1 - i * 0.05F; + float rad = MHelper.randRange(8F, 11F, random); + int count = MHelper.randRange(20, 30, random); + float scaleM = 20F / (float) count * scale * 1.75F; + float hscale = 20F / (float) count * 0.05F; + for (int i = 0; i <= count; i++) { + float radius = 1 - i * hscale; radius = radius * radius * 2 - 1; radius *= radius; - radius = (1 - radius) * 8F * scale; + radius = (1 - radius) * rad * scale; dx = (float) Math.sin(i * 0.45F + angle) * radius; dz = (float) Math.cos(i * 0.45F + angle) * radius; - spline.add(new Vector3f(dx, i * scale * 1.75F, dz)); + spline.add(new Vector3f(dx, i * scaleM, dz)); } - + Vector3f start = new Vector3f(); Vector3f end = new Vector3f(); lastPoint = spline.get(0); - BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.getDefaultState(); + BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.defaultBlockState(); for (int i = 1; i < spline.size(); i++) { Vector3f point = spline.get(i); - int minY = MHelper.floor(lastPoint.getY()); - int maxY = MHelper.floor(point.getY()); - float div = point.getY() - lastPoint.getY(); + int minY = MHelper.floor(lastPoint.y()); + int maxY = MHelper.floor(point.y()); + float div = point.y() - lastPoint.y(); for (float py = minY; py <= maxY; py += 0.2F) { start.set(0, py, 0); float delta = (float) (py - minY) / div; - float px = MathHelper.lerp(delta, lastPoint.getX(), point.getX()); - float pz = MathHelper.lerp(delta, lastPoint.getZ(), point.getZ()); + float px = Mth.lerp(delta, lastPoint.x(), point.x()); + float pz = Mth.lerp(delta, lastPoint.z(), point.z()); end.set(px, py, pz); fillLine(start, end, world, leaf, leafStart, i / 2 - 1); float ax = Math.abs(px); float az = Math.abs(pz); if (ax > az) { - start.set(start.getX(), start.getY(), start.getZ() + az > 0 ? 1 : -1); - end.set(end.getX(), end.getY(), end.getZ() + az > 0 ? 1 : -1); - } - else { - start.set(start.getX() + ax > 0 ? 1 : -1, start.getY(), start.getZ()); - end.set(end.getX() + ax > 0 ? 1 : -1, end.getY(), end.getZ()); + start.set(start.x(), start.y(), start.z() + az > 0 ? 1 : -1); + end.set(end.x(), end.y(), end.z() + az > 0 ? 1 : -1); + } else { + start.set(start.x() + ax > 0 ? 1 : -1, start.y(), start.z()); + end.set(end.x() + ax > 0 ? 1 : -1, end.y(), end.z()); } fillLine(start, end, world, leaf, leafStart, i / 2 - 1); } lastPoint = point; } - - leaf = leaf.with(BlockHelixTreeLeaves.COLOR, 7); - leafStart = leafStart.add(0, lastPoint.getY(), 0); + + leaf = leaf.setValue(HelixTreeLeavesBlock.COLOR, 7); + leafStart = leafStart.offset(0, lastPoint.y(), 0); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - leafStart = leafStart.up(); + leafStart = leafStart.above(); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - leafStart = leafStart.up(); - if (world.getBlockState(leafStart).isAir()) { - BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - } + leafStart = leafStart.above(); + if (world.getBlockState(leafStart).isAir()) { + BlocksHelper.setWithoutUpdate(world, leafStart, leaf); + } } } - + return true; } - - private void fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, int offset) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + + private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, + int offset) { + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); - - Mutable bPos = new Mutable(); + float x = start.x(); + float y = start.y(); + float z = start.z(); + + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); int color = MHelper.floor((float) i / (float) count * 7F + 0.5F) + offset; - color = MathHelper.clamp(color, 0, 7); + color = Mth.clamp(color, 0, 7); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, color)); + BlocksHelper.setWithoutUpdate(world, bPos, state.setValue(HelixTreeLeavesBlock.COLOR, color)); } x += dx; y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, 7)); + BlocksHelper.setWithoutUpdate(world, bPos, state.setValue(HelixTreeLeavesBlock.COLOR, 7)); } } - + static { POST = (info) -> { - if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.HELIX_TREE.log.getDefaultState(); + if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.HELIX_TREE.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java new file mode 100644 index 00000000..7ffbc9a3 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -0,0 +1,127 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.JellyshroomCapBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class JellyshroomFeature extends DefaultFeature { + private static final Function REPLACE; + private static final List ROOT; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); + BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.defaultBlockState(); + + int height = MHelper.randRange(5, 8, random); + float radius = height * MHelper.randRange(0.15F, 0.25F, random); + List spline = SplineHelper.makeSpline(0, -1, 0, 0, height, 0, 3); + SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); + SDF sdf = SplineHelper.buildSDF(spline, radius, 0.8F, (bpos) -> { + return bark; + }); + + radius = height * MHelper.randRange(0.7F, 0.9F, random); + if (radius < 1.5F) { + radius = 1.5F; + } + final float membraneRadius = radius; + SDF cap = makeCap(membraneRadius, random, membrane); + final Vector3f last = spline.get(spline.size() - 1); + cap = new SDFTranslate().setTranslate(last.x(), last.y(), last.z()).setSource(cap); + sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) + && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { + return EndBlocks.JELLYSHROOM.log.defaultBlockState(); + } + } else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { + float dx = info.getPos().getX() - pos.getX() - last.x(); + float dz = info.getPos().getZ() - pos.getZ() - last.z(); + float distance = MHelper.length(dx, dz) / membraneRadius * 7F; + int color = Mth.clamp(MHelper.floor(distance), 0, 7); + return info.getState().setValue(JellyshroomCapBlock.COLOR, color); + } + return info.getState(); + }).fillRecursive(world, pos); + radius = height * 0.5F; + makeRoots(world, pos.offset(0, 2, 0), radius, random, bark); + + return true; + } + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { + int count = (int) (radius * 3.5F); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + Vector3f last = branch.get(branch.size() - 1); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); + } + } + } + + private SDF makeCap(float radius, Random random, BlockState cap) { + SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); + SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); + sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); + sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); + + float angle = random.nextFloat() * MHelper.PI2; + int count = (int) MHelper.randRange(radius * 0.5F, radius, random); + if (count < 3) { + count = 3; + } + sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.2F).setSource(sphere); + + return sphere; + } + + static { + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); + + REPLACE = (state) -> { + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 41b3ea5e..c35edc9d 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -4,16 +4,17 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -32,39 +33,41 @@ public class LacugroveFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(15, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - + float radius = MHelper.randRange(6F, 8F, random); radius *= (size - 15F) / 20F + 1F; Vector3f center = spline.get(4); - leavesBall(world, pos.add(center.getX(), center.getY(), center.getZ()), radius, random, noise); - + leavesBall(world, pos.offset(center.x(), center.y(), center.z()), radius, random, noise); + radius = MHelper.randRange(1.2F, 1.8F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { - return EndBlocks.LACUGROVE.bark.getDefaultState(); + return EndBlocks.LACUGROVE.bark.defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursive(world, pos); - + spline = spline.subList(4, 6); - SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.getDefaultState(), pos, REPLACE); - - Mutable mut = new Mutable(); + SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.defaultBlockState(), pos, REPLACE); + + MutableBlockPos mut = new MutableBlockPos(); int offset = random.nextInt(2); for (int i = 0; i < 100; i++) { double px = pos.getX() + MHelper.randRange(-5, 5, random); @@ -79,7 +82,7 @@ public class LacugroveFeature extends DefaultFeature { boolean generate = false; for (int y = minY; y < maxY; y++) { mut.setY(y); - if (world.getBlockState(mut).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(mut).is(EndTags.END_GROUND)) { generate = true; break; } @@ -89,10 +92,11 @@ public class LacugroveFeature extends DefaultFeature { for (int y = top; y >= minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) || state.isIn(EndTags.END_GROUND)) { - BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); - } - else { + if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) + || state.is(EndTags.END_GROUND)) { + BlocksHelper.setWithoutUpdate(world, mut, + y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); + } else { break; } } @@ -100,25 +104,31 @@ public class LacugroveFeature extends DefaultFeature { } } } - + return true; } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.LACUGROVE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); - Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); + MutableBlockPos mut = new MutableBlockPos(); + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.LACUGROVE.bark.getDefaultState()); + info.setState(EndBlocks.LACUGROVE.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -132,9 +142,9 @@ public class LacugroveFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -145,15 +155,16 @@ public class LacugroveFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.add(random.nextGaussian() * 1, random.nextGaussian() * 1, random.nextGaussian() * 1); + BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, + random.nextGaussian() * 1); boolean place = true; - for (Direction d: Direction.values()) { - BlockState state = world.getBlockState(p.offset(d)); - if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.isOf(EndBlocks.LACUGROVE_LEAVES)) { + for (Direction d : Direction.values()) { + BlockState state = world.getBlockState(p.relative(d)); + if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.is(EndBlocks.LACUGROVE_LEAVES)) { place = false; break; } @@ -163,13 +174,13 @@ public class LacugroveFeature extends DefaultFeature { } } } - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LACUGROVE.bark); } - + static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (EndBlocks.LACUGROVE.isTreeLog(state)) { @@ -183,14 +194,15 @@ public class LacugroveFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.LACUGROVE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { - return EndBlocks.LACUGROVE.log.getDefaultState(); + if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) + && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { + return EndBlocks.LACUGROVE.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java new file mode 100644 index 00000000..45c6e34f --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -0,0 +1,219 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class LucerniaFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); + private static final Function REPLACE; + private static final Function IGNORE; + private static final List SPLINE; + private static final List ROOT; + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + float size = MHelper.randRange(12, 20, random); + int count = (int) (size * 0.3F); + float var = MHelper.PI2 / (float) (count * 3); + float start = MHelper.randRange(0, MHelper.PI2, random); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; + List spline = SplineHelper.copySpline(SPLINE); + SplineHelper.rotateSpline(spline, angle); + SplineHelper.scale(spline, size * MHelper.randRange(0.5F, 1F, random)); + SplineHelper.offsetParts(spline, random, 1F, 0, 1F); + SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); + Vector3f last = spline.get(spline.size() - 1); + float leavesRadius = (size * 0.13F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise, config != null); + } + + makeRoots(world, pos.offset(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); + + return true; + } + + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, + boolean natural) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + SDF sub = new SDFScale().setScale(5).setSource(sphere); + sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); + sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-1.5F, 1.5F, random); + }).setSource(sphere); + + MutableBlockPos mut = new MutableBlockPos(); + for (Direction d1 : BlocksHelper.HORIZONTAL) { + BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); + for (Direction d2 : BlocksHelper.HORIZONTAL) { + mut.set(p).move(Direction.UP).move(d2); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); + } + } + + BlockState top = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); + BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.defaultBlockState(); + + List support = Lists.newArrayList(); + sphere.addPostProcess((info) -> { + if (natural && random.nextInt(6) == 0 && info.getStateDown().isAir()) { + BlockPos d = info.getPos().below(); + support.add(d); + } + if (random.nextInt(15) == 0) { + for (Direction dir : Direction.values()) { + BlockState state = info.getState(dir, 2); + if (state.isAir()) { + return info.getState(); + } + } + info.setState(EndBlocks.LUCERNIA.bark.defaultBlockState()); + } + + MHelper.shuffle(DIRECTIONS, random); + for (Direction d : DIRECTIONS) { + if (info.getState(d).isAir()) { + info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); + } + } + + if (EndBlocks.LUCERNIA.isTreeLog(info.getState())) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.getValue(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + return info.getState(); + }); + sphere.fillRecursiveIgnore(world, pos, IGNORE); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LUCERNIA.bark); + + support.forEach((bpos) -> { + BlockState state = world.getBlockState(bpos); + if (state.isAir() || state.is(EndBlocks.LUCERNIA_OUTER_LEAVES)) { + int count = MHelper.randRange(3, 8, random); + mut.set(bpos); + if (world.getBlockState(mut.above()).is(EndBlocks.LUCERNIA_LEAVES)) { + BlocksHelper.setWithoutUpdate(world, mut, top); + for (int i = 1; i < count; i++) { + mut.setY(mut.getY() - 1); + if (world.isEmptyBlock(mut.below())) { + BlocksHelper.setWithoutUpdate(world, mut, middle); + } else { + break; + } + } + BlocksHelper.setWithoutUpdate(world, mut, bottom); + } + } + }); + } + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { + int count = (int) (radius * 1.5F); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + Vector3f last = branch.get(branch.size() - 1); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); + } + } + } + + static { + REPLACE = (state) -> { + if (state.is(EndTags.END_GROUND)) { + return true; + } + if (state.getBlock() == EndBlocks.LUCERNIA_LEAVES) { + return true; + } + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + IGNORE = (state) -> { + return EndBlocks.LUCERNIA.isTreeLog(state); + }; + + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 040d73f7..0208167d 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -4,16 +4,17 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.basis.BlockFur; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -30,7 +31,7 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; @@ -41,124 +42,128 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFBinary FUNCTION; private static final SDFTranslate HEAD_POS; private static final SDFFlatWave ROOTS_ROT; - + private static final SDFPrimitive CONE1; private static final SDFPrimitive CONE2; private static final SDFPrimitive CONE_GLOW; private static final SDFPrimitive ROOTS; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { - BlockState down = world.getBlockState(blockPos.down()); - if (!down.isOf(EndBlocks.END_MYCELIUM) && !down.isOf(EndBlocks.END_MOSS)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + NoneFeatureConfiguration featureConfig) { + BlockState down = world.getBlockState(blockPos.below()); + if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) + return false; + CONE1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE_GLOW.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); ROOTS.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.getDefaultState(); + return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(0.75F, 1.1F, random); - + if (!SplineHelper.canGenerate(spline, scale, blockPos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, blockPos, AIR); - + CENTER.set(blockPos.getX(), 0, blockPos.getZ()); - HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); + HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); ROOTS_ROT.setAngle(random.nextFloat() * MHelper.PI2); FUNCTION.setSourceA(sdf); - - new SDFScale().setScale(scale) - .setSource(FUNCTION) - .setReplaceFunction(REPLACE) - .setPostProcess((info) -> { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { - if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); - return info.getState(); - } - else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.getDefaultState()); - return info.getState(); - } - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); - return info.getState(); - } - - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState()); - return info.getState(); - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir: BlocksHelper.HORIZONTAL) { - if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, dir)); - } - } - - if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, Direction.DOWN)); - } - } + + new SDFScale().setScale(scale).setSource(FUNCTION).setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { + if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); - }) - .fillRecursive(world, blockPos); - + } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) + || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); + return info.getState(); + } + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); + return info.getState(); + } + + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); + return info.getState(); + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (info.getState(dir) == AIR) { + info.setBlockPos(info.getPos().relative(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); + } + } + + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() + .setValue(FurBlock.FACING, Direction.DOWN)); + } + } + return info.getState(); + }).fillRecursive(world, blockPos); + return true; } - + static { - SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); - SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); + SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); + SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) + .setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + CONE1 = cone1; CONE2 = cone2; - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - - SDF glowCone = new SDFCapedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); + + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); CONE_GLOW = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { - float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() + (float) noise.eval(pos.getX() * 0.1 + CENTER.getX(), pos.getZ() * 0.1 + CENTER.getZ()) * dist * 0.3F - dist * 0.15F; - pos.set(pos.getX(), y, pos.getZ()); + float dist = MHelper.length(pos.x(), pos.z()); + float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + CENTER.x(), pos.z() * 0.1 + CENTER.z()) * dist * 0.3F + - dist * 0.15F; + pos.set(pos.x(), y, pos.z()); }).setSource(cones); - - HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + + HEAD_POS = (SDFTranslate) new SDFTranslate() + .setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); + SDF roots = new SDFSphere().setRadius(4F); ROOTS = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); ROOTS_ROT = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - - FUNCTION = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); - + + FUNCTION = new SDFSmoothUnion().setRadius(4) + .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); + REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index d608b14f..1cc92aa8 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -4,16 +4,17 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -33,97 +34,110 @@ public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (world.getBlockState(pos.down()).getBlock() != EndBlocks.CHORUS_NYLIUM) return false; + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) + return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float size = MHelper.randRange(10, 20, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 4); SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); Vector3f last = spline.get(spline.size() - 1); - + int depth = MHelper.floor((size - 10F) * 3F / 10F + 1F); float bsize = (10F - (size - 10F)) / 10F + 1.5F; - branch(last.getX(), last.getY(), last.getZ(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, depth, world, pos); - + branch(last.x(), last.y(), last.z(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, depth, + world, pos); + SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> { - return EndBlocks.PYTHADENDRON.bark.getDefaultState(); + return EndBlocks.PYTHADENDRON.bark.defaultBlockState(); }); function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursive(world, pos); - + return true; } - - private void branch(float x, float y, float z, float size, float angle, Random random, int depth, StructureWorldAccess world, BlockPos pos) { - if (depth == 0) return; - + + private void branch(float x, float y, float z, float size, float angle, Random random, int depth, + WorldGenLevel world, BlockPos pos) { + if (depth == 0) + return; + float dx = (float) Math.cos(angle) * size * 0.15F; float dz = (float) Math.sin(angle) * size * 0.15F; - + float x1 = x + dx; float z1 = z + dz; float x2 = x - dx; float z2 = z - dz; - + List spline = SplineHelper.makeSpline(x, y, z, x1, y, z1, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos1 = spline.get(spline.size() - 1); - - boolean s1 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.getDefaultState(), pos, REPLACE); - + + boolean s1 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, + REPLACE); + spline = SplineHelper.makeSpline(x, y, z, x2, y, z2, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos2 = spline.get(spline.size() - 1); - - boolean s2 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.getDefaultState(), pos, REPLACE); - + + boolean s2 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, + REPLACE); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); if (depth < 3) { if (s1) { - leavesBall(world, pos.add(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise); + leavesBall(world, pos.offset(pos1.x(), pos1.y(), pos1.z()), random, noise); } if (s2) { - leavesBall(world, pos.add(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise); + leavesBall(world, pos.offset(pos2.x(), pos2.y(), pos2.z()), random, noise); } } - + float size1 = size * MHelper.randRange(0.75F, 0.95F, random); float size2 = size * MHelper.randRange(0.75F, 0.95F, random); float angle1 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); float angle2 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); - + if (s1) { - branch(pos1.getX(), pos1.getY(), pos1.getZ(), size1, angle1, random, depth - 1, world, pos); + branch(pos1.x(), pos1.y(), pos1.z(), size1, angle1, random, depth - 1, world, pos); } if (s2) { - branch(pos2.getX(), pos2.getY(), pos2.getZ(), size2, angle2, random, depth - 1, world, pos); + branch(pos2.x(), pos2.y(), pos2.z(), size2, angle2, random, depth - 1, world, pos); } } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, Random random, OpenSimplexNoise noise) { + + private void leavesBall(WorldGenLevel world, BlockPos pos, Random random, OpenSimplexNoise noise) { float radius = MHelper.randRange(4.5F, 6.5F, random); - - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + MutableBlockPos mut = new MutableBlockPos(); + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.PYTHADENDRON.bark.getDefaultState()); + info.setState(EndBlocks.PYTHADENDRON.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -137,9 +151,9 @@ public class PythadendronTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -151,10 +165,10 @@ public class PythadendronTreeFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); } - + static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) { @@ -165,14 +179,15 @@ public class PythadendronTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.PYTHADENDRON.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { - return EndBlocks.PYTHADENDRON.log.getDefaultState(); + if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) + && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { + return EndBlocks.PYTHADENDRON.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 298e8960..0ef7a3e5 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -5,20 +5,20 @@ import java.util.Random; import java.util.function.Function; import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -35,18 +35,20 @@ import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; public class TenaneaFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; private static final Function IGNORE; private static final List SPLINE; - private static final Direction[] DIRECTIONS = Direction.values(); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(7, 10, random); int count = (int) (size * 0.45F); - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; @@ -54,63 +56,71 @@ public class TenaneaFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, size + MHelper.randRange(0, size * 0.5F, random)); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.bark.getDefaultState(), pos, REPLACE); + SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.bark.defaultBlockState(), pos, REPLACE); Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.3F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - leavesBall(world, pos.add(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise); + leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise); } - + return true; } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.TENANEA_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); }).setSource(sphere); - - Mutable mut = new Mutable(); - for (Direction d1: BlocksHelper.HORIZONTAL) { - BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.getDefaultState()); - for (Direction d2: BlocksHelper.HORIZONTAL) { + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-1.5F, 1.5F, random); + }).setSource(sphere); + + MutableBlockPos mut = new MutableBlockPos(); + for (Direction d1 : BlocksHelper.HORIZONTAL) { + BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); + for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); } } - - BlockState top = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); - BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState(); - + + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); + BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState(); + List support = Lists.newArrayList(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (random.nextInt(6) == 0 && info.getStateDown().isAir()) { - BlockPos d = info.getPos().down(); + BlockPos d = info.getPos().below(); support.add(d); } if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.TENANEA.bark.getDefaultState()); + info.setState(EndBlocks.TENANEA.bark.defaultBlockState()); } - + MHelper.shuffle(DIRECTIONS, random); - for (Direction d: DIRECTIONS) { + for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), outer.with(BlockFur.FACING, d)); + info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); } } - + if (EndBlocks.TENANEA.isTreeLog(info.getState())) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -125,9 +135,9 @@ public class TenaneaFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -139,20 +149,19 @@ public class TenaneaFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.TENANEA.bark); - + support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); - if (state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) { + if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).isOf(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.above()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.down())) { + if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } - else { + } else { break; } } @@ -161,10 +170,10 @@ public class TenaneaFeature extends DefaultFeature { } }); } - + static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.TENANEA_LEAVES) { @@ -175,18 +184,13 @@ public class TenaneaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.TENANEA.isTreeLog(state); }; - - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); + + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 86b28b28..455ed41f 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -5,22 +5,27 @@ import java.util.Random; import java.util.function.Function; import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import ru.betterend.blocks.UmbrellaTreeClusterBlock; +import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFScale3D; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; @@ -31,130 +36,199 @@ import ru.betterend.world.features.DefaultFeature; public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; - private static final Function POST; private static final List SPLINE; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - - BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState(); - BlockState center = EndBlocks.UMBRELLA_TREE.planks.getDefaultState(); - + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) + return false; + + BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() + .setValue(UmbrellaTreeMembraneBlock.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() + .setValue(UmbrellaTreeMembraneBlock.COLOR, 0); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState() + .setValue(UmbrellaTreeClusterBlock.NATURAL, true); + float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; - int x1 = ((pos.getX() >> 4) << 4) - 16; - int z1 = ((pos.getZ() >> 4) << 4) - 16; - Box limits = new Box(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); + List
centers = Lists.newArrayList(); + + float scale = 1; + if (config != null) { + scale = MHelper.randRange(1F, 1.7F, random); + } + for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * MHelper.randRange(1F, 2F, random), sizeXZ); - SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); + // SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); - + if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { - SDF branch = SplineHelper.buildSDF(spline, 1.3F, 0.8F, (bpos) -> { + float rScale = (scale - 1) * 0.4F + 1; + SDF branch = SplineHelper.buildSDF(spline, 1.2F * rScale, 0.8F * rScale, (bpos) -> { return wood; }); - + Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.4F; - + sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); SDF mem = makeMembrane(world, radius, random, membrane, center); - - float px = MHelper.floor(vec.getX()) + 0.5F; - float py = MHelper.floor(vec.getY()) + 0.5F; - float pz = MHelper.floor(vec.getZ()) + 0.5F; + + float px = MHelper.floor(vec.x()) + 0.5F; + float py = MHelper.floor(vec.y()) + 0.5F; + float pz = MHelper.floor(vec.z()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); + centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), + pos.getZ() + (double) (pz * scale), radius * scale)); + + vec = spline.get(0); } } - + if (sdf == null) { return false; } - - makeRoots(world, pos.add(0, 3, 0), size * 0.4F + 5, random, wood); - sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillArea(world, pos, limits); - + + if (scale > 1) { + sdf = new SDFScale().setScale(scale).setSource(sdf); + } + + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.UMBRELLA_TREE.log.defaultBlockState(); + } else if (info.getState().equals(membrane)) { + Center min = centers.get(0); + double d = Double.MAX_VALUE; + BlockPos bpos = info.getPos(); + for (Center c : centers) { + double d2 = c.distance(bpos.getX(), bpos.getZ()); + if (d2 < d) { + d = d2; + min = c; + } + } + int color = MHelper.floor(d / min.radius * 7); + color = Mth.clamp(color, 1, 7); + return info.getState().setValue(UmbrellaTreeMembraneBlock.COLOR, color); + } + return info.getState(); + }).fillRecursive(world, pos); + makeRoots(world, pos, (size * 0.5F + 3) * scale, random, wood); + + for (Center c : centers) { + if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { + count = MHelper.floor(MHelper.randRange(5F, 10F, random) * scale); + float startAngle = random.nextFloat() * MHelper.PI2; + for (int i = 0; i < count; i++) { + float angle = (float) i / count * MHelper.PI2 + startAngle; + float dist = MHelper.randRange(1.5F, 2.5F, random) * scale; + double px = c.px + Math.sin(angle) * dist; + double pz = c.pz + Math.cos(angle) * dist; + makeFruits(world, px, c.py - 1, pz, fruit, scale); + } + } + } + return true; } - - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); } } } - - private SDF makeMembrane(StructureWorldAccess world, float radius, Random random, BlockState membrane, BlockState center) { + + private SDF makeMembrane(WorldGenLevel world, float radius, Random random, BlockState membrane, BlockState center) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(membrane); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); - + float angle = random.nextFloat() * MHelper.PI2; int count = (int) MHelper.randRange(radius, radius * 2, random); if (count < 5) { count = 5; } sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.6F).setSource(sphere); - + SDF cent = new SDFSphere().setRadius(2.5F).setBlock(center); sphere = new SDFUnion().setSourceA(sphere).setSourceB(cent); - + return sphere; } - + + private void makeFruits(WorldGenLevel world, double px, double py, double pz, BlockState fruit, float scale) { + MutableBlockPos mut = new MutableBlockPos().set(px, py, pz); + for (int i = 0; i < 8; i++) { + mut.move(Direction.DOWN); + if (world.isEmptyBlock(mut)) { + BlockState state = world.getBlockState(mut.above()); + if (state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.getValue(UmbrellaTreeMembraneBlock.COLOR) < 2) { + BlocksHelper.setWithoutUpdate(world, mut, fruit); + } + break; + } + } + } + static { - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - + REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { return true; } return state.getMaterial().isReplaceable(); }; - - POST = (info) -> { - if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); - } - return info.getState(); - }; + } + + private class Center { + final double px; + final double py; + final double pz; + final float radius; + + Center(double x, double y, double z, float radius) { + this.px = x; + this.py = y; + this.pz = z; + this.radius = radius; + } + + double distance(float x, float z) { + return MHelper.length(px - x, pz - z); + } } } diff --git a/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java b/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java deleted file mode 100644 index fada1a7b..00000000 --- a/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.betterend.world.generator; - -import java.util.Random; - -import net.minecraft.util.math.noise.PerlinNoiseSampler; -import net.minecraft.world.biome.layer.util.LayerRandomnessSource; - -public class BELayerRandomSource implements LayerRandomnessSource { - private Random random = new Random(0); - - @Override - public int nextInt(int bound) { - return random.nextInt(bound); - } - - @Override - public PerlinNoiseSampler getNoiseSampler() { - return null; - } -} diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 6d626395..ff86b727 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -6,15 +6,14 @@ import com.google.common.collect.Lists; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.math.noise.SimplexNoiseSampler; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryLookupCodec; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.biome.BiomeKeys; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.biome.source.TheEndBiomeSource; -import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.core.Registry; +import net.minecraft.resources.RegistryLookupCodec; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.biome.TheEndBiomeSource; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.synth.SimplexNoise; import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; @@ -24,7 +23,7 @@ import ru.betterend.world.biome.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { - return instance.group(RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter((theEndBiomeSource) -> { + return instance.group(RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter((theEndBiomeSource) -> { return theEndBiomeSource.biomeRegistry; }), Codec.LONG.fieldOf("seed").stable().forGetter((theEndBiomeSource) -> { return theEndBiomeSource.seed; @@ -32,7 +31,7 @@ public class BetterEndBiomeSource extends BiomeSource { }); private static final OpenSimplexNoise SMALL_NOISE = new OpenSimplexNoise(8324); private final Registry biomeRegistry; - private final SimplexNoiseSampler noise; + private final SimplexNoise noise; private final Biome centerBiome; private final Biome barrens; private BiomeMap mapLand; @@ -42,16 +41,16 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); - this.mapLand = new BiomeMap(seed, 256, EndBiomes.LAND_BIOMES); - this.mapVoid = new BiomeMap(seed, 256, EndBiomes.VOID_BIOMES); - this.centerBiome = biomeRegistry.getOrThrow(BiomeKeys.THE_END); - this.barrens = biomeRegistry.getOrThrow(BiomeKeys.END_BARRENS); + this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); + this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); + this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); + this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); this.biomeRegistry = biomeRegistry; this.seed = seed; - ChunkRandom chunkRandom = new ChunkRandom(seed); - chunkRandom.consume(17292); - this.noise = new SimplexNoiseSampler(chunkRandom); + WorldgenRandom chunkRandom = new WorldgenRandom(seed); + chunkRandom.consumeCount(17292); + this.noise = new SimplexNoise(chunkRandom); EndBiomes.mutateRegistry(biomeRegistry); EndTags.addTerrainTags(biomeRegistry); @@ -61,7 +60,7 @@ public class BetterEndBiomeSource extends BiomeSource { private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { + if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { list.add(biome); } }); @@ -69,23 +68,65 @@ public class BetterEndBiomeSource extends BiomeSource { } @Override - public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { + public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { + boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - if (i + j <= 65536L) return this.centerBiome; - float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - - if (height > -20F && height < -5F) { - return barrens; + long dist = i + j; + if (hasVoid) { + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.getValue(i * 0.2, j * 0.2) * 10; + if (dist <= 625L) { + return this.centerBiome; + } } - EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); mapVoid.clearCache(); } - return endBiome.getActualBiome(); + + EndBiome endBiome = null; + if (GeneratorOptions.useNewGenerator()) { + if (TerrainGenerator.isLand(biomeX, biomeZ)) { + endBiome = mapLand.getBiome(biomeX << 2, biomeZ << 2); + } + else { + endBiome = mapVoid.getBiome(biomeX << 2, biomeZ << 2); + } + } + else { + float height = TheEndBiomeSource.getHeightValue(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; + + if (height > -20F && height < -5F) { + return barrens; + } + + endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); + } + + return EndBiomes.getActualBiome(endBiome); + } + + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { + boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); + long i = (long) biomeX * (long) biomeX; + long j = (long) biomeZ * (long) biomeZ; + + long dist = i + j; + if (hasVoid) { + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.getValue(i * 0.2, j * 0.2) * 10; + if (dist <= 625L) { + return this.centerBiome; + } + } + return EndBiomes.getActualBiome(mapLand.getBiome(biomeX << 2, biomeZ << 2)); } @Override @@ -94,7 +135,7 @@ public class BetterEndBiomeSource extends BiomeSource { } @Override - protected Codec getCodec() { + protected Codec codec() { return CODEC; } diff --git a/src/main/java/ru/betterend/world/generator/BiomeChunk.java b/src/main/java/ru/betterend/world/generator/BiomeChunk.java index 96dd258f..3756eec9 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeChunk.java +++ b/src/main/java/ru/betterend/world/generator/BiomeChunk.java @@ -4,36 +4,32 @@ import java.util.Random; import ru.betterend.world.biome.EndBiome; -public class BiomeChunk -{ +public class BiomeChunk { protected static final int WIDTH = 16; private static final int SM_WIDTH = WIDTH >> 1; private static final int MASK_OFFSET = SM_WIDTH - 1; protected static final int MASK_WIDTH = WIDTH - 1; - + private final EndBiome[][] biomes; - - public BiomeChunk(BiomeMap map, Random random, BiomePicker picker) - { + + public BiomeChunk(BiomeMap map, Random random, BiomePicker picker) { EndBiome[][] PreBio = new EndBiome[SM_WIDTH][SM_WIDTH]; biomes = new EndBiome[WIDTH][WIDTH]; - + for (int x = 0; x < SM_WIDTH; x++) for (int z = 0; z < SM_WIDTH; z++) PreBio[x][z] = picker.getBiome(random); - + for (int x = 0; x < WIDTH; x++) for (int z = 0; z < WIDTH; z++) biomes[x][z] = PreBio[offsetXZ(x, random)][offsetXZ(z, random)].getSubBiome(random); } - public EndBiome getBiome(int x, int z) - { + public EndBiome getBiome(int x, int z) { return biomes[x & MASK_WIDTH][z & MASK_WIDTH]; } - - private int offsetXZ(int x, Random random) - { + + private int offsetXZ(int x, Random random) { return ((x + random.nextInt(2)) >> 1) & MASK_OFFSET; } } diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index 450b162e..1aa8c3c8 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -1,18 +1,19 @@ package ru.betterend.world.generator; -import java.util.HashMap; +import java.util.Map; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.gen.ChunkRandom; +import com.google.common.collect.Maps; + +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.WorldgenRandom; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; -public class BiomeMap -{ - private static final ChunkRandom RANDOM = new ChunkRandom(); +public class BiomeMap { + private static final WorldgenRandom RANDOM = new WorldgenRandom(); - private final HashMap maps = new HashMap(); + private final Map maps = Maps.newHashMap(); private final int size; private final int sizeXZ; private final int depth; @@ -20,8 +21,7 @@ public class BiomeMap private final OpenSimplexNoise noiseZ; private final BiomePicker picker; - public BiomeMap(long seed, int size, BiomePicker picker) - { + public BiomeMap(long seed, int size, BiomePicker picker) { maps.clear(); RANDOM.setSeed(seed); noiseX = new OpenSimplexNoise(RANDOM.nextLong()); @@ -32,15 +32,13 @@ public class BiomeMap this.picker = picker; } - public void clearCache() - { + public void clearCache() { if (maps.size() > 32) { maps.clear(); } } - private EndBiome getRawBiome(int bx, int bz) - { + private EndBiome getRawBiome(int bx, int bz) { double x = (double) bx * size / sizeXZ; double z = (double) bz * size / sizeXZ; double nx = x; @@ -49,8 +47,7 @@ public class BiomeMap double px = bx * 0.2; double pz = bz * 0.2; - for (int i = 0; i < depth; i++) - { + for (int i = 0; i < depth; i++) { nx = (x + noiseX.eval(px, pz)) / 2F; nz = (z + noiseZ.eval(px, pz)) / 2F; @@ -72,9 +69,8 @@ public class BiomeMap ChunkPos cpos = new ChunkPos(MHelper.floor(x / BiomeChunk.WIDTH), MHelper.floor(z / BiomeChunk.WIDTH)); BiomeChunk chunk = maps.get(cpos); - if (chunk == null) - { - RANDOM.setTerrainSeed(cpos.x, cpos.z); + if (chunk == null) { + RANDOM.setBaseChunkSeed(cpos.x, cpos.z); chunk = new BiomeChunk(this, RANDOM, picker); maps.put(cpos, chunk); } @@ -82,15 +78,14 @@ public class BiomeMap return chunk.getBiome(MHelper.floor(x), MHelper.floor(z)); } - public EndBiome getBiome(int x, int z) - { + public EndBiome getBiome(int x, int z) { EndBiome biome = getRawBiome(x, z); - if (biome.hasEdge() || (biome.hasParentBiome() && biome.getParentBiome().hasEdge())) - { + if (biome.hasEdge() || (biome.hasParentBiome() && biome.getParentBiome().hasEdge())) { EndBiome search = biome; - if (biome.hasParentBiome()) + if (biome.hasParentBiome()) { search = biome.getParentBiome(); + } int d = (int) Math.ceil(search.getEdgeSize() / 4F) << 2; boolean edge = !search.isSame(getRawBiome(x + d, z)); @@ -102,8 +97,7 @@ public class BiomeMap edge = edge || !search.isSame(getRawBiome(x + 1, z - 1)); edge = edge || !search.isSame(getRawBiome(x + 1, z + 1)); - if (edge) - { + if (edge) { biome = search.getEdge(); } } diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 15108bb8..8239777f 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -7,11 +7,11 @@ import java.util.Set; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.world.biome.EndBiome; public class BiomePicker { - private final Set immutableIDs = Sets.newHashSet(); + private final Set immutableIDs = Sets.newHashSet(); private final List biomes = Lists.newArrayList(); private float maxChanceUnmutable = 0; private float maxChance = 0; @@ -28,28 +28,45 @@ public class BiomePicker { public void addBiomeMutable(EndBiome biome) { biomes.add(biome); - maxChance = biome.mutateGenChance(maxChance); } public void clearMutables() { maxChance = maxChanceUnmutable; - for (int i = biomes.size() - 1; i >= biomeCount; i--) + for (int i = biomes.size() - 1; i >= biomeCount; i--) { biomes.remove(i); + } } public EndBiome getBiome(Random random) { - return tree.getBiome(random.nextFloat() * maxChance); + return biomes.isEmpty() ? null : tree.getBiome(random.nextFloat() * maxChance); } public List getBiomes() { return biomes; } - public boolean containsImmutable(Identifier id) { + public boolean containsImmutable(ResourceLocation id) { return immutableIDs.contains(id); } + public void removeMutableBiome(ResourceLocation id) { + for (int i = biomeCount; i < biomes.size(); i++) { + EndBiome biome = biomes.get(i); + if (biome.getID().equals(id)) { + biomes.remove(i); + break; + } + } + } + public void rebuild() { + if (biomes.isEmpty()) { + return; + } + maxChance = maxChanceUnmutable; + for (int i = biomeCount; i < biomes.size(); i++) { + maxChance = biomes.get(i).mutateGenChance(maxChance); + } tree = new WeighTree(biomes); } } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java new file mode 100644 index 00000000..5c7f6c2d --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -0,0 +1,145 @@ +package ru.betterend.world.generator; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import ru.betterend.config.Configs; + +public class GeneratorOptions { + private static int biomeSizeLand; + private static int biomeSizeVoid; + private static boolean hasPortal; + private static boolean hasPillars; + private static boolean hasDragonFights; + private static boolean swapOverworldToEnd; + private static boolean changeChorusPlant; + private static boolean removeChorusFromVanillaBiomes; + private static boolean newGenerator; + private static boolean noRingVoid; + private static boolean generateCentralIsland; + private static boolean generateObsidianPlatform; + private static int endCityFailChance; + public static LayerOptions bigOptions; + public static LayerOptions mediumOptions; + public static LayerOptions smallOptions; + private static boolean changeSpawn; + private static BlockPos spawn; + private static BlockPos portal = BlockPos.ZERO; + private static boolean replacePortal; + private static boolean replacePillars; + private static long islandDistBlock; + private static int islandDistChunk; + + public static void init() { + biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); + biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); + hasPortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "hasPortal", true); + hasPillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "hasSpikes", true); + hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); + swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); + changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); + removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); + generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", true); + endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); + generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); + bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); + mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); + smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); + changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); + spawn = new BlockPos( + Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) + ); + replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); + replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); + int circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); + islandDistBlock = (long) circleRadius * (long) circleRadius; + islandDistChunk = (circleRadius >> 3); // Twice bigger than normal + } + + public static int getBiomeSizeLand() { + return Mth.clamp(biomeSizeLand, 1, 8192); + } + + public static int getBiomeSizeVoid() { + return Mth.clamp(biomeSizeVoid, 1, 8192); + } + + public static boolean hasPortal() { + return hasPortal; + } + + public static boolean hasPillars() { + return hasPillars; + } + + public static boolean hasDragonFights() { + return hasDragonFights; + } + + public static boolean swapOverworldToEnd() { + return swapOverworldToEnd; + } + + public static boolean changeChorusPlant() { + return changeChorusPlant; + } + + public static boolean removeChorusFromVanillaBiomes() { + return removeChorusFromVanillaBiomes; + } + + public static boolean noRingVoid() { + return noRingVoid; + } + + public static boolean useNewGenerator() { + return newGenerator; + } + + public static boolean hasCentralIsland() { + return generateCentralIsland; + } + + public static boolean generateObsidianPlatform() { + return generateObsidianPlatform; + } + + public static int getEndCityFailChance() { + return endCityFailChance; + } + + public static boolean changeSpawn() { + return changeSpawn; + } + + public static BlockPos getSpawn() { + return spawn; + } + + public static BlockPos getPortalPos() { + return portal; + } + + public static void setPortalPos(BlockPos portal) { + GeneratorOptions.portal = portal; + } + + public static boolean replacePortal() { + return replacePortal; + } + + public static boolean replacePillars() { + return replacePillars; + } + + public static long getIslandDistBlock() { + return islandDistBlock; + } + + public static int getIslandDistChunk() { + return islandDistChunk; + } +} diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java new file mode 100644 index 00000000..d50f2797 --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -0,0 +1,188 @@ +package ru.betterend.world.generator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.minecraft.core.BlockPos; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFRadialNoiseMap; +import ru.betterend.util.sdf.operator.SDFScale; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; + +public class IslandLayer { + private static final Random RANDOM = new Random(); + private final SDFRadialNoiseMap noise; + private final SDF island; + + private final List positions = new ArrayList(9); + private final Map islands = Maps.newHashMap(); + private final OpenSimplexNoise density; + private final int seed; + private int lastX = Integer.MIN_VALUE; + private int lastZ = Integer.MIN_VALUE; + private final LayerOptions options; + + public IslandLayer(int seed, LayerOptions options) { + this.density = new OpenSimplexNoise(seed); + this.options = options; + this.seed = seed; + + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); + island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); + } + + private int getSeed(int x, int z) { + int h = seed + x * 374761393 + z * 668265263; + h = (h ^ (h >> 13)) * 1274126177; + return h ^ (h >> 16); + } + + public void updatePositions(double x, double z) { + int ix = MHelper.floor(x / options.distance); + int iz = MHelper.floor(z / options.distance); + + if (lastX != ix || lastZ != iz) { + lastX = ix; + lastZ = iz; + positions.clear(); + for (int pox = -1; pox < 2; pox++) { + int px = pox + ix; + long px2 = px; + for (int poz = -1; poz < 2; poz++) { + int pz = poz + iz; + long pz2 = pz; + if (GeneratorOptions.noRingVoid() || px2 * px2 + pz2 * pz2 > options.centerDist) { + RANDOM.setSeed(getSeed(px, pz)); + double posX = (px + RANDOM.nextFloat()) * options.distance; + double posY = MHelper.randRange(options.minY, options.maxY, RANDOM); + double posZ = (pz + RANDOM.nextFloat()) * options.distance; + if (density.eval(posX * 0.01, posZ * 0.01) > options.coverage) { + positions.add(new BlockPos(posX, posY, posZ)); + } + } + } + } + } + + if (GeneratorOptions.hasCentralIsland() && Math.abs(ix) < GeneratorOptions.getIslandDistChunk() && Math.abs(iz) < GeneratorOptions.getIslandDistChunk()) { + int count = positions.size(); + for (int n = 0; n < count; n++) { + BlockPos pos = positions.get(n); + long d = (long) pos.getX() * (long) pos.getX() + (long) pos.getZ() * (long) pos.getZ(); + if (d < GeneratorOptions.getIslandDistBlock()) { + positions.remove(n); + count--; + n--; + } + } + if (options.hasCentralIsland) { + positions.add(new BlockPos(0, 64, 0)); + } + } + } + + private SDF getIsland(BlockPos pos) { + SDF island = islands.get(pos); + if (island == null) { + if (pos.getX() == 0 && pos.getZ() == 0) { + island = new SDFScale().setScale(1.3F).setSource(this.island); + } + else { + RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island); + } + islands.put(pos, island); + } + noise.setOffset(pos.getX(), pos.getZ()); + return island; + } + + private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { + float x = (float) (px - center.getX()) / options.scale; + float y = (float) (py - center.getY()) / options.scale; + float z = (float) (pz - center.getZ()) / options.scale; + return sdf.getDistance(x, y, z); + } + + private float calculateSDF(double x, double y, double z) { + float distance = 10; + for (BlockPos pos: positions) { + SDF island = getIsland(pos); + float dist = getRelativeDistance(island, pos, x, y, z); + distance = MHelper.min(distance, dist); + } + return distance; + } + + public float getDensity(double x, double y, double z) { + return -calculateSDF(x, y, z); + } + + public float getDensity(double x, double y, double z, float height) { + noise.setIntensity(height); + noise.setRadius(0.5F / (1 + height)); + return -calculateSDF(x, y, z); + } + + public void clearCache() { + if (islands.size() > 128) { + islands.clear(); + } + } + + private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { + float hh = height * 0.5F; + SDF sdf = new SDFCappedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); + return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); + } + + /*private static NativeImage loadMap(String path) { + InputStream stream = IslandLayer.class.getResourceAsStream(path); + if (stream != null) { + try { + NativeImage map = NativeImage.read(stream); + stream.close(); + return map; + } + catch (IOException e) { + BetterEnd.LOGGER.warning(e.getMessage()); + } + } + return null; + }*/ + + /*static { + NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); + + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + + SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); + NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); + + ISLAND = new SDF[] { + new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), + new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) + }; + }*/ +} diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java new file mode 100644 index 00000000..9c57bd3c --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -0,0 +1,48 @@ +package ru.betterend.world.generator; + +import net.minecraft.util.Mth; +import ru.betterend.config.PathConfig; + +public class LayerOptions { + public final float distance; + public final float scale; + public final float coverage; + public final int center; + public final int heightVariation; + public final int minY; + public final int maxY; + public final long centerDist; + public final boolean hasCentralIsland; + + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, boolean hasCentral) { + this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); + this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); + this.center = clampCenter(config.getInt(name, "averageHeight[0-255]", center)); + this.heightVariation = clampVariation(config.getInt(name, "heightVariation[0-255]", heightVariation)); + this.coverage = clampCoverage(config.getFloat(name, "coverage[0-1]", 0.5F)); + this.minY = this.center - this.heightVariation; + this.maxY = this.center + this.heightVariation; + this.centerDist = Mth.floor(1000 / this.distance); + this.hasCentralIsland = config.getBoolean(name, "hasCentralIsland", hasCentral); + } + + private float clampDistance(float value) { + return Mth.clamp(value, 1, 8192); + } + + private float clampScale(float value) { + return Mth.clamp(value, 0.1F, 1024); + } + + private float clampCoverage(float value) { + return 0.9999F - Mth.clamp(value, 0, 1) * 2; + } + + private int clampCenter(int value) { + return Mth.clamp(value, 0, 255); + } + + private int clampVariation(int value) { + return Mth.clamp(value, 0, 255); + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java new file mode 100644 index 00000000..b4ce4e53 --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -0,0 +1,196 @@ +package ru.betterend.world.generator; + +import java.awt.Point; +import java.util.List; +import java.util.Random; +import java.util.concurrent.locks.ReentrantLock; + +import com.google.common.collect.Lists; + +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + +public class TerrainGenerator { + private static final ReentrantLock LOCKER = new ReentrantLock(); + private static final double SCALE_XZ = 8.0; + private static final double SCALE_Y = 4.0; + private static final float[] COEF; + private static final Point[] OFFS; + + private static IslandLayer largeIslands; + private static IslandLayer mediumIslands; + private static IslandLayer smallIslands; + private static OpenSimplexNoise noise1; + private static OpenSimplexNoise noise2; + + /*public static boolean canGenerate(int x, int z) { + return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; + }*/ + + public static void initNoise(long seed) { + Random random = new Random(seed); + largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); + mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions); + smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions); + noise1 = new OpenSimplexNoise(random.nextInt()); + noise2 = new OpenSimplexNoise(random.nextInt()); + } + + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { + LOCKER.lock(); + + largeIslands.clearCache(); + mediumIslands.clearCache(); + smallIslands.clearCache(); + + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; + double px = (double) x * SCALE_XZ + distortion1; + double pz = (double) z * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; + + for (int y = 0; y < buffer.length; y++) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz, height); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; + } + buffer[y] = dist; + } + + LOCKER.unlock(); + } + + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { + if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { + return 0F; + } + float depth = 0F; + for (int i = 0; i < OFFS.length; i++) { + int px = x + OFFS[i].x; + int pz = z + OFFS[i].y; + depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i]; + } + return depth; + } + + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { + if (biomeSource instanceof BetterEndBiomeSource) { + return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); + } + return biomeSource.getNoiseBiome(x, 0, z); + } + + /** + * Check if this is land + * @param x - biome pos x + * @param z - biome pos z + */ + public static boolean isLand(int x, int z) { + LOCKER.lock(); + + double px = (x >> 1) + 0.5; + double pz = (z >> 1) + 0.5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + px = px * SCALE_XZ + distortion1; + pz = pz * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + for (int y = 0; y < 32; y++) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; + } + if (dist > -0.01) { + LOCKER.unlock(); + return true; + } + } + + LOCKER.unlock(); + return false; + } + + /** + * Get something like height + * @param x - block pos x + * @param z - block pos z + */ + public static int getHeight(int x, int z) { + LOCKER.lock(); + + double px = (double) x / 8.0; + double pz = (double) z / 8.0; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + px = (double) x * SCALE_XZ + distortion1; + pz = (double) z * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + for (int y = 32; y >= 0; y--) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; + } + if (dist > 0) { + LOCKER.unlock(); + return Mth.floor(Mth.clamp(y + dist, y, y + 1) * SCALE_Y); + } + } + + LOCKER.unlock(); + return 0; + } + + static { + float sum = 0; + List coef = Lists.newArrayList(); + List pos = Lists.newArrayList(); + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + float dist = MHelper.length(x, z) / 3F; + if (dist <= 1) { + sum += dist; + coef.add(dist); + pos.add(new Point(x, z)); + } + } + } + OFFS = pos.toArray(new Point[] {}); + COEF = new float[coef.size()]; + for (int i = 0; i < COEF.length; i++) { + COEF[i] = coef.get(i) / sum; + } + } +} diff --git a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java index 16e386a4..92d2b335 100644 --- a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java @@ -1,11 +1,11 @@ package ru.betterend.world.processors; -import net.minecraft.structure.Structure.StructureBlockInfo; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.StructureProcessor; -import net.minecraft.structure.processor.StructureProcessorType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @@ -17,8 +17,8 @@ public class DestructionStructureProcessor extends StructureProcessor { } @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { - if (!structureBlockInfo2.state.isOf(EndBlocks.ETERNAL_PEDESTAL) && !structureBlockInfo2.state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && MHelper.RANDOM.nextInt(chance) == 0) { + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlacementData) { + if (!structureBlockInfo2.state.is(EndBlocks.ETERNAL_PEDESTAL) && !structureBlockInfo2.state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && MHelper.RANDOM.nextInt(chance) == 0) { return null; } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java index a809249a..a937a1c7 100644 --- a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java @@ -1,21 +1,21 @@ package ru.betterend.world.processors; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.structure.Structure.StructureBlockInfo; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.StructureProcessor; -import net.minecraft.structure.processor.StructureProcessorType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; public class TerrainStructureProcessor extends StructureProcessor { @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlacementData) { BlockPos bpos = structureBlockInfo2.pos; - if (structureBlockInfo2.state.isOf(Blocks.END_STONE) && worldView.isAir(bpos.up())) { - BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - return new StructureBlockInfo(bpos, top, structureBlockInfo2.tag); + if (structureBlockInfo2.state.is(Blocks.END_STONE) && worldView.isEmptyBlock(bpos.above())) { + BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + return new StructureBlockInfo(bpos, top, structureBlockInfo2.nbt); } return structureBlockInfo2; } diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index 5e10a5fa..396fc2a1 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -3,22 +3,22 @@ package ru.betterend.world.structures; import java.util.Random; import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.BetterEnd; public class EndStructureFeature { private static final Random RANDOM = new Random(354); - private final StructureFeature structure; + private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; - private final GenerationStep.Feature featureStep; + private final GenerationStep.Decoration featureStep; - public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Feature step, int spacing, int separation) { - Identifier id = BetterEnd.makeID(name); + public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { + ResourceLocation id = BetterEnd.makeID(name); this.featureStep = step; this.structure = FabricStructureBuilder.create(id, structure) @@ -26,12 +26,12 @@ public class EndStructureFeature { .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) .register(); - this.featureConfigured = this.structure.configure(DefaultFeatureConfig.DEFAULT); + this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); - BuiltinRegistries.add(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); + BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); } - public StructureFeature getStructure() { + public StructureFeature getStructure() { return structure; } @@ -39,7 +39,7 @@ public class EndStructureFeature { return featureConfigured; } - public GenerationStep.Feature getFeatureStep() { + public GenerationStep.Decoration getFeatureStep() { return featureStep; } } diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index ef736c8f..5ae3f4f3 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -4,16 +4,16 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.structure.BoundingBox; public class StructureWorld { private Map parts = Maps.newHashMap(); @@ -72,10 +72,10 @@ public class StructureWorld { lastPart = part; } - public boolean placeChunk(StructureWorldAccess world, ChunkPos chunkPos) { + public boolean placeChunk(WorldGenLevel world, ChunkPos chunkPos) { Part part = parts.get(chunkPos); if (part != null) { - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); part.placeChunk(chunk); return true; } @@ -98,11 +98,11 @@ public class StructureWorld { return tag; } - public BlockBox getBounds() { + public BoundingBox getBounds() { if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE || maxZ == Integer.MIN_VALUE) { - return BlockBox.empty(); + return BoundingBox.getUnknownBox(); } - return new BlockBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); + return new BoundingBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); } private static final class Part { @@ -115,14 +115,14 @@ public class StructureWorld { ListTag map2 = tag.getList("states", 10); BlockState[] states = new BlockState[map2.size()]; for (int i = 0; i < states.length; i++) { - states[i] = NbtHelper.toBlockState((CompoundTag) map2.get(i)); + states[i] = NbtUtils.readBlockState((CompoundTag) map2.get(i)); } map.forEach((element) -> { CompoundTag block = (CompoundTag) element; - BlockPos pos = NbtHelper.toBlockPos(block.getCompound("pos")); + BlockPos pos = NbtUtils.readBlockPos(block.getCompound("pos")); int stateID = block.getInt("state"); - BlockState state = stateID < states.length ? states[stateID] : Block.getStateFromRawId(stateID); + BlockState state = stateID < states.length ? states[stateID] : Block.stateById(stateID); blocks.put(pos, state); }); } @@ -132,7 +132,7 @@ public class StructureWorld { blocks.put(inner, state); } - void placeChunk(Chunk chunk) { + void placeChunk(ChunkAccess chunk) { blocks.forEach((pos, state) -> { chunk.setBlockState(pos, state, false); }); @@ -155,11 +155,11 @@ public class StructureWorld { if (stateID < 0) { stateID = id[0] ++; states.put(state, stateID); - stateMap.add(NbtHelper.fromBlockState(state)); + stateMap.add(NbtUtils.writeBlockState(state)); } CompoundTag block = new CompoundTag(); - block.put("pos", NbtHelper.fromBlockPos(pos)); + block.put("pos", NbtUtils.writeBlockPos(pos)); block.putInt("state", stateID); map.add(block); }); diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java new file mode 100644 index 00000000..5cb3dcc9 --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -0,0 +1,62 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import ru.betterend.BetterEnd; +import ru.betterend.util.MHelper; +import ru.betterend.util.StructureHelper; +import ru.betterend.world.structures.piece.NBTPiece; + +public class EternalPortalStructure extends FeatureBaseStructure { + private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); + private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); + + @Override + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { + long x = chunkPos.x; + long z = chunkPos.z; + if (x * x + z * z < 10000) { + return false; + } + if (chunkGenerator.getBaseHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Types.WORLD_SURFACE_WG) < 10) { + return false; + } + return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); + } + + @Override + public StructureFeature.StructureStartFactory getStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + if (y > 4) { + this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); + } + this.calculateBoundingBox(); + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java new file mode 100644 index 00000000..a3986e2f --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -0,0 +1,50 @@ +package ru.betterend.world.structures.features; + +import java.util.Random; + +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public abstract class FeatureBaseStructure extends StructureFeature { + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + + public FeatureBaseStructure() { + super(NoneFeatureConfiguration.CODEC); + } + + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { + return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; + } + + private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + Random random = new Random((long) (chunkX + chunkZ * 10387313)); + Rotation blockRotation = Rotation.getRandom(random); + int i = 5; + int j = 5; + if (blockRotation == Rotation.CLOCKWISE_90) { + i = -5; + } else if (blockRotation == Rotation.CLOCKWISE_180) { + i = -5; + j = -5; + } else if (blockRotation == Rotation.COUNTERCLOCKWISE_90) { + j = -5; + } + + int k = (chunkX << 4) + 7; + int l = (chunkZ << 4) + 7; + int m = chunkGenerator.getFirstOccupiedHeight(k, l, Heightmap.Types.WORLD_SURFACE_WG); + int n = chunkGenerator.getFirstOccupiedHeight(k, l + j, Heightmap.Types.WORLD_SURFACE_WG); + int o = chunkGenerator.getFirstOccupiedHeight(k + i, l, Heightmap.Types.WORLD_SURFACE_WG); + int p = chunkGenerator.getFirstOccupiedHeight(k + i, l + j, Heightmap.Types.WORLD_SURFACE_WG); + return Math.min(Math.min(m, n), Math.min(o, p)); + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java similarity index 58% rename from src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java rename to src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 89e29468..d844fa06 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -4,27 +4,28 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFRotation; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.world.structures.piece.VoxelPiece; -public class StructureGiantIceStar extends SDFStructureFeature { +public class GiantIceStarStructure extends SDFStructureFeature { private final float minSize = 20; private final float maxSize = 35; private final int minCount = 25; @@ -36,18 +37,18 @@ public class StructureGiantIceStar extends SDFStructureFeature { int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCapedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); for (Vector3f point: points) { SDF rotated = spike; point = MHelper.normalize(point); - float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); + float angle = MHelper.angle(Vector3f.YP, point); if (angle > 0.01F && angle < 3.14F) { - Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); + Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); } else if (angle > 1) { - rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); + rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } @@ -58,12 +59,12 @@ public class StructureGiantIceStar extends SDFStructureFeature { final float randScale = size * 0.3F; final BlockPos center = pos; - final BlockState ice = EndBlocks.EMERALD_ICE.getDefaultState(); - final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.getDefaultState(); - final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); + final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); + final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); + final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - return sdf.setPostProcess((info) -> { + return sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); @@ -97,23 +98,23 @@ public class StructureGiantIceStar extends SDFStructureFeature { } @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return StarStructureStart::new; } - public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public static class StarStructureStart extends StructureStart { + public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); - this.children.add(piece); - this.setBoundingBoxFromChildren(); + this.pieces.add(piece); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java similarity index 71% rename from src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java rename to src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index b4ca3c4b..6cf3b28a 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -3,11 +3,12 @@ package ru.betterend.world.structures.features; import java.util.List; import java.util.Random; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.basis.BlockFur; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -24,15 +25,15 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; -public class StructureGiantMossyGlowshroom extends SDFStructureFeature { +public class GiantMossyGlowshroomStructure extends SDFStructureFeature { @Override protected SDF getSDF(BlockPos center, Random random) { - SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); - SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); + SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); + SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); @@ -43,7 +44,7 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - SDF glowCone = new SDFCapedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); SDFPrimitive priGlowCone = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); @@ -52,9 +53,9 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { - float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() + (float) noise.eval(pos.getX() * 0.1 + center.getX(), pos.getZ() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; - pos.set(pos.getX(), y, pos.getZ()); + float dist = MHelper.length(pos.x(), pos.z()); + float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + center.getX(), pos.z() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; + pos.set(pos.x(), y, pos.z()); }).setSource(cones); SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); @@ -76,47 +77,47 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.getDefaultState(); + return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(2F, 3.5F, random); - HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); + HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); rotRoots.setAngle(random.nextFloat() * MHelper.PI2); function.setSourceA(sdf); return new SDFRound().setRadius(1.5F).setSource(new SDFScale() .setScale(scale) .setSource(function)) - .setPostProcess((info) -> { + .addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.getDefaultState()); + info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); return info.getState(); } } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState()); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); return info.getState(); } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { for (Direction dir: BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, dir)); + info.setBlockPos(info.getPos().relative(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); } } if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java new file mode 100644 index 00000000..2ed7f3c7 --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -0,0 +1,41 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import ru.betterend.util.MHelper; +import ru.betterend.world.structures.piece.LakePiece; + +public class MegaLakeSmallStructure extends FeatureBaseStructure { + @Override + public StructureFeature.StructureStartFactory getStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + if (y > 5) { + float radius = MHelper.randRange(20, 40, random); + float depth = MHelper.randRange(5, 10, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + this.pieces.add(piece); + } + this.calculateBoundingBox(); + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java new file mode 100644 index 00000000..8a433b2f --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -0,0 +1,41 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import ru.betterend.util.MHelper; +import ru.betterend.world.structures.piece.LakePiece; + +public class MegaLakeStructure extends FeatureBaseStructure { + @Override + public StructureFeature.StructureStartFactory getStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + if (y > 5) { + float radius = MHelper.randRange(32, 64, random); + float depth = MHelper.randRange(7, 15, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + this.pieces.add(piece); + } + this.calculateBoundingBox(); + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java new file mode 100644 index 00000000..8ae1acfa --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -0,0 +1,41 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import ru.betterend.util.MHelper; +import ru.betterend.world.structures.piece.CrystalMountainPiece; + +public class MountainStructure extends FeatureBaseStructure { + @Override + public StructureFeature.StructureStartFactory getStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + if (y > 5) { + float radius = MHelper.randRange(50, 100, random); + float height = radius * MHelper.randRange(0.8F, 1.2F, random); + CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); + this.pieces.add(piece); + } + this.calculateBoundingBox(); + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java new file mode 100644 index 00000000..b9e192dc --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -0,0 +1,58 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; +import ru.betterend.world.structures.piece.PaintedMountainPiece; + +public class PaintedMountainStructure extends FeatureBaseStructure { + private static final BlockState[] VARIANTS; + + @Override + public StructureFeature.StructureStartFactory getStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + if (y > 50) { + float radius = MHelper.randRange(50, 100, random); + float height = radius * MHelper.randRange(0.4F, 0.6F, random); + int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1); + BlockState[] slises = new BlockState[count]; + for (int i = 0; i < count; i++) { + slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; + } + this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); + } + this.calculateBoundingBox(); + } + } + + static { + VARIANTS = new BlockState[] { + Blocks.END_STONE.defaultBlockState(), + EndBlocks.FLAVOLITE.stone.defaultBlockState(), + EndBlocks.VIOLECITE.stone.defaultBlockState(), + }; + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 42a31a73..75acf8e9 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -2,45 +2,45 @@ package ru.betterend.world.structures.features; import java.util.Random; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; -public abstract class SDFStructureFeature extends StructureFeatureBase { +public abstract class SDFStructureFeature extends FeatureBaseStructure { protected abstract SDF getSDF(BlockPos pos, Random random); @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 5) { BlockPos start = new BlockPos(x, y, z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); - this.children.add(piece); + this.pieces.add(piece); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java b/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java deleted file mode 100644 index d0f4e6b7..00000000 --- a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.betterend.world.structures.features; - -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; -import ru.betterend.BetterEnd; -import ru.betterend.util.MHelper; -import ru.betterend.util.StructureHelper; -import ru.betterend.world.structures.piece.NBTPiece; - -public class StructureEternalPortal extends StructureFeatureBase { - private static final Identifier STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); - private static final Structure STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - - @Override - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { - long x = chunkPos.x * chunkPos.x; - long z = chunkPos.z * chunkPos.z; - long d = x * x + z * z; - if (d < 1024) { - return false; - } - if (chunkGenerator.getHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Type.WORLD_SURFACE_WG) < 58) { - return false; - } - return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); - } - - @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { - return SDFStructureStart::new; - } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - - @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 10) { - this.children.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); - } - this.setBoundingBoxFromChildren(); - } - } -} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java deleted file mode 100644 index 845a4ad0..00000000 --- a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.betterend.world.structures.features; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.Heightmap; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; - -public abstract class StructureFeatureBase extends StructureFeature { - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - - public StructureFeatureBase() { - super(DefaultFeatureConfig.CODEC); - } - - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { - return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 50; - } - - private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { - Random random = new Random((long) (chunkX + chunkZ * 10387313)); - BlockRotation blockRotation = BlockRotation.random(random); - int i = 5; - int j = 5; - if (blockRotation == BlockRotation.CLOCKWISE_90) { - i = -5; - } else if (blockRotation == BlockRotation.CLOCKWISE_180) { - i = -5; - j = -5; - } else if (blockRotation == BlockRotation.COUNTERCLOCKWISE_90) { - j = -5; - } - - int k = (chunkX << 4) + 7; - int l = (chunkZ << 4) + 7; - int m = chunkGenerator.getHeightInGround(k, l, Heightmap.Type.WORLD_SURFACE_WG); - int n = chunkGenerator.getHeightInGround(k, l + j, Heightmap.Type.WORLD_SURFACE_WG); - int o = chunkGenerator.getHeightInGround(k + i, l, Heightmap.Type.WORLD_SURFACE_WG); - int p = chunkGenerator.getHeightInGround(k + i, l + j, Heightmap.Type.WORLD_SURFACE_WG); - return Math.min(Math.min(m, n), Math.min(o, p)); - } -} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java deleted file mode 100644 index fe52b804..00000000 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.world.structures.features; - -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; -import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.LakePiece; - -public class StructureMegaLake extends StructureFeatureBase { - @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { - return SDFStructureStart::new; - } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - - @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 5) { - float radius = MHelper.randRange(50, 100, random); - float depth = MHelper.randRange(10, 16, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.children.add(piece); - } - this.setBoundingBoxFromChildren(); - } - } -} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java b/src/main/java/ru/betterend/world/structures/features/StructureMountain.java deleted file mode 100644 index 8de38254..00000000 --- a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.world.structures.features; - -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; -import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.MountainPiece; - -public class StructureMountain extends StructureFeatureBase { - @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { - return SDFStructureStart::new; - } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - - @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 50) { - float radius = MHelper.randRange(50, 100, random); - float height = radius * MHelper.randRange(0.8F, 1.2F, random); - MountainPiece piece = new MountainPiece(new BlockPos(x, y, z), radius, height, random, biome); - this.children.add(piece); - } - this.setBoundingBoxFromChildren(); - } - } -} diff --git a/src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java b/src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java deleted file mode 100644 index 0244cfca..00000000 --- a/src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java +++ /dev/null @@ -1,58 +0,0 @@ -package ru.betterend.world.structures.features; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.PaintedMountainPiece; - -public class StructurePaintedMountain extends StructureFeatureBase { - private static final BlockState[] VARIANTS; - - @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { - return SDFStructureStart::new; - } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - - @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 50) { - float radius = MHelper.randRange(50, 100, random); - float height = radius * MHelper.randRange(0.4F, 0.6F, random); - int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1); - BlockState[] slises = new BlockState[count]; - for (int i = 0; i < count; i++) { - slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; - } - this.children.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); - } - this.setBoundingBoxFromChildren(); - } - } - - static { - VARIANTS = new BlockState[] { - Blocks.END_STONE.getDefaultState(), - EndBlocks.FLAVOLITE.stone.getDefaultState(), - EndBlocks.VIOLECITE.stone.getDefaultState(), - }; - } -} diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index aa8fe1a4..b5ce64f8 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -1,8 +1,8 @@ package ru.betterend.world.structures.piece; import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.StructurePiece; -import net.minecraft.structure.StructurePieceType; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.StructurePiece; public abstract class BasePiece extends StructurePiece { protected BasePiece(StructurePieceType type, int i) { diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 52a3da9e..8bd1755d 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -2,17 +2,17 @@ package ru.betterend.world.structures.piece; import java.util.Random; -import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; @@ -38,17 +38,17 @@ public class CavePiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int x1 = MHelper.max(this.boundingBox.minX, blockBox.minX); - int z1 = MHelper.max(this.boundingBox.minZ, blockBox.minZ); - int x2 = MHelper.min(this.boundingBox.maxX, blockBox.maxX); - int z2 = MHelper.min(this.boundingBox.maxZ, blockBox.maxZ); - int y1 = this.boundingBox.minY; - int y2 = this.boundingBox.maxY; + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int x1 = MHelper.max(this.boundingBox.x0, blockBox.x0); + int z1 = MHelper.max(this.boundingBox.z0, blockBox.z0); + int x2 = MHelper.min(this.boundingBox.x1, blockBox.x1); + int z2 = MHelper.min(this.boundingBox.z1, blockBox.z1); + int y1 = this.boundingBox.y0; + int y2 = this.boundingBox.y1; double hr = radius * 0.75; double nr = radius * 0.25; - Mutable pos = new Mutable(); + MutableBlockPos pos = new MutableBlockPos(); for (int x = x1; x <= x2; x++) { int xsq = x - center.getX(); xsq *= xsq; @@ -66,8 +66,8 @@ public class CavePiece extends BasePiece { double r2 = r - 4.5; double dist = xsq + ysq + zsq; if (dist < r2 * r2) { - if (world.getBlockState(pos).isIn(EndTags.END_GROUND)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + if (world.getBlockState(pos).is(EndTags.END_GROUND)) { + BlocksHelper.setWithoutUpdate(world, pos, CAVE_AIR); } } else if (dist < r * r) { @@ -83,14 +83,14 @@ public class CavePiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); } @@ -102,6 +102,6 @@ public class CavePiece extends BasePiece { int maxX = MHelper.floor(center.getX() + radius + 1); int maxY = MHelper.floor(center.getY() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java new file mode 100644 index 00000000..946ba467 --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -0,0 +1,167 @@ +package ru.betterend.world.structures.piece; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndStructures; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; + +public class CrystalMountainPiece extends MountainPiece { + private BlockState top; + + public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { + super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); + top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + + public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, manager, tag); + } + + @Override + protected void fromNbt(CompoundTag tag) { + super.fromNbt(tag); + top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + + @Override + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int sx = chunkPos.getMinBlockX(); + int sz = chunkPos.getMinBlockZ(); + MutableBlockPos pos = new MutableBlockPos(); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + Heightmap map2 = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE_WG); + for (int x = 0; x < 16; x++) { + int px = x + sx; + int px2 = px - center.getX(); + px2 *= px2; + pos.setX(x); + for (int z = 0; z < 16; z++) { + int pz = z + sz; + int pz2 = pz - center.getZ(); + pz2 *= pz2; + float dist = px2 + pz2; + if (dist < r2) { + pos.setZ(z); + dist = 1 - (float) Math.pow(dist / r2, 0.3); + int minY = map.getFirstAvailable(x, z); + if (minY < 10) { + continue; + } + pos.setY(minY); + while (!chunk.getBlockState(pos).is(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.below()).is(Blocks.CAVE_AIR)) { + pos.setY(pos.getY() - 1); + } + minY = pos.getY(); + minY = Math.max(minY, map2.getFirstAvailable(x, z)); + if (minY > center.getY() - 8) { + float maxY = dist * height * getHeightClamp(world, 12, px, pz); + if (maxY > 0) { + maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; + maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; + maxY += center.getY(); + int maxYI = (int) (maxY); + int cover = maxYI - 1; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; + for (int y = minY - 1; y < maxYI; y++) { + pos.setY(y); + chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), false); + } + } + } + } + } + } + + map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + + // Big crystals + int count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 7; + count = Mth.clamp(count, 0, 8); + for (int i = 0; i < count; i++) { + int radius = MHelper.randRange(2, 3, random); + float fill = MHelper.randRange(0F, 1F, random); + int x = MHelper.randRange(radius, 15 - radius, random); + int z = MHelper.randRange(radius, 15 - radius, random); + int y = map.getFirstAvailable(x, z); + if (y > 80) { + pos.set(x, y, z); + if (chunk.getBlockState(pos.below()).is(Blocks.END_STONE)) { + int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); + crystal(chunk, pos, radius, height, fill, random); + } + } + } + + // Small crystals + count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 2; + count = Mth.clamp(count, 4, 8); + for (int i = 0; i < count; i++) { + int radius = MHelper.randRange(1, 2, random); + float fill = random.nextBoolean() ? 0 : 1; + int x = MHelper.randRange(radius, 15 - radius, random); + int z = MHelper.randRange(radius, 15 - radius, random); + int y = map.getFirstAvailable(x, z); + if (y > 80) { + pos.set(x, y, z); + if (chunk.getBlockState(pos.below()).getBlock() == Blocks.END_STONE) { + int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); + crystal(chunk, pos, radius, height, fill, random); + } + } + } + + return true; + } + + private void crystal(ChunkAccess chunk, BlockPos pos, int radius, int height, float fill, Random random) { + MutableBlockPos mut = new MutableBlockPos(); + int max = MHelper.floor(fill * radius + radius + 0.5F); + height += pos.getY(); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + int coefX = MHelper.randRange(-1, 1, random); + int coefZ = MHelper.randRange(-1, 1, random); + for (int x = -radius; x <= radius; x++) { + mut.setX(x + pos.getX()); + if (mut.getX() >= 0 && mut.getX() < 16) { + int ax = Math.abs(x); + for (int z = -radius; z <= radius; z++) { + mut.setZ(z + pos.getZ()); + if (mut.getZ() >= 0 && mut.getZ() < 16) { + int az = Math.abs(z); + if (ax + az < max) { + int minY = map.getFirstAvailable(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); + if (pos.getY() - minY > 8) { + minY = pos.getY() - 8; + } + int h = coefX * x + coefZ * z + height; + for (int y = minY; y < h; y++) { + mut.setY(y); + chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.defaultBlockState(), false); + } + } + } + } + } + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 0079914e..eee3fdf1 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -5,54 +5,54 @@ import java.util.Random; import com.google.common.collect.Maps; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.material.FluidState; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class LakePiece extends BasePiece { - private static final BlockState WATER = Blocks.WATER.getDefaultState(); - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; + private static final BlockState ENDSTONE = Blocks.END_STONE.defaultBlockState(); + private static final BlockState WATER = Blocks.WATER.defaultBlockState(); + private Map heightmap = Maps.newHashMap(); + private OpenSimplexNoise noise; private BlockPos center; private float radius; + private float aspect; private float depth; - private float r2; - private Identifier biomeID; - private int seed1; - private int seed2; + private int seed; + + private ResourceLocation biomeID; public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { super(EndStructures.LAKE_PIECE, random.nextInt()); this.center = center; this.radius = radius; this.depth = depth; - this.r2 = radius * radius; - this.seed1 = random.nextInt(); - this.seed2 = random.nextInt(); - this.noise1 = new OpenSimplexNoise(this.seed1); - this.noise2 = new OpenSimplexNoise(this.seed2); + this.seed = random.nextInt(); + this.noise = new OpenSimplexNoise(this.seed); + this.aspect = radius / depth; this.biomeID = EndBiomes.getBiomeID(biome); makeBoundingBox(); } @@ -63,157 +63,172 @@ public class LakePiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); + tag.putInt("seed", seed); tag.putString("biome", biomeID.toString()); - tag.putInt("seed1", seed1); - tag.putInt("seed2", seed2); } @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); depth = tag.getFloat("depth"); - r2 = radius * radius; - seed1 = tag.getInt("seed1"); - seed2 = tag.getInt("seed2"); - noise1 = new OpenSimplexNoise(seed1); - noise2 = new OpenSimplexNoise(seed2); - biomeID = new Identifier(tag.getString("biome")); + seed = tag.getInt("seed"); + noise = new OpenSimplexNoise(seed); + aspect = radius / depth; + biomeID = new ResourceLocation(tag.getString("biome")); } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE_WG); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int minY = this.boundingBox.y0; + int maxY = this.boundingBox.y1; + int sx = chunkPos.x << 4; + int sz = chunkPos.z << 4; + MutableBlockPos mut = new MutableBlockPos(); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { - int px = x + sx; - int px2 = px - center.getX(); - px2 *= px2; - pos.setX(x); + mut.setX(x); + int wx = x | sx; + double nx = wx * 0.1; + int x2 = wx - center.getX(); for (int z = 0; z < 16; z++) { - int pz = z + sz; - int pz2 = pz - center.getZ(); - pz2 *= pz2; - float dist = px2 + pz2; - if (dist < r2) { - pos.setZ(z); - dist = 1 - dist / r2; - int maxY = map.get(x, z); - if (maxY > 55) { - float minY = dist * depth * getHeightClamp(world, 8, px, pz); - if (minY > 0) { - minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - float lerp = minY / 2F; - if (lerp > 1) { - lerp = 1; + mut.setZ(z); + int wz = z | sz; + double nz = wz * 0.1; + int z2 = wz - center.getZ(); + float clamp = getHeightClamp(world, 8, wx, wz); + if (clamp < 0.01) continue; + + double n = noise.eval(nx, nz) * 1.5 + 1.5; + double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); + double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); + + for (int y = minY; y <= maxY; y++) { + mut.setY((int) (y + n)); + double y2 = MHelper.pow2((y - center.getY()) * aspect); + double r2 = radius * clamp; + double r3 = r2 + 8; + r2 *= r2; + r3 = r3 * r3 + 100; + double dist = x3 + y2 + z3; + if (dist < r2) { + BlockState state = chunk.getBlockState(mut); + if (state.is(EndTags.GEN_TERRAIN) || state.isAir()) { + state = mut.getY() < center.getY() ? WATER : CAVE_AIR; + chunk.setBlockState(mut, state, false); + } + } + else if (dist <= r3 && mut.getY() < center.getY()) { + BlockState state = chunk.getBlockState(mut); + BlockPos worldPos = mut.offset(sx, 0, sz); + if (!state.isCollisionShapeFullBlock(world, worldPos) && !state.isRedstoneConductor(world, worldPos)) { + state = chunk.getBlockState(mut.above()); + if (state.isAir()) { + state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - minY = MathHelper.lerp(lerp, maxY - minY, 56 - minY); - pos.setY(maxY); - while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { - pos.setY(maxY ++); - } - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, y > 56 ? AIR : WATER, false); - } - else { - break; - } - } - maxY = MHelper.randRange(2, 3, random); - int last = maxY - 1; - for (int i = 0; i < maxY; i++) { - pos.setY(pos.getY() - 1); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - if (pos.getY() > 56) { - chunk.setBlockState(pos, AIR, false); - if (pos.getY() == last) { - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - chunk.setBlockState(pos.down(), state, false); - } - } - else if (pos.getY() == 56) { - if (random.nextBoolean()) { - state = EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - else { - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - chunk.setBlockState(pos, state, false); - - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - int count = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2);//MHelper.randRange(1, 2, random); - for (int n = 0; n < count; n++) { - pos.setY(pos.getY() - 1); - chunk.setBlockState(pos, state, false); - } - break; - } - else { - chunk.setBlockState(pos, EndBlocks.ENDSTONE_DUST.getDefaultState(), false); - - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - int count = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2);//int count = MHelper.randRange(1, 2, random); - for (int n = 0; n < count; n++) { - pos.setY(pos.getY() - 1); - chunk.setBlockState(pos, state, false); - } - break; - } - } + else { + state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } + chunk.setBlockState(mut, state, false); } } } } } - - map = chunk.getHeightmap(Type.WORLD_SURFACE); - + fixWater(world, chunk, mut, random, sx, sz); return true; } - private int getHeight(StructureWorldAccess world, BlockPos pos) { + private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { + int minY = this.boundingBox.y0; + int maxY = this.boundingBox.y1; + for (int x = 0; x < 16; x++) { + mut.setX(x); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + for (int y = minY; y <= maxY; y++) { + mut.setY(y); + FluidState state = chunk.getFluidState(mut); + if (!state.isEmpty()) { + mut.setY(y - 1); + if (chunk.getBlockState(mut).isAir()) { + mut.setY(y + 1); + + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + + mut.setY(y); + + makeEndstonePillar(chunk, mut, bState); + } + else if (x > 1 && x < 15 && z > 1 && z < 15) { + mut.setY(y); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlockPos wPos = mut.offset(dir.getStepX(), 0, dir.getStepZ()); + if (chunk.getBlockState(wPos).isAir()) { + mut.setY(y + 1); + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + mut.setY(y); + makeEndstonePillar(chunk, mut, bState); + break; + } + } + } + else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { + chunk.getLiquidTicks().scheduleTick(mut.move(Direction.DOWN), state.getType(), 0); + } + } + } + } + } + } + + private void makeEndstonePillar(ChunkAccess chunk, MutableBlockPos mut, BlockState terrain) { + chunk.setBlockState(mut, terrain, false); + mut.setY(mut.getY() - 1); + while (!chunk.getFluidState(mut).isEmpty()) { + chunk.setBlockState(mut, ENDSTONE, false); + mut.setY(mut.getY() - 1); + } + } + + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); - int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); - if (h > Integer.MIN_VALUE) { + int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); + if (h > Byte.MIN_VALUE) { return h; } if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, -20); - return -20; - } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { - heightmap.put(p, -20); - return -20; - } - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); - - if (h < 0) { - heightmap.put(p, 0); + heightmap.put(p, (byte) 0); return 0; } - heightmap.put(p, h); + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = Mth.abs(h - center.getY()); + h = h < 8 ? 1 : 0; + heightmap.put(p, (byte) h); return h; } - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); + private float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { + MutableBlockPos mut = new MutableBlockPos(); int r2 = radius * radius; float height = 0; float max = 0; @@ -231,14 +246,16 @@ public class LakePiece extends BasePiece { } } height /= max; - return MathHelper.clamp(height / radius, 0, 1); + return Mth.clamp(height, 0, 1); } private void makeBoundingBox() { - int minX = MHelper.floor(center.getX() - radius); - int minZ = MHelper.floor(center.getZ() - radius); - int maxX = MHelper.floor(center.getX() + radius + 1); - int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); + int minX = MHelper.floor(center.getX() - radius - 8); + int minY = MHelper.floor(center.getY() - depth - 8); + int minZ = MHelper.floor(center.getZ() - radius - 8); + int maxX = MHelper.floor(center.getX() + radius + 8); + int maxY = MHelper.floor(center.getY() + depth); + int maxZ = MHelper.floor(center.getZ() + radius + 8); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 73958f31..31c30b58 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -5,46 +5,36 @@ import java.util.Random; import com.google.common.collect.Maps; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndStructures; -import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; -public class MountainPiece extends BasePiece { - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; - private BlockPos center; - private float radius; - private float height; - private float r2; - private Identifier biomeID; - private BlockState top; - private int seed1; - private int seed2; +public abstract class MountainPiece extends BasePiece { + protected Map heightmap = Maps.newHashMap(); + protected OpenSimplexNoise noise1; + protected OpenSimplexNoise noise2; + protected BlockPos center; + protected float radius; + protected float height; + protected float r2; + protected ResourceLocation biomeID; + protected int seed1; + protected int seed2; - public MountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { - super(EndStructures.MOUNTAIN_PIECE, random.nextInt()); + public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { + super(type, random.nextInt()); this.center = center; this.radius = radius; this.height = height; @@ -54,18 +44,17 @@ public class MountainPiece extends BasePiece { this.noise1 = new OpenSimplexNoise(this.seed1); this.noise2 = new OpenSimplexNoise(this.seed2); this.biomeID = EndBiomes.getBiomeID(biome); - top = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial(); makeBoundingBox(); } - public MountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, tag); + public MountainPiece(StructurePieceType type, StructureManager manager, CompoundTag tag) { + super(type, tag); makeBoundingBox(); } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("height", height); tag.putString("biome", biomeID.toString()); @@ -75,110 +64,18 @@ public class MountainPiece extends BasePiece { @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); height = tag.getFloat("height"); - biomeID = new Identifier(tag.getString("biome")); + biomeID = new ResourceLocation(tag.getString("biome")); r2 = radius * radius; seed1 = tag.getInt("seed1"); seed2 = tag.getInt("seed2"); noise1 = new OpenSimplexNoise(seed1); noise2 = new OpenSimplexNoise(seed2); - top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - - @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); - for (int x = 0; x < 16; x++) { - int px = x + sx; - int px2 = px - center.getX(); - px2 *= px2; - pos.setX(x); - for (int z = 0; z < 16; z++) { - int pz = z + sz; - int pz2 = pz - center.getZ(); - pz2 *= pz2; - float dist = px2 + pz2; - if (dist < r2) { - pos.setZ(z); - dist = 1 - (float) Math.pow(dist / r2, 0.3); - int minY = map.get(x, z); - if (minY < 10) { - continue; - } - pos.setY(minY); - while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.down()).isOf(Blocks.CAVE_AIR)) { - pos.setY(pos.getY() - 1); - } - minY = pos.getY(); - minY = Math.max(minY, map2.get(x, z)); - if (minY > 10) { - float maxY = dist * height * getHeightClamp(world, 8, px, pz); - if (maxY > 0) { - maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - maxY += 56; - int maxYI = (int) (maxY); - int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (maxY - 70) * 0.1) > 0; - for (int y = minY - 1; y < maxYI; y++) { - pos.setY(y); - chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.getDefaultState(), false); - } - } - } - } - } - } - - map = chunk.getHeightmap(Type.WORLD_SURFACE); - - // Big crystals - int count = (map.get(8, 8) - 80) / 7; - count = MathHelper.clamp(count, 0, 8); - for (int i = 0; i < count; i++) { - int radius = MHelper.randRange(2, 3, random); - float fill = MHelper.randRange(0F, 1F, random); - int x = MHelper.randRange(radius, 15 - radius, random); - int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); - if (y > 80) { - pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).isOf(Blocks.END_STONE)) { - int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); - crystal(chunk, pos, radius, height, fill, random); - } - } - } - - // Small crystals - count = (map.get(8, 8) - 80) / 2; - count = MathHelper.clamp(count, 4, 8); - for (int i = 0; i < count; i++) { - int radius = MHelper.randRange(1, 2, random); - float fill = random.nextBoolean() ? 0 : 1; - int x = MHelper.randRange(radius, 15 - radius, random); - int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); - if (y > 80) { - pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).getBlock() == Blocks.END_STONE) { - int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); - crystal(chunk, pos, radius, height, fill, random); - } - } - } - - return true; } - private int getHeight(StructureWorldAccess world, BlockPos pos) { + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); if (h > Integer.MIN_VALUE) { @@ -189,11 +86,14 @@ public class MountainPiece extends BasePiece { heightmap.put(p, -10); return -10; } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { - heightmap.put(p, -4); - return -4; + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = Mth.abs(h - center.getY()); + if (h > 4) { + h = 4 - h; + heightmap.put(p, h); + return h; } + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); if (h < 0) { @@ -206,8 +106,8 @@ public class MountainPiece extends BasePiece { return h; } - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); + protected float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { + MutableBlockPos mut = new MutableBlockPos(); float height = 0; float max = 0; for (int x = -radius; x <= radius; x++) { @@ -224,7 +124,7 @@ public class MountainPiece extends BasePiece { } } height /= max; - return MathHelper.clamp(height / radius, 0, 1); + return Mth.clamp(height / radius, 0, 1); } private void makeBoundingBox() { @@ -232,38 +132,6 @@ public class MountainPiece extends BasePiece { int minZ = MHelper.floor(center.getZ() - radius); int maxX = MHelper.floor(center.getX() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); - } - - private void crystal(Chunk chunk, BlockPos pos, int radius, int height, float fill, Random random) { - Mutable mut = new Mutable(); - int max = MHelper.floor(fill * radius + radius + 0.5F); - height += pos.getY(); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - int coefX = MHelper.randRange(-1, 1, random); - int coefZ = MHelper.randRange(-1, 1, random); - for (int x = -radius; x <= radius; x++) { - mut.setX(x + pos.getX()); - if (mut.getX() >= 0 && mut.getX() < 16) { - int ax = Math.abs(x); - for (int z = -radius; z <= radius; z++) { - mut.setZ(z + pos.getZ()); - if (mut.getZ() >= 0 && mut.getZ() < 16) { - int az = Math.abs(z); - if (ax + az < max) { - int minY = map.get(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); - if (pos.getY() - minY > 8) { - minY = pos.getY() - 8; - } - int h = coefX * x + coefZ * z + height; - for (int y = minY; y < h; y++) { - mut.setY(y); - chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.getDefaultState(), false); - } - } - } - } - } - } + this.boundingBox = new BoundingBox(minX, minZ, maxX, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 5e768f60..9cf35d99 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -2,39 +2,39 @@ package ru.betterend.world.structures.piece; import java.util.Random; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; public class NBTPiece extends BasePiece { - private Identifier structureID; - private BlockRotation rotation; - private BlockMirror mirror; - private Structure structure; + private ResourceLocation structureID; + private Rotation rotation; + private Mirror mirror; + private StructureTemplate structure; private BlockPos pos; private int erosion; private boolean cover; - public NBTPiece(Identifier structureID, Structure structure, BlockPos pos, int erosion, boolean cover, Random random) { + public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { super(EndStructures.NBT_PIECE, random.nextInt()); this.structureID = structureID; this.structure = structure; - this.rotation = BlockRotation.random(random); - this.mirror = BlockMirror.values()[random.nextInt(3)]; + this.rotation = Rotation.getRandom(random); + this.mirror = Mirror.values()[random.nextInt(3)]; this.pos = StructureHelper.offsetPos(pos, structure, rotation, mirror); this.erosion = erosion; this.cover = cover; @@ -47,38 +47,38 @@ public class NBTPiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.putString("id", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); tag.putInt("erosion", erosion); - tag.put("pos", NbtHelper.fromBlockPos(pos)); + tag.put("pos", NbtUtils.writeBlockPos(pos)); tag.putBoolean("cover", cover); } @Override protected void fromNbt(CompoundTag tag) { - structureID = new Identifier(tag.getString("id")); - rotation = BlockRotation.values()[tag.getInt("rotation")]; - mirror = BlockMirror.values()[tag.getInt("mirror")]; + structureID = new ResourceLocation(tag.getString("id")); + rotation = Rotation.values()[tag.getInt("rotation")]; + mirror = Mirror.values()[tag.getInt("mirror")]; erosion = tag.getInt("erosion"); - pos = NbtHelper.toBlockPos(tag.getCompound("pos")); + pos = NbtUtils.readBlockPos(tag.getCompound("pos")); cover = tag.getBoolean("cover"); structure = StructureHelper.readStructure(structureID); } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - BlockBox bounds = new BlockBox(blockBox); - bounds.maxY = this.boundingBox.maxY; - bounds.minY = this.boundingBox.minY; - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - structure.place(world, pos, placementData, random); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + BoundingBox bounds = new BoundingBox(blockBox); + bounds.y1 = this.boundingBox.y1; + bounds.y0 = this.boundingBox.y0; + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + structure.placeInWorldChunk(world, pos, placementData, random); if (erosion > 0) { - bounds.maxX = MHelper.min(bounds.maxX, boundingBox.maxX); - bounds.minX = MHelper.max(bounds.minX, boundingBox.minX); - bounds.maxZ = MHelper.min(bounds.maxZ, boundingBox.maxZ); - bounds.minZ = MHelper.max(bounds.minZ, boundingBox.minZ); + bounds.x1 = MHelper.min(bounds.x1, boundingBox.x1); + bounds.x0 = MHelper.max(bounds.x0, boundingBox.x0); + bounds.z1 = MHelper.min(bounds.z1, boundingBox.z1); + bounds.z0 = MHelper.max(bounds.z0, boundingBox.z0); StructureHelper.erode(world, bounds, erosion, random); } if (cover) { diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index 48f7b0b5..cbc18a5e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,108 +1,65 @@ package ru.betterend.world.structures.piece; -import java.util.Map; import java.util.Random; -import com.google.common.collect.Maps; - -import net.minecraft.block.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBiomes; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; -public class PaintedMountainPiece extends BasePiece { - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; - private BlockPos center; - private float radius; - private float height; - private float r2; - private Identifier biomeID; +public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; - private int seed1; - private int seed2; - public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, random.nextInt()); - this.center = center; - this.radius = radius; - this.height = height; - this.r2 = radius * radius; - this.seed1 = random.nextInt(); - this.seed2 = random.nextInt(); - this.noise1 = new OpenSimplexNoise(this.seed1); - this.noise2 = new OpenSimplexNoise(this.seed2); - this.biomeID = EndBiomes.getBiomeID(biome); + super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; - makeBoundingBox(); } public PaintedMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, tag); - makeBoundingBox(); + super(EndStructures.PAINTED_MOUNTAIN_PIECE, manager, tag); } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); - tag.putFloat("radius", radius); - tag.putFloat("height", height); - tag.putString("biome", biomeID.toString()); - tag.putInt("seed1", seed1); - tag.putInt("seed2", seed2); - + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); ListTag slise = new ListTag(); for (BlockState state: slises) { - slise.add(NbtHelper.fromBlockState(state)); + slise.add(NbtUtils.writeBlockState(state)); } tag.put("slises", slise); } @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); - radius = tag.getFloat("radius"); - height = tag.getFloat("height"); - biomeID = new Identifier(tag.getString("biome")); - r2 = radius * radius; - seed1 = tag.getInt("seed1"); - seed2 = tag.getInt("seed2"); - noise1 = new OpenSimplexNoise(seed1); - noise2 = new OpenSimplexNoise(seed2); + super.fromNbt(tag); ListTag slise = tag.getList("slises", 10); slises = new BlockState[slise.size()]; for (int i = 0; i < slises.length; i++) { - slises[i] = NbtHelper.toBlockState(slise.getCompound(i)); + slises[i] = NbtUtils.readBlockState(slise.getCompound(i)); } } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int sx = chunkPos.getMinBlockX(); + int sz = chunkPos.getMinBlockZ(); + MutableBlockPos pos = new MutableBlockPos(); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + Heightmap map2 = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE_WG); for (int x = 0; x < 16; x++) { int px = x + sx; int px2 = px - center.getX(); @@ -116,19 +73,19 @@ public class PaintedMountainPiece extends BasePiece { if (dist < r2) { pos.setZ(z); dist = 1 - dist / r2; - int minY = map.get(x, z); + int minY = map.getFirstAvailable(x, z); pos.setY(minY - 1); while (chunk.getBlockState(pos).isAir() && pos.getY() > 50) { pos.setY(minY --); } minY = pos.getY(); - minY = Math.max(minY, map2.get(x, z)); - if (minY > 56) { - float maxY = dist * height * getHeightClamp(world, 8, px, pz); + minY = Math.max(minY, map2.getFirstAvailable(x, z)); + if (minY > center.getY() - 8) { + float maxY = dist * height * getHeightClamp(world, 10, px, pz); if (maxY > 0) { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.9F; - maxY += 56; + maxY += center.getY(); float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); for (int y = minY - 1; y < maxY; y++) { pos.setY(y); @@ -143,61 +100,4 @@ public class PaintedMountainPiece extends BasePiece { return true; } - - private int getHeight(StructureWorldAccess world, BlockPos pos) { - int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); - int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); - if (h > Integer.MIN_VALUE) { - return h; - } - - if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, -4); - return -4; - } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { - heightmap.put(p, -4); - return -4; - } - h = MHelper.floor(noise2.eval(pos.getX() * 0.005, pos.getZ() * 0.005) * noise2.eval(pos.getX() * 0.001, pos.getZ() * 0.001) * 8 + 8); - - if (h < 0) { - heightmap.put(p, 0); - return 0; - } - - heightmap.put(p, h); - - return h; - } - - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); - float height = 0; - float max = 0; - for (int x = -radius; x <= radius; x++) { - mut.setX(posX + x); - int x2 = x * x; - for (int z = -radius; z <= radius; z++) { - mut.setZ(posZ + z); - int z2 = z * z; - float mult = 1 - (float) Math.sqrt(x2 + z2) / radius; - if (mult > 0) { - max += mult; - height += getHeight(world, mut) * mult; - } - } - } - height /= max; - return MathHelper.clamp(height / radius, 0, 1); - } - - private void makeBoundingBox() { - int minX = MHelper.floor(center.getX() - radius); - int minZ = MHelper.floor(center.getZ() - radius); - int maxX = MHelper.floor(center.getX() + radius + 1); - int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); - } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index f9b6f676..1837d3eb 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -3,14 +3,14 @@ package ru.betterend.world.structures.piece; import java.util.Random; import java.util.function.Consumer; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndStructures; import ru.betterend.world.structures.StructureWorld; @@ -30,7 +30,7 @@ public class VoxelPiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("world", world.toBNT()); } @@ -40,7 +40,7 @@ public class VoxelPiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); return true; } diff --git a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java index 01b48a5c..4e63a4f2 100644 --- a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java @@ -2,51 +2,51 @@ package ru.betterend.world.surface; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -public class DoubleBlockSurfaceBuilder extends SurfaceBuilder { +public class DoubleBlockSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(4141); - private TernarySurfaceConfig config1; - private TernarySurfaceConfig config2; + private SurfaceBuilderBaseConfiguration config1; + private SurfaceBuilderBaseConfiguration config2; private DoubleBlockSurfaceBuilder() { - super(TernarySurfaceConfig.CODEC); + super(SurfaceBuilderBaseConfiguration.CODEC); } public DoubleBlockSurfaceBuilder setBlock1(Block block) { - BlockState stone = Blocks.END_STONE.getDefaultState(); - config1 = new TernarySurfaceConfig(block.getDefaultState(), stone, stone); + BlockState stone = Blocks.END_STONE.defaultBlockState(); + config1 = new SurfaceBuilderBaseConfiguration(block.defaultBlockState(), stone, stone); return this; } public DoubleBlockSurfaceBuilder setBlock2(Block block) { - BlockState stone = Blocks.END_STONE.getDefaultState(); - config2 = new TernarySurfaceConfig(block.getDefaultState(), stone, stone); + BlockState stone = Blocks.END_STONE.defaultBlockState(); + config2 = new SurfaceBuilderBaseConfiguration(block.defaultBlockState(), stone, stone); return this; } @Override - public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, TernarySurfaceConfig surfaceBlocks) { + public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderBaseConfiguration surfaceBlocks) { noise = NOISE.eval(x * 0.1, z * 0.1) + MHelper.randRange(-0.4, 0.4, random); - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, noise > 0 ? config1 : config2); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, noise > 0 ? config1 : config2); } public static DoubleBlockSurfaceBuilder register(String name) { return Registry.register(Registry.SURFACE_BUILDER, name, new DoubleBlockSurfaceBuilder()); } - public ConfiguredSurfaceBuilder configured() { - BlockState stone = Blocks.END_STONE.getDefaultState(); - return this.withConfig(new TernarySurfaceConfig(config1.getTopMaterial(), stone, stone)); + public ConfiguredSurfaceBuilder configured() { + BlockState stone = Blocks.END_STONE.defaultBlockState(); + return this.configured(new SurfaceBuilderBaseConfiguration(config1.getTopMaterial(), stone, stone)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 7c75ea39..5d020a83 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -2,36 +2,36 @@ package ru.betterend.world.surface; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -public class SulphuricSurfaceBuilder extends SurfaceBuilder { +public class SulphuricSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); public SulphuricSurfaceBuilder() { - super(TernarySurfaceConfig.CODEC); + super(SurfaceBuilderBaseConfiguration.CODEC); } @Override - public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, TernarySurfaceConfig surfaceBlocks) { + public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderBaseConfiguration surfaceBlocks) { double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); if (value < -0.6) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); } else if (value < -0.3) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); } else if (value < 0.5) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); } else { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); } } diff --git a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java index 90c200ef..b00b12ca 100644 --- a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java +++ b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java @@ -1,28 +1,28 @@ package ru.betterend.world.surface; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.core.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.registry.EndBlocks; public class SurfaceBuilders { - public static final TernarySurfaceConfig DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); - public static final TernarySurfaceConfig FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); - public static final TernarySurfaceConfig BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); - public static final TernarySurfaceConfig SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); + public static final SurfaceBuilderBaseConfiguration DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); + public static final SurfaceBuilderBaseConfiguration FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); + public static final SurfaceBuilderBaseConfiguration BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); + public static final SurfaceBuilderBaseConfiguration SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); - public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); + public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); - private static SurfaceBuilder register(String name, SurfaceBuilder builder) { + private static SurfaceBuilder register(String name, SurfaceBuilder builder) { return Registry.register(Registry.SURFACE_BUILDER, name, builder); } - private static TernarySurfaceConfig makeSimpleConfig(Block block) { - BlockState state = block.getDefaultState(); - return new TernarySurfaceConfig(state, state, state); + private static SurfaceBuilderBaseConfiguration makeSimpleConfig(Block block) { + BlockState state = block.defaultBlockState(); + return new SurfaceBuilderBaseConfiguration(state, state, state); } public static void register() {} diff --git a/src/main/resources/assets/betterend/blockstates/aeridium.json b/src/main/resources/assets/betterend/blockstates/aeridium.json new file mode 100644 index 00000000..b253a949 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/aeridium.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/aeridium_01" }, + { "model": "betterend:block/aeridium_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_fur.json b/src/main/resources/assets/betterend/blockstates/amaranita_fur.json new file mode 100644 index 00000000..88cfa9e0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_fur.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:block/amaranita_fur" }, + "facing=down": { "model": "betterend:block/amaranita_fur", "x": 180 }, + "facing=north": { "model": "betterend:block/amaranita_fur", "x": 90 }, + "facing=south": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 180 }, + "facing=east": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 90 }, + "facing=west": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json b/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json new file mode 100644 index 00000000..c49368de --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/amaranita_hyphae", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/amaranita_hyphae" }, + "axis=z": { "model": "betterend:block/amaranita_hyphae", "x": 90 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json b/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json new file mode 100644 index 00000000..183ab6b2 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/amaranita_lantern" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_stem.json b/src/main/resources/assets/betterend/blockstates/amaranita_stem.json new file mode 100644 index 00000000..654324f3 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_stem.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/amaranita_stem", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/amaranita_stem" }, + "axis=z": { "model": "betterend:block/amaranita_stem", "x": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/amber_root_seed.json b/src/main/resources/assets/betterend/blockstates/amber_root_seed.json new file mode 100644 index 00000000..73ec7c46 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amber_root_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/amber_root_0" }, + { "model": "betterend:block/amber_root_1" } + ], + "age=1": [ + { "model": "betterend:block/amber_root_2" }, + { "model": "betterend:block/amber_root_3" } + ], + "age=2": [ + { "model": "betterend:block/amber_root_4" }, + { "model": "betterend:block/amber_root_5" } + ], + "age=3": [ + { "model": "betterend:block/amber_root_6" }, + { "model": "betterend:block/amber_root_7" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/aurant_polypore.json b/src/main/resources/assets/betterend/blockstates/aurant_polypore.json new file mode 100644 index 00000000..9c816bd6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/aurant_polypore.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/aurant_polypore_1", "y": 180 }, + { "model": "betterend:block/aurant_polypore_2", "y": 180 }, + { "model": "betterend:block/aurant_polypore_3", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/aurant_polypore_1" }, + { "model": "betterend:block/aurant_polypore_2" }, + { "model": "betterend:block/aurant_polypore_3" } + ], + "facing=east": [ + { "model": "betterend:block/aurant_polypore_1", "y": 270 }, + { "model": "betterend:block/aurant_polypore_2", "y": 270 }, + { "model": "betterend:block/aurant_polypore_3", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/aurant_polypore_1", "y": 90 }, + { "model": "betterend:block/aurant_polypore_2", "y": 90 }, + { "model": "betterend:block/aurant_polypore_3", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json b/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json new file mode 100644 index 00000000..8ff50a40 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/blooming_cooksonia_01" }, + { "model": "betterend:block/blooming_cooksonia_02" }, + { "model": "betterend:block/blooming_cooksonia_03" }, + { "model": "betterend:block/blooming_cooksonia_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json b/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json new file mode 100644 index 00000000..64807e33 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json @@ -0,0 +1,8 @@ +{ + "variants": { + "age=0": { "model": "betterend:block/blossom_berry_seed_0" }, + "age=1": { "model": "betterend:block/blossom_berry_seed_1" }, + "age=2": { "model": "betterend:block/blossom_berry_seed_2" }, + "age=3": { "model": "betterend:block/blossom_berry" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json b/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json new file mode 100644 index 00000000..ab881614 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/bolux_mushroom_1" }, + { "model": "betterend:block/bolux_mushroom_2" }, + { "model": "betterend:block/bolux_mushroom_3" }, + { "model": "betterend:block/bolux_mushroom_1", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_1", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_1", "y": 270 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 270 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/cave_moss.json b/src/main/resources/assets/betterend/blockstates/cave_moss.json deleted file mode 100644 index 2850aa74..00000000 --- a/src/main/resources/assets/betterend/blockstates/cave_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/cave_moss" - }, - { - "model": "betterend:block/cave_moss", - "y": 90 - }, - { - "model": "betterend:block/cave_moss", - "y": 180 - }, - { - "model": "betterend:block/cave_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/cave_moss_path.json b/src/main/resources/assets/betterend/blockstates/cave_moss_path.json deleted file mode 100644 index 41a59367..00000000 --- a/src/main/resources/assets/betterend/blockstates/cave_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/cave_moss_path" }, - { "model": "betterend:block/cave_moss_path", "y": 90 }, - { "model": "betterend:block/cave_moss_path", "y": 180 }, - { "model": "betterend:block/cave_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json b/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json new file mode 100644 index 00000000..a845138f --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json @@ -0,0 +1,6 @@ +{ + "variants": { + "small=true": { "model": "betterend:block/cave_pumpkin_small" }, + "small=false": { "model": "betterend:block/cave_pumpkin" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json b/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json new file mode 100644 index 00000000..05b1ecce --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/cave_pumpkin_vine_1" }, + { "model": "betterend:block/cave_pumpkin_vine_2" } + ], + "age=1": [ + { "model": "betterend:block/cave_pumpkin_vine_3" }, + { "model": "betterend:block/cave_pumpkin_vine_4" } + ], + "age=2": [ + { "model": "betterend:block/cave_pumpkin_vine_5" }, + { "model": "betterend:block/cave_pumpkin_vine_6" } + ], + "age=3": [ + { "model": "betterend:block/cave_pumpkin_vine_7" }, + { "model": "betterend:block/cave_pumpkin_vine_8" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json b/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json new file mode 100644 index 00000000..5868fee9 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/chorus_mushroom_0" }, + { "model": "betterend:block/chorus_mushroom_1" } + ], + "age=1": [ + { "model": "betterend:block/chorus_mushroom_2" }, + { "model": "betterend:block/chorus_mushroom_3" } + ], + "age=2": [ + { "model": "betterend:block/chorus_mushroom_4" }, + { "model": "betterend:block/chorus_mushroom_5" } + ], + "age=3": [ + { "model": "betterend:block/chorus_mushroom_6" }, + { "model": "betterend:block/chorus_mushroom_7" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium.json deleted file mode 100644 index 6c04ddb7..00000000 --- a/src/main/resources/assets/betterend/blockstates/chorus_nylium.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/chorus_nylium" }, - { "model": "betterend:block/chorus_nylium", "y": 90 }, - { "model": "betterend:block/chorus_nylium", "y": 180 }, - { "model": "betterend:block/chorus_nylium", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json deleted file mode 100644 index 3e160ef6..00000000 --- a/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/chorus_nylium_path" }, - { "model": "betterend:block/chorus_nylium_path", "y": 90 }, - { "model": "betterend:block/chorus_nylium_path", "y": 180 }, - { "model": "betterend:block/chorus_nylium_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/clawfern.json b/src/main/resources/assets/betterend/blockstates/clawfern.json new file mode 100644 index 00000000..043b6ae0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/clawfern.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/clawfern_01" }, + { "model": "betterend:block/clawfern_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/crystal_moss.json b/src/main/resources/assets/betterend/blockstates/crystal_moss.json deleted file mode 100644 index ddf93100..00000000 --- a/src/main/resources/assets/betterend/blockstates/crystal_moss.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/crystal_moss" }, - { "model": "betterend:block/crystal_moss", "y": 90 }, - { "model": "betterend:block/crystal_moss", "y": 180 }, - { "model": "betterend:block/crystal_moss", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json b/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json deleted file mode 100644 index 2218e820..00000000 --- a/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/crystal_moss_path" }, - { "model": "betterend:block/crystal_moss_path", "y": 90 }, - { "model": "betterend:block/crystal_moss_path", "y": 180 }, - { "model": "betterend:block/crystal_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_moss.json b/src/main/resources/assets/betterend/blockstates/end_moss.json deleted file mode 100644 index f784924d..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/end_moss" - }, - { - "model": "betterend:block/end_moss", - "y": 90 - }, - { - "model": "betterend:block/end_moss", - "y": 180 - }, - { - "model": "betterend:block/end_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_moss_path.json b/src/main/resources/assets/betterend/blockstates/end_moss_path.json deleted file mode 100644 index 336a778d..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/end_moss_path" }, - { "model": "betterend:block/end_moss_path", "y": 90 }, - { "model": "betterend:block/end_moss_path", "y": 180 }, - { "model": "betterend:block/end_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_mycelium.json b/src/main/resources/assets/betterend/blockstates/end_mycelium.json deleted file mode 100644 index 42bb44e3..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_mycelium.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/end_mycelium" - }, - { - "model": "betterend:block/end_mycelium", - "y": 90 - }, - { - "model": "betterend:block/end_mycelium", - "y": 180 - }, - { - "model": "betterend:block/end_mycelium", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json b/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json deleted file mode 100644 index 22db9d60..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/end_mycelium_path" }, - { "model": "betterend:block/end_mycelium_path", "y": 90 }, - { "model": "betterend:block/end_mycelium_path", "y": 180 }, - { "model": "betterend:block/end_mycelium_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_portal_block.json b/src/main/resources/assets/betterend/blockstates/end_portal_block.json index 439c2b9d..a9d558f3 100644 --- a/src/main/resources/assets/betterend/blockstates/end_portal_block.json +++ b/src/main/resources/assets/betterend/blockstates/end_portal_block.json @@ -1,10 +1,6 @@ { "variants": { - "axis=x": { - "model": "betterend:block/end_portal_ax" - }, - "axis=z": { - "model": "betterend:block/end_portal_az" - } + "axis=x": { "model": "betterend:block/end_portal" }, + "axis=z": { "model": "betterend:block/end_portal", "y": 90 } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/filalux.json b/src/main/resources/assets/betterend/blockstates/filalux.json new file mode 100644 index 00000000..d077514e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/filalux.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/filalux_middle" }, + "shape=middle": { "model": "betterend:block/filalux_middle" }, + "shape=bottom": { "model": "betterend:block/filalux_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/filalux_wings.json b/src/main/resources/assets/betterend/blockstates/filalux_wings.json new file mode 100644 index 00000000..06920a33 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/filalux_wings.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=north": { "model": "betterend:block/filalux_wings", "y": 180 }, + "facing=south": { "model": "betterend:block/filalux_wings" }, + "facing=east": { "model": "betterend:block/filalux_wings", "y": 270 }, + "facing=west": { "model": "betterend:block/filalux_wings", "y": 90 }, + "facing=up": { "model": "betterend:block/filalux_wings_top" }, + "facing=down": { "model": "betterend:block/filalux_wings_bottom", "x": 180 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/flamaea.json b/src/main/resources/assets/betterend/blockstates/flamaea.json new file mode 100644 index 00000000..6b9238e1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/flamaea.json @@ -0,0 +1,11 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/flamaea_1" }, + { "model": "betterend:block/flamaea_2" }, + { "model": "betterend:block/flamaea_3" }, + { "model": "betterend:block/flamaea_4" }, + { "model": "betterend:block/flamaea_5" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/fracturn.json b/src/main/resources/assets/betterend/blockstates/fracturn.json new file mode 100644 index 00000000..b53acc64 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/fracturn.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/fracturn_01" }, + { "model": "betterend:block/fracturn_02" }, + { "model": "betterend:block/fracturn_03" }, + { "model": "betterend:block/fracturn_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/globulagus.json b/src/main/resources/assets/betterend/blockstates/globulagus.json new file mode 100644 index 00000000..f818fddc --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/globulagus.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/globulagus_01" }, + { "model": "betterend:block/globulagus_02" }, + { "model": "betterend:block/globulagus_03" }, + { "model": "betterend:block/globulagus_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_fern.json b/src/main/resources/assets/betterend/blockstates/jungle_fern.json new file mode 100644 index 00000000..d5fd0e42 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_fern.json @@ -0,0 +1,48 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/jungle_fern_1", "y": 180 }, + { "model": "betterend:block/jungle_fern_2", "y": 180 }, + { "model": "betterend:block/jungle_fern_3", "y": 180 }, + { "model": "betterend:block/jungle_fern_4", "y": 180 }, + { "model": "betterend:block/jungle_fern_5", "y": 180 }, + { "model": "betterend:block/jungle_fern_6", "y": 180 }, + { "model": "betterend:block/jungle_fern_7", "y": 180 }, + { "model": "betterend:block/jungle_fern_8", "y": 180 }, + { "model": "betterend:block/jungle_fern_9", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/jungle_fern_1" }, + { "model": "betterend:block/jungle_fern_2" }, + { "model": "betterend:block/jungle_fern_3" }, + { "model": "betterend:block/jungle_fern_4" }, + { "model": "betterend:block/jungle_fern_5" }, + { "model": "betterend:block/jungle_fern_6" }, + { "model": "betterend:block/jungle_fern_7" }, + { "model": "betterend:block/jungle_fern_8" }, + { "model": "betterend:block/jungle_fern_9" } + ], + "facing=east": [ + { "model": "betterend:block/jungle_fern_1", "y": 270 }, + { "model": "betterend:block/jungle_fern_2", "y": 270 }, + { "model": "betterend:block/jungle_fern_3", "y": 270 }, + { "model": "betterend:block/jungle_fern_4", "y": 270 }, + { "model": "betterend:block/jungle_fern_5", "y": 270 }, + { "model": "betterend:block/jungle_fern_6", "y": 270 }, + { "model": "betterend:block/jungle_fern_7", "y": 270 }, + { "model": "betterend:block/jungle_fern_8", "y": 270 }, + { "model": "betterend:block/jungle_fern_9", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/jungle_fern_1", "y": 90 }, + { "model": "betterend:block/jungle_fern_2", "y": 90 }, + { "model": "betterend:block/jungle_fern_3", "y": 90 }, + { "model": "betterend:block/jungle_fern_4", "y": 90 }, + { "model": "betterend:block/jungle_fern_5", "y": 90 }, + { "model": "betterend:block/jungle_fern_6", "y": 90 }, + { "model": "betterend:block/jungle_fern_7", "y": 90 }, + { "model": "betterend:block/jungle_fern_8", "y": 90 }, + { "model": "betterend:block/jungle_fern_9", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_grass.json b/src/main/resources/assets/betterend/blockstates/jungle_grass.json new file mode 100644 index 00000000..ef0108d7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_grass.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/jungle_grass_01" }, + { "model": "betterend:block/jungle_grass_02" }, + { "model": "betterend:block/jungle_grass_03" }, + { "model": "betterend:block/jungle_grass_04" }, + { "model": "betterend:block/jungle_grass_05" }, + { "model": "betterend:block/jungle_grass_06" }, + { "model": "betterend:block/jungle_grass_07" }, + { "model": "betterend:block/jungle_grass_08" }, + { "model": "betterend:block/jungle_grass_09" }, + { "model": "betterend:block/jungle_grass_10" }, + { "model": "betterend:block/jungle_grass_11" }, + { "model": "betterend:block/jungle_grass_12" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_vine.json b/src/main/resources/assets/betterend/blockstates/jungle_vine.json new file mode 100644 index 00000000..dca9407e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_vine.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/jungle_vine_middle" }, + "shape=middle": { "model": "betterend:block/jungle_vine_middle" }, + "shape=bottom": { "model": "betterend:block/jungle_vine_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lamellarium.json b/src/main/resources/assets/betterend/blockstates/lamellarium.json new file mode 100644 index 00000000..0e6fcf7b --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lamellarium.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lamellarium_01" }, + { "model": "betterend:block/lamellarium_02" }, + { "model": "betterend:block/lamellarium_03" }, + { "model": "betterend:block/lamellarium_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json b/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json new file mode 100644 index 00000000..80bbb6c3 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/large_amaranita_cap" }, + "shape=middle": { "model": "betterend:block/large_amaranita_stem" }, + "shape=bottom": { "model": "betterend:block/large_amaranita_roots" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_bark.json b/src/main/resources/assets/betterend/blockstates/lucernia_bark.json new file mode 100644 index 00000000..57d7d613 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_bark.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/lucernia_bark", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2", "x": 90, "y": 90 }, + { "model": "betterend:block/lucernia_bark_3", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/lucernia_bark", "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2" }, + { "model": "betterend:block/lucernia_bark_3", "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4" } + ], + "axis=z": [ + { "model": "betterend:block/lucernia_bark", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2", "x": 90 }, + { "model": "betterend:block/lucernia_bark_3", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json b/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json new file mode 100644 index 00000000..677b54c1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lucernia_leaves_1" }, + { "model": "betterend:block/lucernia_leaves_2" }, + { "model": "betterend:block/lucernia_leaves_3" }, + { "model": "betterend:block/lucernia_leaves_4" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_log.json b/src/main/resources/assets/betterend/blockstates/lucernia_log.json new file mode 100644 index 00000000..7052ea7b --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_log.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/lucernia_log", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_2", "x": 90, "y": 90 }, + { "model": "betterend:block/lucernia_log_3", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_4", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/lucernia_log", "weight": 16 }, + { "model": "betterend:block/lucernia_log_2" }, + { "model": "betterend:block/lucernia_log_3", "weight": 16 }, + { "model": "betterend:block/lucernia_log_4" } + ], + "axis=z": [ + { "model": "betterend:block/lucernia_log", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_2", "x": 90 }, + { "model": "betterend:block/lucernia_log_3", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_4", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json new file mode 100644 index 00000000..9bef26b8 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/lucernia_outer_leaves_1" }, + { "model": "betterend:block/lucernia_outer_leaves_2" }, + { "model": "betterend:block/lucernia_outer_leaves_3" }, + { "model": "betterend:block/lucernia_outer_leaves_4" }, + { "model": "betterend:block/lucernia_outer_leaves_5" }, + { "model": "betterend:block/lucernia_outer_leaves_6" }, + { "model": "betterend:block/lucernia_outer_leaves_7" }, + { "model": "betterend:block/lucernia_outer_leaves_8" }, + { "model": "betterend:block/lucernia_outer_leaves_9" } + ], + "facing=east": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 90 } + ], + "facing=up": [ + { "model": "betterend:block/lucernia_outer_leaves_up_1" }, + { "model": "betterend:block/lucernia_outer_leaves_up_2" } + ], + "facing=down": [ + { "model": "betterend:block/lucernia_outer_leaves_up_1", "x": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_up_2", "x": 180 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn.json b/src/main/resources/assets/betterend/blockstates/lumecorn.json new file mode 100644 index 00000000..f35cf962 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lumecorn.json @@ -0,0 +1,11 @@ +{ + "variants": { + "shape=light_bottom": { "model": "betterend:block/lumecorn_light_bottom" }, + "shape=light_middle": { "model": "betterend:block/lumecorn_light_middle" }, + "shape=light_top_middle": { "model": "betterend:block/lumecorn_light_top_middle" }, + "shape=light_top": { "model": "betterend:block/lumecorn_light_top" }, + "shape=middle": { "model": "betterend:block/lumecorn_middle" }, + "shape=bottom_big": { "model": "betterend:block/lumecorn_roots_big" }, + "shape=bottom_small": { "model": "betterend:block/lumecorn_roots_small" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json b/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json new file mode 100644 index 00000000..7277a13a --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json @@ -0,0 +1,8 @@ +{ + "variants": { + "age=0": { "model": "betterend:block/lumecorn_seed_0" }, + "age=1": { "model": "betterend:block/lumecorn_seed_1" }, + "age=2": { "model": "betterend:block/lumecorn_seed_2" }, + "age=3": { "model": "betterend:block/lumecorn_seed_3" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lutebus.json b/src/main/resources/assets/betterend/blockstates/lutebus.json new file mode 100644 index 00000000..04520359 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lutebus.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lutebus_01" }, + { "model": "betterend:block/lutebus_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/magnula.json b/src/main/resources/assets/betterend/blockstates/magnula.json new file mode 100644 index 00000000..327b9ae0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/magnula.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/magnula_middle" }, + "shape=middle": { "model": "betterend:block/magnula_middle" }, + "shape=bottom": { "model": "betterend:block/magnula_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json b/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json new file mode 100644 index 00000000..81deb09d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/mossy_dragon_bone_hor", "y": 90 }, + "axis=y": { "model": "betterend:block/mossy_dragon_bone_ver" }, + "axis=z": { "model": "betterend:block/mossy_dragon_bone_hor" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json new file mode 100644 index 00000000..8c8edaf7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/mossy_obsidian" }, + { "model": "betterend:block/mossy_obsidian", "y": 90 }, + { "model": "betterend:block/mossy_obsidian", "y": 180 }, + { "model": "betterend:block/mossy_obsidian", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus.json b/src/main/resources/assets/betterend/blockstates/neon_cactus.json new file mode 100644 index 00000000..3bf98f48 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus.json @@ -0,0 +1,66 @@ +{ + "variants": { + "bottom=empty,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" }, + "bottom=empty,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 }, + "bottom=empty,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 }, + "bottom=empty,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 }, + "bottom=empty,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 }, + "bottom=empty,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 }, + + "bottom=sand,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_sand" }, + "bottom=sand,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_sand", "x": 180 }, + "bottom=sand,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_sand", "x": 90 }, + "bottom=sand,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 270 }, + + "bottom=moss,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_moss" }, + "bottom=moss,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_moss", "x": 180 }, + "bottom=moss,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_moss", "x": 90 }, + "bottom=moss,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 270 }, + + "bottom=empty,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" }, + "bottom=empty,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 }, + "bottom=empty,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 }, + "bottom=empty,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 }, + "bottom=empty,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 }, + "bottom=empty,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 }, + + "bottom=sand,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_sand" }, + "bottom=sand,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_sand", "x": 180 }, + "bottom=sand,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90 }, + "bottom=sand,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 270 }, + + "bottom=moss,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_moss" }, + "bottom=moss,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_moss", "x": 180 }, + "bottom=moss,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90 }, + "bottom=moss,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 270 }, + + "bottom=empty,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" }, + "bottom=empty,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 }, + "bottom=empty,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 }, + "bottom=empty,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 }, + "bottom=empty,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 }, + "bottom=empty,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 }, + + "bottom=sand,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_sand" }, + "bottom=sand,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_sand", "x": 180 }, + "bottom=sand,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_sand", "x": 90 }, + "bottom=sand,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 270 }, + + "bottom=moss,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_moss" }, + "bottom=moss,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_moss", "x": 180 }, + "bottom=moss,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_moss", "x": 90 }, + "bottom=moss,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json b/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json new file mode 100644 index 00000000..bdfc0157 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json @@ -0,0 +1,15 @@ +{ + "variants": { + "type=bottom": { + "model": "betterend:block/neon_cactus_slab" + }, + "type=top": { + "model": "betterend:block/neon_cactus_slab", + "x": 180, + "uvlock": true + }, + "type=double": { + "model": "betterend:block/neon_cactus_block" + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json b/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json new file mode 100644 index 00000000..edc5a3a5 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/nightshade_moss.json b/src/main/resources/assets/betterend/blockstates/nightshade_moss.json new file mode 100644 index 00000000..3e588500 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/nightshade_moss.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/nightshade_moss_01", "y": 180 }, + { "model": "betterend:block/nightshade_moss_02", "y": 180 }, + { "model": "betterend:block/nightshade_moss_03", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/nightshade_moss_01" }, + { "model": "betterend:block/nightshade_moss_02" }, + { "model": "betterend:block/nightshade_moss_03" } + ], + "facing=east": [ + { "model": "betterend:block/nightshade_moss_01", "y": 270 }, + { "model": "betterend:block/nightshade_moss_02", "y": 270 }, + { "model": "betterend:block/nightshade_moss_03", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/nightshade_moss_01", "y": 90 }, + { "model": "betterend:block/nightshade_moss_02", "y": 90 }, + { "model": "betterend:block/nightshade_moss_03", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/orango.json b/src/main/resources/assets/betterend/blockstates/orango.json new file mode 100644 index 00000000..c43c82ce --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/orango.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/orango_01" }, + { "model": "betterend:block/orango_02" }, + { "model": "betterend:block/orango_03" }, + { "model": "betterend:block/orango_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss.json b/src/main/resources/assets/betterend/blockstates/pink_moss.json deleted file mode 100644 index 27f9613c..00000000 --- a/src/main/resources/assets/betterend/blockstates/pink_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/pink_moss" - }, - { - "model": "betterend:block/pink_moss", - "y": 90 - }, - { - "model": "betterend:block/pink_moss", - "y": 180 - }, - { - "model": "betterend:block/pink_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss_path.json b/src/main/resources/assets/betterend/blockstates/pink_moss_path.json deleted file mode 100644 index 4ca9deab..00000000 --- a/src/main/resources/assets/betterend/blockstates/pink_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/pink_moss_path" }, - { "model": "betterend:block/pink_moss_path", "y": 90 }, - { "model": "betterend:block/pink_moss_path", "y": 180 }, - { "model": "betterend:block/pink_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/pond_anemone.json b/src/main/resources/assets/betterend/blockstates/pond_anemone.json new file mode 100644 index 00000000..59a741ed --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pond_anemone.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/pond_anemone" }, + { "model": "betterend:block/pond_anemone", "y": 90 }, + { "model": "betterend:block/pond_anemone", "y": 180 }, + { "model": "betterend:block/pond_anemone", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/rubinea.json b/src/main/resources/assets/betterend/blockstates/rubinea.json new file mode 100644 index 00000000..4c03ccf6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/rubinea.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/rubinea_middle" }, + "shape=middle": { "model": "betterend:block/rubinea_middle" }, + "shape=bottom": { "model": "betterend:block/rubinea_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/ruscus.json b/src/main/resources/assets/betterend/blockstates/ruscus.json new file mode 100644 index 00000000..99388f2d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/ruscus.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/ruscus_1", "y": 180 }, + { "model": "betterend:block/ruscus_2", "y": 180 }, + { "model": "betterend:block/ruscus_3", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/ruscus_1" }, + { "model": "betterend:block/ruscus_2" }, + { "model": "betterend:block/ruscus_3" } + ], + "facing=east": [ + { "model": "betterend:block/ruscus_1", "y": 270 }, + { "model": "betterend:block/ruscus_2", "y": 270 }, + { "model": "betterend:block/ruscus_3", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/ruscus_1", "y": 90 }, + { "model": "betterend:block/ruscus_2", "y": 90 }, + { "model": "betterend:block/ruscus_3", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/rutiscus.json b/src/main/resources/assets/betterend/blockstates/rutiscus.json new file mode 100644 index 00000000..a4aac58f --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/rutiscus.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/rutiscus_1" }, + { "model": "betterend:block/rutiscus_1", "y": 90 }, + { "model": "betterend:block/rutiscus_1", "y": 180 }, + { "model": "betterend:block/rutiscus_1", "y": 270 }, + { "model": "betterend:block/rutiscus_2" }, + { "model": "betterend:block/rutiscus_2", "y": 90 }, + { "model": "betterend:block/rutiscus_2", "y": 180 }, + { "model": "betterend:block/rutiscus_2", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/salteago.json b/src/main/resources/assets/betterend/blockstates/salteago.json new file mode 100644 index 00000000..a3a2de25 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/salteago.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/salteago_01" }, + { "model": "betterend:block/salteago_02" }, + { "model": "betterend:block/salteago_03" }, + { "model": "betterend:block/salteago_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass.json b/src/main/resources/assets/betterend/blockstates/shadow_grass.json deleted file mode 100644 index 37d4a7f0..00000000 --- a/src/main/resources/assets/betterend/blockstates/shadow_grass.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/shadow_grass" - }, - { - "model": "betterend:block/shadow_grass", - "y": 90 - }, - { - "model": "betterend:block/shadow_grass", - "y": 180 - }, - { - "model": "betterend:block/shadow_grass", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json b/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json deleted file mode 100644 index e31a8a14..00000000 --- a/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/shadow_grass_path" }, - { "model": "betterend:block/shadow_grass_path", "y": 90 }, - { "model": "betterend:block/shadow_grass_path", "y": 180 }, - { "model": "betterend:block/shadow_grass_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json b/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json new file mode 100644 index 00000000..ea609405 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=north,fullness=0": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=1": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=2": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=3": { "model": "betterend:block/silk_moth_hive_silk" }, + "facing=south,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 180 }, + "facing=east,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 90 }, + "facing=west,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json index 332f6ffc..41975436 100644 --- a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json +++ b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json @@ -1,9 +1,21 @@ { "variants": { "active=false": { "model": "betterend:block/silk_moth_nest_top" }, - "active=true,facing=north": { "model": "betterend:block/silk_moth_nest_bottom" }, - "active=true,facing=south": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, - "active=true,facing=east": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, - "active=true,facing=west": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 } + "active=true,facing=north,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk" }, + "active=true,facing=south,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 180 }, + "active=true,facing=east,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 90 }, + "active=true,facing=west,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 270 } } } diff --git a/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json new file mode 100644 index 00000000..63f7c8c5 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/small_amaranita_mushroom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json new file mode 100644 index 00000000..650cc8c6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json @@ -0,0 +1,32 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/small_jellyshroom_wall_1" }, + { "model": "betterend:block/small_jellyshroom_wall_2" } + ], + "facing=east": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 270 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 90 } + ], + "facing=up": [ + { "model": "betterend:block/small_jellyshroom_floor" }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 270 } + ], + "facing=down": [ + { "model": "betterend:block/small_jellyshroom_ceil" }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json new file mode 100644 index 00000000..2d3e15ba --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/smaragdant_crystal", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/smaragdant_crystal" }, + "axis=z": { "model": "betterend:block/smaragdant_crystal", "x": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json new file mode 100644 index 00000000..a029b55e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:block/smaragdant_crystal_shard" }, + "facing=down": { "model": "betterend:block/smaragdant_crystal_shard", "x": 180 }, + "facing=north": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90 }, + "facing=south": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 180 }, + "facing=east": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 90 }, + "facing=west": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json b/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json new file mode 100644 index 00000000..22dad4a7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/tenanea_leaves" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json new file mode 100644 index 00000000..1f058fff --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json @@ -0,0 +1,25 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/twisted_umbrella_moss_small" }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_2" }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_3" }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_4" }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..b8c433d6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json @@ -0,0 +1,28 @@ +{ + "variants": { + "top=true,rotation=0": [ + { "model": "betterend:block/twisted_umbrella_moss_top" }, + { "model": "betterend:block/twisted_umbrella_moss_top_2" }, + { "model": "betterend:block/twisted_umbrella_moss_top_3" } + ], + "top=false,rotation=0": { "model": "betterend:block/twisted_umbrella_moss_bottom" }, + "top=true,rotation=1": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 90 } + ], + "top=false,rotation=1": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 90 }, + "top=true,rotation=2": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 180 } + ], + "top=false,rotation=2": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 180 }, + "top=true,rotation=3": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 270 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 270 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 270 } + ], + "top=false,rotation=3": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json new file mode 100644 index 00000000..67205565 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json @@ -0,0 +1,12 @@ +{ + "variants": { + "color=0": { "model": "betterend:block/umbrella_tree_membrane_0" }, + "color=1": { "model": "betterend:block/umbrella_tree_membrane_1" }, + "color=2": { "model": "betterend:block/umbrella_tree_membrane_2" }, + "color=3": { "model": "betterend:block/umbrella_tree_membrane_3" }, + "color=4": { "model": "betterend:block/umbrella_tree_membrane_4" }, + "color=5": { "model": "betterend:block/umbrella_tree_membrane_5" }, + "color=6": { "model": "betterend:block/umbrella_tree_membrane_6" }, + "color=7": { "model": "betterend:block/umbrella_tree_membrane_7" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json b/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json new file mode 100644 index 00000000..4956451d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/vaiolush_fern_01" }, + { "model": "betterend:block/vaiolush_fern_02" }, + { "model": "betterend:block/vaiolush_fern_03" }, + { "model": "betterend:block/vaiolush_fern_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json b/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json new file mode 100644 index 00000000..442f38d9 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/water" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks.json deleted file mode 100644 index a9d9704f..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_bricks" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json deleted file mode 100644 index e677d7d4..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "betterend:block/violecite_bricks_half_slab" - }, - "type=double": { - "model": "betterend:block/violecite_bricks" - }, - "type=top": { - "model": "betterend:block/violecite_bricks_half_slab", - "uvlock": true, - "x": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json deleted file mode 100644 index b528feb8..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_button.json b/src/main/resources/assets/betterend/blockstates/violecite_button.json deleted file mode 100644 index e39bf88d..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_button.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "variants": { - "face=ceiling,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=north,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180 - }, - "face=ceiling,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180 - }, - "face=ceiling,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 90 - }, - "face=ceiling,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 90 - }, - "face=floor,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "y": 90 - }, - "face=floor,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 90 - }, - "face=floor,facing=north,powered=false": { - "model": "betterend:block/violecite_button" - }, - "face=floor,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed" - }, - "face=floor,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "y": 180 - }, - "face=floor,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 180 - }, - "face=floor,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "y": 270 - }, - "face=floor,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 270 - }, - "face=wall,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=north,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 270 - }, - "face=wall,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 270 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_pillar.json b/src/main/resources/assets/betterend/blockstates/violecite_pillar.json deleted file mode 100644 index 90618711..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_pillar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "axis=x": { "model": "betterend:block/violecite_pillar", "x": 90, "y": 270 }, - "axis=y": { "model": "betterend:block/violecite_pillar" }, - "axis=z": { "model": "betterend:block/violecite_pillar", "x": 90 } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_plate.json b/src/main/resources/assets/betterend/blockstates/violecite_plate.json deleted file mode 100644 index 83aba147..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "betterend:block/violecite_pressure_plate_up" - }, - "powered=true": { - "model": "betterend:block/violecite_pressure_plate_down" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_slab.json b/src/main/resources/assets/betterend/blockstates/violecite_slab.json deleted file mode 100644 index d27cf448..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "betterend:block/violecite_half_slab" - }, - "type=double": { - "model": "betterend:block/violecite" - }, - "type=top": { - "model": "betterend:block/violecite_half_slab", - "uvlock": true, - "x": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json b/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json deleted file mode 100644 index 6f7d8561..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_small_tiles" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_stairs.json b/src/main/resources/assets/betterend/blockstates/violecite_stairs.json deleted file mode 100644 index bd76aa03..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_stairs.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_tile.json b/src/main/resources/assets/betterend/blockstates/violecite_tile.json deleted file mode 100644 index f735990c..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_tile.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_tile" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_wall.json b/src/main/resources/assets/betterend/blockstates/violecite_wall.json deleted file mode 100644 index afb41db1..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_wall.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "multipart": [ - { - "when": { - "up": "true" - }, - "apply": { - "model": "betterend:block/violecite_wall_post" - } - }, - { - "when": { - "north": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "uvlock": true - } - }, - { - "when": { - "east": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 270, - "uvlock": true - } - }, - { - "when": { - "north": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "uvlock": true - } - }, - { - "when": { - "east": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 270, - "uvlock": true - } - } - ] -} diff --git a/src/main/resources/assets/betterend/lang/de_de.json b/src/main/resources/assets/betterend/lang/de_de.json new file mode 100644 index 00000000..7341d5c0 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/de_de.json @@ -0,0 +1,698 @@ +{ + "itemGroup.betterend.end_items": "Better End: Items", + "itemGroup.betterend.end_blocks": "Better End: Blöcke", + + "item.betterend.guidebook": "Das Ende für Idioten", + "book.betterend.landing": "Eine kurze Anleitung zum Überleben unter den extremen Bedingungen im End.", + "book.betterend.subtitle": "Überlebe im End", + + "category.rei.damage.amount&dmg": "Werkzeugschaden: %s", + "category.rei.infusion.time&val": "Zeit: %s", + + "biome.betterend.foggy_mushroomland": "Nebeliges Pilzland", + "biome.betterend.dust_wastelands": "Staubiges Ödland", + "biome.betterend.chorus_forest": "Choruswald", + "biome.betterend.megalake": "Riesensee", + "biome.betterend.crystal_mountains": "Kristallberge", + + "entity.betterend.dragonfly": "Libelle", + "item.betterend.spawn_egg_dragonfly": "Libellen-Spawn-Ei", + + "entity.betterend.end_slime": "Endschleim", + "item.betterend.spawn_egg_end_slime": "Endschleim-Spawn-Ei", + + "block.betterend.end_mycelium": "End-Myzel", + "block.betterend.end_moss": "End-Moos", + "block.betterend.endstone_dust": "Endsteinstaub", + + "block.betterend.end_mycelium_path": "End-Myzelpfad", + "block.betterend.end_moss_path": "End-Moospfad", + + "block.betterend.ender_ore": "Endererz", + "block.betterend.terminite_block": "Terminitblock", + "block.betterend.aeternium_block": "Ätherblock", + "block.betterend.ender_block": "Enderblock", + "block.betterend.end_stone_smelter": "Endsteinschmelzofen", + + "item.betterend.ender_dust": "Enderstaub", + "item.betterend.ender_shard": "Enderscherbe", + "item.betterend.terminite_ingot": "Terminitbarren", + "item.betterend.aeternium_ingot": "Ätherbarren", + "item.betterend.terminite_helmet": "Terminithelm", + "item.betterend.terminite_chestplate": "Terminitharnisch", + "item.betterend.terminite_leggings": "Terminitbeinschutz", + "item.betterend.terminite_boots": "Terminitstiefel", + "item.betterend.terminite_shovel": "Terminitschaufel", + "item.betterend.terminite_sword": "Terminitschwert", + "item.betterend.terminite_pickaxe": "Terminitspitzhacke", + "item.betterend.terminite_axe": "Terminitaxt", + "item.betterend.terminite_hoe": "Terminithacke", + "item.betterend.terminite_hammer": "Terminitschmiedehammer", + "item.betterend.aeternium_helmet": "Ätherhelm", + "item.betterend.aeternium_chestplate": "Ätherharnisch", + "item.betterend.aeternium_leggings": "Ätherbeinschutz", + "item.betterend.aeternium_boots": "Ätherstiefel", + "item.betterend.aeternium_shovel": "Ätherschaufel", + "item.betterend.aeternium_sword": "Ätherschwert", + "item.betterend.aeternium_pickaxe": "Ätherspitzhacke", + "item.betterend.aeternium_axe": "Ätheraxt", + "item.betterend.aeternium_hoe": "Ätherhacke", + "item.betterend.aeternium_hammer": "Ätherschmiedehammer", + "item.betterend.iron_hammer": "Eisenschmiedehammer", + "item.betterend.golden_hammer": "Goldschmiedehammer", + "item.betterend.diamond_hammer": "Diamantschmiedehammer", + "item.betterend.netherite_hammer": "Netheritschmiedehammer", + "item.betterend.crystalite_boots": "Kristallitstiefel", + "item.betterend.crystalite_chestplate": "Kristallitharnisch", + "item.betterend.crystalite_helmet": "Kristallithelm", + "item.betterend.crystalite_leggings": "Kristallitbeinschutz", + "item.betterend.aeternium_axe_head": "Ätheraxtkopf", + "item.betterend.aeternium_hammer_head": "Ätherhammerkopf", + "item.betterend.aeternium_hoe_head": "Ätherhackenkopf", + "item.betterend.aeternium_pickaxe_head": "Ätherspitzhackenkopf", + "item.betterend.aeternium_shovel_head": "Ätherschaufelkopf", + "item.betterend.aeternium_sword_blade": "Ätherschwertklinge", + "item.betterend.aeternium_sword_handle": "Ätherschwertgriff", + "item.betterend.leather_stripe": "Lederband", + "item.betterend.leather_wrapped_stick": "Leder-umwickelter Stock", + + "effect.betterend.end_veil": "Endschleier", + "enchantment.betterend.end_veil": "Endschleier", + "item.minecraft.potion.effect.end_veil": "Trank des Endschleiers", + "item.minecraft.potion.effect.long_end_veil": "Trank des Endschleiers", + "item.minecraft.splash_potion.effect.end_veil": "Wurftrank des Endschleiers", + "item.minecraft.splash_potion.effect.long_end_veil": "Wurftrank des Endschleiers", + "item.minecraft.lingering_potion.effect.end_veil": "Verweiltrank des Endschleiers", + "item.minecraft.lingering_potion.effect.long_end_veil": "Verweiltrank des Endschleiers", + "item.minecraft.tipped_arrow.effect.end_veil": "Pfeil des Endschleiers", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Pfeil des Endschleiers", + + "block.betterend.mossy_glowshroom_sapling": "Bemooster Glühpilzsetzling", + "block.betterend.mossy_glowshroom_cap": "Bemooste Glühpilzkappe", + "block.betterend.mossy_glowshroom_fur": "Bemoostes Glühpilzfell", + "block.betterend.mossy_glowshroom_hymenophore": "Bemoostes Glühpilzhymenophor", + "block.betterend.mossy_glowshroom_bark": "Bemoostes Glühpilzholz", + "block.betterend.mossy_glowshroom_barrel": "Bemoostes Glühpilzfass", + "block.betterend.mossy_glowshroom_button": "Bemooster Glühpilzknopf", + "block.betterend.mossy_glowshroom_chest": "Bemooste Glühpilztruhe", + "block.betterend.mossy_glowshroom_crafting_table": "Bemooste Glühpilzwerkbank", + "block.betterend.mossy_glowshroom_door": "Bemooste Glühpilztür", + "block.betterend.mossy_glowshroom_fence": "Bemooster Glühpilzzaun", + "block.betterend.mossy_glowshroom_gate": "Bemoostes Glühpilzzauntor", + "block.betterend.mossy_glowshroom_ladder": "Bemooste Glühpilzleiter", + "block.betterend.mossy_glowshroom_log": "Bemooster Glühpilzstamm", + "block.betterend.mossy_glowshroom_planks": "Bemooste Glühpilzbretter", + "block.betterend.mossy_glowshroom_plate": "Bemooste Glühpilzdruckplatte", + "block.betterend.mossy_glowshroom_sign": "Bemoostes Glühpilzschild", + "block.betterend.mossy_glowshroom_slab": "Bemooste Glühpilzstufe", + "block.betterend.mossy_glowshroom_stairs": "Bemooste Glühpilztreppe", + "block.betterend.mossy_glowshroom_stripped_bark": "Entrindetes bemoostes Glühpilzholz", + "block.betterend.mossy_glowshroom_stripped_log": "Entrindeter bemooster Glühpilzstamm", + "block.betterend.mossy_glowshroom_trapdoor": "Bemooste Glühpilzfalltür", + + "block.betterend.umbrella_moss": "Schirmmoos", + "block.betterend.umbrella_moss_tall": "Großes Schirmmoos", + "block.betterend.creeping_moss": "Kriechendes Moos", + + "block.betterend.blue_vine_seed": "Blaurankensamen", + "block.betterend.blue_vine": "Blauranke", + "block.betterend.blue_vine_lantern": "Blaurankenlaterne", + "block.betterend.blue_vine_fur": "Blaurankenfell", + + "block.betterend.dense_vine": "Dichte Ranke", + "block.betterend.bubble_coral": "Blasenkoralle", + "block.betterend.aurora_crystal": "Aurorakristall", + "item.betterend.crystal_shards": "Kristallscherben", + + "block.betterend.pythadendron_sapling": "Pythadendronsetzling", + "block.betterend.pythadendron_bark": "Pythadendronholz", + "block.betterend.pythadendron_barrel": "Pythadendronfass", + "block.betterend.pythadendron_button": "Pythadendronknopf", + "block.betterend.pythadendron_chest": "Pythadendrontruhe", + "block.betterend.pythadendron_crafting_table": "Pythadendronwerkbank", + "block.betterend.pythadendron_door": "Pythadendrontür", + "block.betterend.pythadendron_fence": "Pythadendronzaun", + "block.betterend.pythadendron_gate": "Pythadendronzauntor", + "block.betterend.pythadendron_ladder": "Pythadendronleiter", + "block.betterend.pythadendron_log": "Pythadendronstamm", + "block.betterend.pythadendron_planks": "Pythadendronbretter", + "block.betterend.pythadendron_plate": "Pythadendrondruckplatte", + "block.betterend.pythadendron_sign": "Pythadendronschild", + "block.betterend.pythadendron_slab": "Pythadendronstufe", + "block.betterend.pythadendron_stairs": "Pythadendrontreppe", + "block.betterend.pythadendron_stripped_bark": "Entrindetes Pythadendronholz", + "block.betterend.pythadendron_stripped_log": "Entrindeter Pythadendronstamm", + "block.betterend.pythadendron_trapdoor": "Pythadendronfalltür", + + "block.betterend.chorus_nylium": "Chorus-Nezel", + "block.betterend.chorus_nylium_path": "Chorus-Nezelpfad", + "block.betterend.chorus_grass": "Chorusgras", + + "block.betterend.end_lily": "Endlilie", + "block.betterend.end_lily_seed": "Endliliensamen", + "item.betterend.end_lily_leaf": "Endlilienblatt", + "item.betterend.end_lily_leaf_dried": "Trockenes Endlilienblatt", + + "block.betterend.violecite": "Violezit", + "block.betterend.violecite_bricks": "Violezitziegel", + "block.betterend.violecite_bricks_slab": "Violezitziegelstufe", + "block.betterend.violecite_bricks_stairs": "Violezitziegeltreppe", + "block.betterend.violecite_bricks_wall": "Violezitziegelmauer", + "block.betterend.violecite_button": "Violezitknopf", + "block.betterend.violecite_pillar": "Violezitsäule", + "block.betterend.violecite_plate": "Violezitdruckplatte", + "block.betterend.violecite_slab": "Violezitstufe", + "block.betterend.violecite_tiles": "Violezitfliesen", + "block.betterend.violecite_stairs": "Violezittreppe", + "block.betterend.violecite_polished": "Polierter Violezit", + "block.betterend.violecite_wall": "Violezitmauer", + "block.betterend.violecite_pedestal": "Violezitsockel", + + "block.betterend.flavolite": "Flavolit", + "block.betterend.flavolite_bricks": "Flavolitziegel", + "block.betterend.flavolite_bricks_slab": "Flavolitziegelstufe", + "block.betterend.flavolite_bricks_stairs": "Flavolitziegeltreppe", + "block.betterend.flavolite_bricks_wall": "Flavolitziegelmauer", + "block.betterend.flavolite_button": "Flavolitknopf", + "block.betterend.flavolite_pillar": "Flavolitsäule", + "block.betterend.flavolite_plate": "Flavolitdruckplatte", + "block.betterend.flavolite_slab": "Flavolitstufe", + "block.betterend.flavolite_tiles": "Flavolitfliesen", + "block.betterend.flavolite_stairs": "Flavolittreppe", + "block.betterend.flavolite_polished": "Polierter Flavolit", + "block.betterend.flavolite_wall": "Flavolitmauer", + "block.betterend.flavolite_pedestal": "Flavolitsockel", + + "block.betterend.andesite_pedestal": "Andesitsockel", + "block.betterend.diorite_pedestal": "Dioritsockel", + "block.betterend.granite_pedestal": "Granitsockel", + "block.betterend.purpur_pedestal": "Purpursockel", + "block.betterend.quartz_pedestal": "Quarzsockel", + "block.betterend.infusion_pedestal": "Infusionssockel", + + "block.betterend.end_lotus_seed": "Endlotussamen", + "block.betterend.end_lotus_stem": "Endlotusstamm", + "block.betterend.end_lotus_leaf": "Endlotusblatt", + "block.betterend.end_lotus_flower": "Endlotusblume", + + "block.betterend.end_lotus_bark": "Endlotusholz", + "block.betterend.end_lotus_barrel": "Endlotusfass", + "block.betterend.end_lotus_button": "Endlotusknopf", + "block.betterend.end_lotus_chest": "Endlotustruhe", + "block.betterend.end_lotus_crafting_table": "Endlotuswerkbank", + "block.betterend.end_lotus_door": "Endlotustür", + "block.betterend.end_lotus_fence": "Endlotuszaun", + "block.betterend.end_lotus_gate": "Endlotuszauntor", + "block.betterend.end_lotus_ladder": "Endlotusleiter", + "block.betterend.end_lotus_log": "Endlotusstamm", + "block.betterend.end_lotus_planks": "Endlotusbretter", + "block.betterend.end_lotus_plate": "Endlotusdruckplatte", + "block.betterend.end_lotus_sign": "Endlotusschild", + "block.betterend.end_lotus_slab": "Endlotusstufe", + "block.betterend.end_lotus_stairs": "Endlotustreppe", + "block.betterend.end_lotus_stripped_bark": "Entrindetes Endlotusholz", + "block.betterend.end_lotus_stripped_log": "Entrindeter Endlotusstamm", + "block.betterend.end_lotus_trapdoor": "Endlotusfalltür", + + "block.betterend.cave_moss": "Höhlenmoos", + "block.betterend.cave_grass": "Höhlengras", + "block.betterend.cave_bush": "Höhlenbusch", + + "block.betterend.cave_moss_path": "Höhlenmoospfad", + "block.betterend.crystal_moss": "Kristallmoos", + "block.betterend.crystal_moss_path": "Kristallmoospfad", + "block.betterend.pythadendron_leaves": "Pythadendronlaub", + "item.betterend.spawn_egg_end_fish": "Endfisch-Spawn-Ei", + "block.betterend.crystal_grass": "Kristallgras", + + "block.betterend.flavolite_runed": "Flavolitrune", + "block.betterend.end_portal_block": "Endportal", + "block.betterend.eternal_pedestal": "Ewiges Sockel", + "block.betterend.flavolite_runed_eternal": "Ewige Flavolitrune", + "item.betterend.eternal_crystal": "Ewiger Kristall", + + "block.betterend.lacugrove_bark": "Seemangrovenholz", + "block.betterend.lacugrove_barrel": "Seemangrovenfass", + "block.betterend.lacugrove_button": "Seemangrovenknopf", + "block.betterend.lacugrove_chest": "Seemangroventruhe", + "block.betterend.lacugrove_crafting_table": "Seemangrovenwerkbank", + "block.betterend.lacugrove_door": "Seemangroventür", + "block.betterend.lacugrove_fence": "Seemangrovenzaun", + "block.betterend.lacugrove_gate": "Seemangrovenzauntor", + "block.betterend.lacugrove_ladder": "Seemangrovenleiter", + "block.betterend.lacugrove_log": "Seemangrovenstamm", + "block.betterend.lacugrove_planks": "Seemangrovenbretter", + "block.betterend.lacugrove_plate": "Seemangrovendruckplatte", + "block.betterend.lacugrove_sign": "Seemangrovenschild", + "block.betterend.lacugrove_slab": "Seemangrovenstufe", + "block.betterend.lacugrove_stairs": "Seemangroventreppe", + "block.betterend.lacugrove_stripped_bark": "Entrindetes Seemangrovenholz", + "block.betterend.lacugrove_stripped_log": "Entrindeter Seemangrovenstamm", + "block.betterend.lacugrove_trapdoor": "Seemangrovenfalltür", + + "block.betterend.lacugrove_leaves": "Seemangrovenlaub", + "block.betterend.lacugrove_sapling": "Seemangrovensetzling", + + "biome.betterend.megalake_grove": "Riesenseemangrove", + "biome.betterend.painted_mountains": "Bemalte Berge", + + "block.betterend.dragon_tree_bark": "Drachenbaumholz", + "block.betterend.dragon_tree_barrel": "Drachenbaumfass", + "block.betterend.dragon_tree_button": "Drachenbaumknopf", + "block.betterend.dragon_tree_chest": "Drachenbaumtruhe", + "block.betterend.dragon_tree_crafting_table": "Drachenbaumwerkbank", + "block.betterend.dragon_tree_door": "Drachenbaumtür", + "block.betterend.dragon_tree_fence": "Drachenbaumzaun", + "block.betterend.dragon_tree_gate": "Drachenbaumzauntor", + "block.betterend.dragon_tree_ladder": "Drachenbaumleiter", + "block.betterend.dragon_tree_log": "Drachenbaumstamm", + "block.betterend.dragon_tree_planks": "Drachenbaumbretter", + "block.betterend.dragon_tree_plate": "Drachenbaumdruckplatte", + "block.betterend.dragon_tree_sign": "Drachenbaumschild", + "block.betterend.dragon_tree_slab": "Drachenbaumstufe", + "block.betterend.dragon_tree_stairs": "Drachenbaumtreppe", + "block.betterend.dragon_tree_stripped_bark": "Entrindetes Drachenbaumholz", + "block.betterend.dragon_tree_stripped_log": "Entrindeter Drachenbaumstamm", + "block.betterend.dragon_tree_trapdoor": "Drachenbaumfalltür", + + "biome.betterend.shadow_forest": "Schattenwald", + "block.betterend.dragon_tree_leaves": "Drachenbaumlaub", + "block.betterend.dragon_tree_sapling": "Drachenbaumsetzling", + "block.betterend.shadow_grass": "Schattengras", + "block.betterend.shadow_grass_path": "Schattengraspfad", + "block.betterend.shadow_plant": "Schattenpflanze", + + "block.betterend.dragon_tree_bookshelf": "Drachenbaumbücherregal", + "block.betterend.end_lotus_bookshelf": "Endlotusbücherregal", + "block.betterend.lacugrove_bookshelf": "Seemangrovenbücherregal", + "block.betterend.mossy_glowshroom_bookshelf": "Bemoostes Glühpilzbücherregal", + "block.betterend.pythadendron_bookshelf": "Pythadendronbücherregal", + + "block.betterend.murkweed": "Trübkraut", + "block.betterend.needlegrass": "Nadelgras", + "block.betterend.twisted_vine": "Zwirbelranke", + + "block.betterend.shadow_berry": "Schattenbeersamen", + "item.betterend.shadow_berry_cooked": "Gebratene Schattenbeere", + "item.betterend.shadow_berry_raw": "Schattenbeere", + "block.betterend.purple_polypore": "Violetter Porling", + + "block.betterend.cyan_moss": "Türkises Moos", + "block.betterend.tail_moss": "Schweifmoos", + + "block.betterend.flavolite_lantern": "Flavolitlaterne", + "block.betterend.end_stone_lantern": "Endsteinlaterne", + "block.betterend.violecite_lantern": "Violezitlaterne", + + "entity.betterend.end_fish": "Endfisch", + "entity.betterend.shadow_walker": "Schattenwanderer", + "item.betterend.spawn_egg_shadow_walker": "Schattenwanderer-Spawn-Ei", + + "block.betterend.andesite_lantern": "Andesitlaterne", + "block.betterend.blackstone_lantern": "Schwarzsteinlaterne", + "block.betterend.diorite_lantern": "Dioritlaterne", + "block.betterend.granite_lantern": "Granitlaterne", + "block.betterend.purpur_lantern": "Purpurlaterne", + "block.betterend.quartz_lantern": "Quarzlaterne", + + "item.betterend.bucket_end_fish": "Endfischeimer", + "item.betterend.end_fish_cooked": "Gebratener Endfisch", + "item.betterend.end_fish_raw": "Endfisch", + + "biome.betterend.amber_land": "Bernsteinland", + "biome.betterend.blossoming_spires": "Blühende Türme", + "block.betterend.amber_grass": "Bernsteingras", + "block.betterend.amber_grass_path": "Bernsteingraspfad", + "block.betterend.tenanea_bark": "Tenaneaholz", + "block.betterend.tenanea_barrel": "Tenaneafass", + "block.betterend.tenanea_bookshelf": "Tenaneabücherregal", + "block.betterend.tenanea_button": "Tenaneaknopf", + "block.betterend.tenanea_chest": "Tenaneatruhe", + "block.betterend.tenanea_crafting_table": "Tenaneawerkbank", + "block.betterend.tenanea_door": "Tenaneatür", + "block.betterend.tenanea_fence": "Tenaneazaun", + "block.betterend.tenanea_gate": "Tenaneazauntor", + "block.betterend.tenanea_ladder": "Tenanealeiter", + "block.betterend.tenanea_leaves": "Tenanealaub", + "block.betterend.tenanea_log": "Tenaneastamm", + "block.betterend.tenanea_planks": "Tenaneabretter", + "block.betterend.tenanea_plate": "Tenaneadruckplatte", + "block.betterend.tenanea_sapling": "Tenaneasetzling", + "block.betterend.tenanea_sign": "Tenaneaschild", + "block.betterend.tenanea_slab": "Tenaneastufe", + "block.betterend.tenanea_stairs": "Tenaneatreppe", + "block.betterend.tenanea_stripped_bark": "Entrindetes Tenaneaholz", + "block.betterend.tenanea_stripped_log": "Entrindeter Tenaneastamm", + "block.betterend.tenanea_trapdoor": "Tenaneafalltür", + + "block.betterend.amber_block": "Bernsteinblock", + "block.betterend.amber_ore": "Bernsteinerz", + "item.betterend.amber_gem": "Bernsteinjuwel", + "item.betterend.raw_amber": "Roher Bernstein", + "block.betterend.tenanea_flowers": "Tenaneablumen", + "block.betterend.tenanea_outer_leaves": "Äußeres Tenanealaub", + + "block.betterend.pink_moss": "Pinkes Moos", + "block.betterend.pink_moss_path": "Pinker Moospfad", + + "block.betterend.twisted_moss": "Zwirbelmoos", + + "block.betterend.bulb_vine": "Knollenranke", + "block.betterend.bulb_vine_seed": "Knollenrankensamen", + "item.betterend.glowing_bulb": "Glühende Knolle", + + "block.betterend.iron_bulb_lantern": "Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_black": "Schwarze Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_blue": "Blaue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_brown": "Braune Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_cyan": "Türkise Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_gray": "Graue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_green": "Grüne Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_light_blue": "Hellblaue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_light_gray": "Hellgraue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_lime": "Hellgrüne Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_magenta": "Magenta Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_orange": "Orangene Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_pink": "Pinke Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_purple": "Violette Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_red": "Rote Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_white": "Weiße Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_yellow": "Gelbe Eisenknollenlaterne", + + "block.betterend.gold_bulb_lantern": "Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_black": "Schwarze Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_blue": "Blaue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_brown": "Braune Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_cyan": "Türkise Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_gray": "Graue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_green": "Grüne Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_light_blue": "Hellblaue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_light_gray": "Hellgraue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_lime": "Hellgrüne Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_magenta": "Magenta Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_orange": "Orangene Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_pink": "Pinke Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_purple": "Violette Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_red": "Rote Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_white": "Weiße Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_yellow": "Gelbe Goldknollenlaterne", + + "block.betterend.thallasium_bulb_lantern": "Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_black": "Schwarze Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_blue": "Blaue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_brown": "Braune Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_cyan": "Türkise Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_gray": "Graue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_green": "Grüne Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_light_blue": "Hellblaue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_light_gray": "Hellgraue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_lime": "Hellgrüne Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_magenta": "Magenta Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_orange": "Orangene Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_pink": "Pinke Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_purple": "Violette Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_red": "Rote Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_white": "Weiße Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_yellow": "Gelbe Thallasiumknollenlaterne", + + "block.betterend.bushy_grass": "Buschiges Gras", + + "block.betterend.brimstone": "Schwefelrandstein", + "block.betterend.sulphuric_rock": "Schwefelgestein", + "block.betterend.sulphuric_rock_bricks": "Schwefelsteinziegel", + "block.betterend.sulphuric_rock_bricks_slab": "Schwefelsteinziegelstufe", + "block.betterend.sulphuric_rock_bricks_stairs": "Schwefelsteinziegeltreppe", + "block.betterend.sulphuric_rock_bricks_wall": "Schwefelsteinziegelmauer", + "block.betterend.sulphuric_rock_button": "Schwefelsteinknopf", + "block.betterend.sulphuric_rock_lantern": "Schwefelsteinlaterne", + "block.betterend.sulphuric_rock_pedestal": "Schwefelsteinsockel", + "block.betterend.sulphuric_rock_pillar": "Schwefelsteinsäule", + "block.betterend.sulphuric_rock_plate": "Schwefelsteindruckplatte", + "block.betterend.sulphuric_rock_polished": "Poliertes Schwefelgestein", + "block.betterend.sulphuric_rock_slab": "Schwefelsteinstufe", + "block.betterend.sulphuric_rock_stairs": "Schwefelsteintreppe", + "block.betterend.sulphuric_rock_tiles": "Schwefelsteinfliesen", + "block.betterend.sulphuric_rock_wall": "Schwefelsteinmauer", + "block.betterend.sulphur_crystal": "Schwefelkristall", + "item.betterend.crystalline_sulphur": "Schwefel", + + "biome.betterend.sulphur_springs": "Schwefelquellen", + "block.betterend.hydralux_petal_block": "Hydraluxblüttenblattblock", + "block.betterend.hydralux_petal_block_black": "Schwarzer Blüttenblattblock", + "block.betterend.hydralux_petal_block_blue": "Blauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_brown": "Brauner Blüttenblattblock", + "block.betterend.hydralux_petal_block_cyan": "Türkiser Blüttenblattblock", + "block.betterend.hydralux_petal_block_gray": "Grauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_green": "Grüner Blüttenblattblock", + "block.betterend.hydralux_petal_block_light_blue": "Hellblauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_light_gray": "Hellgrauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_lime": "Hellgrüner Blüttenblattblock", + "block.betterend.hydralux_petal_block_magenta": "Magenta Blüttenblattblock", + "block.betterend.hydralux_petal_block_orange": "Orangener Blüttenblattblock", + "block.betterend.hydralux_petal_block_pink": "Pinker Blüttenblattblock", + "block.betterend.hydralux_petal_block_purple": "Violetter Blüttenblattblock", + "block.betterend.hydralux_petal_block_red": "Roter Blüttenblattblock", + "block.betterend.hydralux_petal_block_white": "Weißer Blüttenblattblock", + "block.betterend.hydralux_petal_block_yellow": "Gelber Blüttenblattblock", + "block.betterend.hydralux_sapling": "Hydraluxsetzling", + "block.betterend.hydrothermal_vent": "Hydrothermalquelle", + "item.betterend.hydralux_petal": "Hydraluxblütenblatt", + "item.betterend.enchanted_petal": "Verzaubertes Blütenblatt", + + "block.betterend.menger_sponge": "Mengerschwamm", + "block.betterend.menger_sponge_wet": "Nasser Mengerschwamm", + "block.betterend.tube_worm": "Röhrenwurm", + + "block.betterend.charnia_cyan": "Türkises Charnia", + "block.betterend.charnia_light_blue": "Hellblaues Charnia", + "block.betterend.charnia_orange": "Orangenes Charnia", + "block.betterend.charnia_purple": "Violettes Charnia", + "block.betterend.charnia_red": "Rotes Charnia", + + "entity.betterend.cubozoa": "Cubozoa", + "item.betterend.spawn_egg_cubozoa": "Cubozoa-Spawn-Ei", + + "item.betterend.gelatine": "Gelatine", + "item.betterend.sweet_berry_jelly": "Süßbeerengelee", + "item.betterend.shadow_berry_jelly": "Schwarzbeerengelee", + + "block.betterend.amber_moss": "Bernsteinmoos", + "block.betterend.amber_moss_path": "Bernsteinmoospfad", + "block.betterend.helix_tree_bark": "Spiralbaumholz", + "block.betterend.helix_tree_barrel": "Spiralbaumfass", + "block.betterend.helix_tree_bookshelf": "Spiralbaumbücherregal", + "block.betterend.helix_tree_button": "Spiralbaumknopf", + "block.betterend.helix_tree_chest": "Spiralbaumtruhe", + "block.betterend.helix_tree_crafting_table": "Spiralbaumwerkbank", + "block.betterend.helix_tree_door": "Spiralbaumtür", + "block.betterend.helix_tree_fence": "Spiralbaumzaun", + "block.betterend.helix_tree_gate": "Spiralbaumzauntor", + "block.betterend.helix_tree_ladder": "Spiralbaumleiter", + "block.betterend.helix_tree_leaves": "Spiralbaumlaub", + "block.betterend.helix_tree_log": "Spiralbaumstamm", + "block.betterend.helix_tree_planks": "Spiralbaumbretter", + "block.betterend.helix_tree_plate": "Spiralbaumdruckplatte", + "block.betterend.helix_tree_sapling": "Spiralbaumsetzling", + "block.betterend.helix_tree_sign": "Spiralbaumschild", + "block.betterend.helix_tree_slab": "Spiralbaumstufe", + "block.betterend.helix_tree_stairs": "Spiralbaumtreppe", + "block.betterend.helix_tree_stripped_bark": "Entrindetes Spiralbaumholz", + "block.betterend.helix_tree_stripped_log": "Entrindeter Spiralbaumstamm", + "block.betterend.helix_tree_trapdoor": "Spiralbaumfalltür", + "block.betterend.lanceleaf": "Lanzenblatt", + "block.betterend.lanceleaf_seed": "Lanzenblattsamen", + "block.betterend.hydralux": "Hydralux", + "block.betterend.helix_tree_luminophor": "Spiralbaumluminophor", + + "block.betterend.glowing_pillar_leaves": "Glühsäulenlaub", + "block.betterend.glowing_pillar_luminophor": "Glühsäulenluminophor", + "block.betterend.glowing_pillar_roots": "Glühsäulenwurzeln", + "block.betterend.glowing_pillar_seed": "Glühsäulensamen", + + "biome.betterend.ice_starfield": "Eissternfeld", + + "block.betterend.ancient_emerald_ice": "Antikes Smaragdeis", + "block.betterend.dense_emerald_ice": "Dichtes Smaragdeis", + "block.betterend.dense_snow": "Dichter Schnee", + "block.betterend.emerald_ice": "Smaragdeis", + + "block.betterend.bulb_moss": "Knollenmoos", + + "block.betterend.charnia_green": "Grünes Charnia", + "block.betterend.vent_bubble_column": "Blasenquellensäule", + "block.betterend.respawn_obelisk": "Rücksetzobelisk", + "message.betterend.set_spawn": "\u00A7b\u00A7lWiedereinstiegspunkt gesetzt", + "message.betterend.fail_spawn": "\u00A7c\u00A7lDu musst 6 Bernsteinjuwele in der Hand halten, um deinen Einstiegspunkt zu setzen.", + + "block.betterend.dragon_tree_composter": "Drachenbaumkomposter", + "block.betterend.end_lotus_composter": "Endlotuskomposter", + "block.betterend.helix_tree_composter": "Spiralbaumkomposter", + "block.betterend.lacugrove_composter": "Seemangrovenkomposter", + "block.betterend.mossy_glowshroom_composter": "Bemooster Glühpilzkomposter", + "block.betterend.pythadendron_composter": "Pythadendronkomposter", + "block.betterend.tenanea_composter": "Tenaneakomposter", + + "biome.betterend.old_bulbis_gardens": "Alte Knollengärten", + "block.betterend.ivis_moss": "Efeumoos", + "block.betterend.ivis_vine": "Efeuranke", + "block.betterend.silk_moth_nest": "Seidenmottennest", + + "block.betterend.umbrella_tree_bark": "Schirmbaumholz", + "block.betterend.umbrella_tree_barrel": "Schirmbaumfass", + "block.betterend.umbrella_tree_bookshelf": "Schirmbaumbücherregal", + "block.betterend.umbrella_tree_button": "Schirmbaumknopf", + "block.betterend.umbrella_tree_chest": "Schirmbaumtruhe", + "block.betterend.umbrella_tree_composter": "Schirmbaumkomposter", + "block.betterend.umbrella_tree_crafting_table": "Schirmbaumwerkbank", + "block.betterend.umbrella_tree_door": "Schirmbaumtür", + "block.betterend.umbrella_tree_fence": "Schirmbaumzaun", + "block.betterend.umbrella_tree_gate": "Schirmbaumzauntor", + "block.betterend.umbrella_tree_ladder": "Schirmbaumleiter", + "block.betterend.umbrella_tree_log": "Schirmbaumstamm", + "block.betterend.umbrella_tree_planks": "Schirmbaumbretter", + "block.betterend.umbrella_tree_plate": "Schirmbaumdruckplatte", + "block.betterend.umbrella_tree_sign": "Schirmbaumschild", + "block.betterend.umbrella_tree_slab": "Schirmbaumstufe", + "block.betterend.umbrella_tree_stairs": "Schirmbaumtreppe", + "block.betterend.umbrella_tree_stripped_bark": "Entrindetes Schirmbaumholz", + "block.betterend.umbrella_tree_stripped_log": "Entrindeter Schirmbaumstamm", + "block.betterend.umbrella_tree_trapdoor": "Schirmbaumfalltür", + "block.betterend.umbrella_tree_membrane": "Schirmbaummembran", + + "biome.betterend.umbrella_jungle": "Schirmdschungel", + "block.betterend.jungle_grass": "Dschungelgras", + "block.betterend.jungle_moss": "Dschungelmoos", + "block.betterend.jungle_moss_path": "Dschungelmoospfad", + "block.betterend.small_jellyshroom": "Kleiner Geleepilz", + "block.betterend.twisted_umbrella_moss": "Zwirbelschirmmoos", + "block.betterend.twisted_umbrella_moss_tall": "Großes Zwirbelschirmmoos", + "block.betterend.umbrella_tree_cluster": "Schirmtraube", + "block.betterend.umbrella_tree_cluster_empty": "Leere Schirmtrauben", + "block.betterend.jungle_vine": "Dschungelranke", + "block.betterend.jungle_fern": "Dschungelfarn", + + "block.betterend.jellyshroom_bark": "Geleepilzholz", + "block.betterend.jellyshroom_barrel": "Geleepilzfass", + "block.betterend.jellyshroom_bookshelf": "Geleepilzbücherregal", + "block.betterend.jellyshroom_button": "Geleepilzknopf", + "block.betterend.jellyshroom_cap_purple": "Violette Geleepilzkappe", + "block.betterend.jellyshroom_chest": "Geleepilztruhe", + "block.betterend.jellyshroom_composter": "Geleepilzkomposter", + "block.betterend.jellyshroom_crafting_table": "Geleepilzwerkbank", + "block.betterend.jellyshroom_door": "Geleepilztür", + "block.betterend.jellyshroom_fence": "Geleepilzzaun", + "block.betterend.jellyshroom_gate": "Geleepilzzauntor", + "block.betterend.jellyshroom_ladder": "Geleepilzleiter", + "block.betterend.jellyshroom_log": "Geleepilzstamm", + "block.betterend.jellyshroom_planks": "Geleepilzbretter", + "block.betterend.jellyshroom_plate": "Geleepilzdruckplatte", + "block.betterend.jellyshroom_sign": "Geleepilzschild", + "block.betterend.jellyshroom_slab": "Geleepilzstufe", + "block.betterend.jellyshroom_stairs": "Geleepilztreppe", + "block.betterend.jellyshroom_stripped_bark": "Entrindetes Geleepilzholz", + "block.betterend.jellyshroom_stripped_log": "Entrindeter Geleepilzstamm", + "block.betterend.jellyshroom_trapdoor": "Geleepilzfalltür", + + "biome.betterend.eterial_grove": "Äthermangrove", + "block.betterend.umbrella_tree_sapling": "Schirmbaumsetzling", + "item.betterend.umbrella_cluster_juice": "Schirmtraubensaft", + "block.betterend.blossom_berry_seed": "Blütenbeerensamen", + "item.betterend.blossom_berry": "Blütenbeere", + + "biome.betterend.nightshade_redwoods": "Nachtschattenrotwald", + "block.betterend.nightshade_moss": "Nachtschattenmoos", + + "biome.betterend.glowing_grasslands": "Glühende Wiesen", + "block.betterend.blooming_cooksonia": "Blühende Cooksonia", + "block.betterend.fracturn": "Fraktur", + "block.betterend.lumecorn": "Maislicht", + "block.betterend.salteago": "Salzeago", + "block.betterend.vaiolush_fern": "Vaiosatt Farn", + "entity.betterend.silk_moth": "Seidenmotte", + "item.betterend.silk_fiber": "Seidenfaser", + "item.betterend.spawn_egg_silk_moth": "Seidenmotten-Spawn-Ei", + + "block.betterend.thallasium_ore": "Thallasiumerz", + "item.betterend.thallasium_axe": "Thallasiumaxt", + "item.betterend.thallasium_hoe": "Thallasiumhacke", + "item.betterend.thallasium_ingot": "Thallasiumbarren", + "item.betterend.thallasium_pickaxe": "Thallasiumspitzhacke", + "item.betterend.thallasium_shovel": "Thallasiumschaufel", + "item.betterend.thallasium_sword": "Thallasiumschwert", + "block.betterend.thallasium_block": "Thallasiumblock", + + "block.betterend.thallasium_bars": "Thallasiumgitter", + "block.betterend.thallasium_door": "Thallasiumtür", + "block.betterend.thallasium_plate": "Thallasiumdruckplatte", + "block.betterend.thallasium_tile": "Thallasiumfliesen", + "block.betterend.thallasium_trapdoor": "Thallasiumfalltür", + + "block.betterend.lumecorn_seed": "Maislichtsamen", + "item.betterend.lumecorn_rod": "Maislichtstange", + "block.betterend.thallasium_chandelier": "Thallasiumkronleuchter", + + "block.betterend.thallasium_anvil": "Thallasiumamboss", + "block.betterend.thallasium_chain": "Thallasiumkette", + "block.betterend.thallasium_slab": "Thallasiumstufe", + "block.betterend.thallasium_stairs": "Thallasiumtreppe", + + "block.betterend.gold_chandelier": "Goldkronleuchter", + "block.betterend.iron_chandelier": "Eisenkronleuchter", + "item.betterend.thallasium_nugget": "Thallasiumklumpen", + + "block.betterend.terminite_anvil": "Terminitamboss", + "block.betterend.terminite_bars": "Terminitgitter", + + "block.betterend.terminite_bulb_lantern": "Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_black": "Schwarze Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_blue": "Blaue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_brown": "Braune Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_cyan": "Türkise Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_gray": "Graue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_green": "Green Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_blue": "Hellblaue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_light_gray": "Hellgraue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_lime": "Hellgrüne Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_magenta": "Magenta Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_orange": "Orangene Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_pink": "Pinke Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_purple": "Violette Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_red": "Rote Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_white": "Weiße Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_yellow": "Gelbe Terminitknollenlaterne", + + "block.betterend.terminite_chain": "Terminitkette", + "block.betterend.terminite_chandelier": "Terminitkronleuchter", + "block.betterend.terminite_door": "Terminittür", + "block.betterend.terminite_plate": "Terminitdruckplatte", + "block.betterend.terminite_slab": "Terminitstufe", + "block.betterend.terminite_stairs": "Terminittreppe", + "block.betterend.terminite_tile": "Terminitfliesen", + "block.betterend.terminite_trapdoor": "Terminitfalltür", + "item.betterend.terminite_nugget": "Terminitklumpen", + "item.betterend.thallasium_boots": "Thallasiumstiefel", + "item.betterend.thallasium_chestplate": "Thallasiumharnisch", + "item.betterend.thallasium_hammer": "Thallasiumschmiedehammer", + "item.betterend.thallasium_helmet": "Thallasiumhelm", + "item.betterend.thallasium_leggings": "Thallasiumbeinschutz", + "block.betterend.missing_tile": "Fehlende Fliesen", + "block.betterend.charcoal_block": "Holzkohleblock", + "block.betterend.end_stone_furnace": "Endsteinofen", + "block.betterend.flavolite_furnace": "Flavolitofen", + "block.betterend.sulphuric_rock_furnace": "Schwefelsteinofen", + "block.betterend.violecite_furnace": "Violezitofen", + + "item.betterend.terminite_axe_head": "Terminitaxtkopf", + "item.betterend.terminite_hoe_head": "Terminithackenkopf", + "item.betterend.terminite_pickaxe_head": "Terminitspitzhackenkopf", + "item.betterend.terminite_shovel_head": "Terminitschaufelkopf", + "item.betterend.terminite_sword_blade": "Terminitschwertklinge", + "item.betterend.terminite_sword_handle": "Terminitschwertgriff", + "item.betterend.thallasium_axe_head": "Thallasiumaxtkopf", + "item.betterend.thallasium_hoe_head": "Thallasiumhackenkopf", + "item.betterend.thallasium_pickaxe_head": "Thallasiumspitzhackenkopf", + "item.betterend.thallasium_shovel_head": "Thallasiumschaufelkopf", + "item.betterend.thallasium_sword_blade": "Thallasiumschwertklinge", + "item.betterend.thallasium_sword_handle": "Thallasiumschwertgriff", + "block.betterend.aeternium_anvil": "Ätheramboss" +} diff --git a/src/main/resources/assets/betterend/lang/en_gb.json b/src/main/resources/assets/betterend/lang/en_gb.json index b52aab43..86da4ef1 100644 --- a/src/main/resources/assets/betterend/lang/en_gb.json +++ b/src/main/resources/assets/betterend/lang/en_gb.json @@ -17,4 +17,26 @@ "block.betterend.sulphur_crystal": "Sulphur Crystal", "item.betterend.crystalline_sulphur": "Sulphur", "biome.betterend.sulphur_springs": "Sulphur Springs", + + "block.betterend.mossy_glowshroom_stripped_bark": "Striped Mossy Glowshroom Bark", + "block.betterend.mossy_glowshroom_stripped_log": "Striped Mossy Glowshroom Log", + "block.betterend.pythadendron_stripped_bark": "Striped Pythadendron Bark", + "block.betterend.pythadendron_stripped_log": "Striped Pythadendron Log", + "block.betterend.end_lotus_stripped_bark": "Striped End Lotus Bark", + "block.betterend.end_lotus_stripped_log": "Striped End Lotus Log", + "block.betterend.lacugrove_stripped_bark": "Striped Lacugrove Bark", + "block.betterend.lacugrove_stripped_log": "Striped Lacugrove Log", + "block.betterend.dragon_tree_stripped_bark": "Striped Dragon Tree Bark", + "block.betterend.dragon_tree_stripped_log": "Striped Dragon Tree Log", + "block.betterend.tenanea_stripped_bark": "Striped Tenanea Bark", + "block.betterend.tenanea_stripped_log": "Striped Tenanea Log", + "block.betterend.helix_tree_stripped_bark": "Striped Helix Tree Bark", + "block.betterend.helix_tree_stripped_log": "Striped Helix Tree Log", + "block.betterend.umbrella_tree_stripped_bark": "Striped Umbrella Tree Bark", + "block.betterend.umbrella_tree_stripped_log": "Striped Umbrella Tree Log", + "block.betterend.jellyshroom_stripped_bark": "Striped Jellyshroom Bark", + "block.betterend.jellyshroom_stripped_log": "Striped Jellyshroom Log", + "block.betterend.sulphuric_rock_furnace": "Sulphuric Rock Furnace", + "block.betterend.lucernia_stripped_bark": "Striped Lucernia Bark", + "block.betterend.lucernia_stripped_log": "Striped Lucernia Log" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 90eaae35..1e938f91 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -66,17 +66,27 @@ "item.betterend.crystalite_chestplate": "Crystalite Chestplate", "item.betterend.crystalite_helmet": "Crystalite Helmet", "item.betterend.crystalite_leggings": "Crystalite Leggings", + "item.betterend.aeternium_axe_head": "Aeternium Axe Head", + "item.betterend.aeternium_hammer_head": "Aeternium Hammer Head", + "item.betterend.aeternium_hoe_head": "Aeternium Hoe Head", + "item.betterend.aeternium_pickaxe_head": "Aeternium Pickaxe Head", + "item.betterend.aeternium_shovel_head": "Aeternium Shovel Head", + "item.betterend.aeternium_sword_blade": "Aeternium Sword Blade", + "item.betterend.aeternium_sword_handle": "Aeternium Sword Handle", + "item.betterend.leather_stripe": "Leather Stripe", + "item.betterend.leather_wrapped_stick": "Leather Wrapped Stick", + "item.betterend.elytra_armored": "Armored Elytra", "effect.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil", - "item.minecraft.potion.effect.end_veil": "Potion of End Veil", - "item.minecraft.potion.effect.long_end_veil": "Potion of End Veil", - "item.minecraft.splash_potion.effect.end_veil": "Splash potion of End Veil", - "item.minecraft.splash_potion.effect.long_end_veil": "Splash potion of End Veil", - "item.minecraft.lingering_potion.effect.end_veil": "Lingering potion of End Veil", - "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering potion of End Veil", - "item.minecraft.tipped_arrow.effect.end_veil": "Arrow of End Veil", - "item.minecraft.tipped_arrow.effect.long_end_veil": "Arrow of End Veil", + "item.minecraft.potion.effect.end_veil": "Potion Of End Veil", + "item.minecraft.potion.effect.long_end_veil": "Potion Of End Veil", + "item.minecraft.splash_potion.effect.end_veil": "Splash Potion Of End Veil", + "item.minecraft.splash_potion.effect.long_end_veil": "Splash Potion Of End Veil", + "item.minecraft.lingering_potion.effect.end_veil": "Lingering Potion Of End Veil", + "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering Potion Of End Veil", + "item.minecraft.tipped_arrow.effect.end_veil": "Arrow Of End Veil", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Arrow Of End Veil", "block.betterend.mossy_glowshroom_sapling": "Mossy Glowshroom Sapling", "block.betterend.mossy_glowshroom_cap": "Mossy Glowshroom Cap", @@ -306,7 +316,8 @@ "block.betterend.purpur_lantern": "Purpur Lantern", "block.betterend.quartz_lantern": "Quartz Lantern", - "item.betterend.bucket_end_fish": "End Fish Bucket", + "item.betterend.bucket_end_fish": "Bucket of End Fish", + "item.betterend.bucket_cubozoa": "Bucket of Cubozoa", "item.betterend.end_fish_cooked": "Cooked End Fish", "item.betterend.end_fish_raw": "End Fish", @@ -349,26 +360,44 @@ "block.betterend.twisted_moss": "Twisted Moss", "block.betterend.bulb_vine": "Bulb Vine", - "block.betterend.bulb_lantern": "Bulb Lantern", "block.betterend.bulb_vine_seed": "Bulb Vine Seed", "item.betterend.glowing_bulb": "Glowing Bulb", - "block.betterend.bulb_lantern_black": "Black Bulb Lantern", - "block.betterend.bulb_lantern_blue": "Blue Bulb Lantern", - "block.betterend.bulb_lantern_brown": "Brown Bulb Lantern", - "block.betterend.bulb_lantern_cyan": "Cyan Bulb Lantern", - "block.betterend.bulb_lantern_gray": "Gray Bulb Lantern", - "block.betterend.bulb_lantern_green": "Green Bulb Lantern", - "block.betterend.bulb_lantern_light_blue": "Light Blue Bulb Lantern", - "block.betterend.bulb_lantern_light_gray": "Light Gray Bulb Lantern", - "block.betterend.bulb_lantern_lime": "Lime Bulb Lantern", - "block.betterend.bulb_lantern_magenta": "Magenta Bulb Lantern", - "block.betterend.bulb_lantern_orange": "Orange Bulb Lantern", - "block.betterend.bulb_lantern_pink": "Pink Bulb Lantern", - "block.betterend.bulb_lantern_purple": "Purple Bulb Lantern", - "block.betterend.bulb_lantern_red": "Red Bulb Lantern", - "block.betterend.bulb_lantern_white": "White Bulb Lantern", - "block.betterend.bulb_lantern_yellow": "Yellow Bulb Lantern", + "block.betterend.iron_bulb_lantern": "Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_black": "Black Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_blue": "Blue Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_brown": "Brown Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_cyan": "Cyan Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_gray": "Gray Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_green": "Green Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_light_blue": "Light Blue Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_light_gray": "Light Gray Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_lime": "Lime Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_magenta": "Magenta Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_orange": "Orange Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_pink": "Pink Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_purple": "Purple Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_red": "Red Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_white": "White Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_yellow": "Yellow Iron Bulb Lantern", + + "block.betterend.thallasium_bulb_lantern": "Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_black": "Black Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_blue": "Blue Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_brown": "Brown Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_cyan": "Cyan Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_gray": "Gray Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_green": "Green Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_light_blue": "Light Blue Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_light_gray": "Light Gray Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_lime": "Lime Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_magenta": "Magenta Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_orange": "Orange Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_pink": "Pink Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_purple": "Purple Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_red": "Red Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_white": "White Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_yellow": "Yellow Thallasium Bulb Lantern", "block.betterend.bushy_grass": "Bushy Grass", @@ -412,6 +441,7 @@ "block.betterend.hydralux_sapling": "Hydralux Sapling", "block.betterend.hydrothermal_vent": "Hydrothermal Vent", "item.betterend.hydralux_petal": "Hydralux Petal", + "item.betterend.enchanted_petal": "Enchanted Petal", "block.betterend.menger_sponge": "Menger Sponge", "block.betterend.menger_sponge_wet": "Wet Menger Sponge", @@ -511,5 +541,319 @@ "block.betterend.umbrella_tree_stripped_bark": "Stripped Umbrella Tree Bark", "block.betterend.umbrella_tree_stripped_log": "Stripped Umbrella Tree Log", "block.betterend.umbrella_tree_trapdoor": "Umbrella Tree Trapdoor", - "block.betterend.umbrella_tree_membrane": "Umbrella Tree Membrane" + "block.betterend.umbrella_tree_membrane": "Umbrella Tree Membrane", + + "biome.betterend.umbrella_jungle": "Umbrella Jungle", + "block.betterend.jungle_grass": "Jungle Grass", + "block.betterend.jungle_moss": "Jungle Moss", + "block.betterend.jungle_moss_path": "Jungle Moss Path", + "block.betterend.small_jellyshroom": "Small Jellyshroom", + "block.betterend.twisted_umbrella_moss": "Twisted Umbrella Moss", + "block.betterend.twisted_umbrella_moss_tall": "Twisted Umbrella Moss Tall", + "block.betterend.umbrella_tree_cluster": "Umbrella Tree Cluster", + "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster", + "block.betterend.jungle_vine": "Jungle Vine", + "block.betterend.jungle_fern": "Jungle Fern", + + "block.betterend.jellyshroom_bark": "Jellyshroom Bark", + "block.betterend.jellyshroom_barrel": "Jellyshroom Barrel", + "block.betterend.jellyshroom_bookshelf": "Jellyshroom Bookshelf", + "block.betterend.jellyshroom_button": "Jellyshroom Button", + "block.betterend.jellyshroom_cap_purple": "Purple Jellyshroom Cap", + "block.betterend.jellyshroom_chest": "Jellyshroom Chest", + "block.betterend.jellyshroom_composter": "Jellyshroom Composter", + "block.betterend.jellyshroom_crafting_table": "Jellyshroom Crafting Table", + "block.betterend.jellyshroom_door": "Jellyshroom Door", + "block.betterend.jellyshroom_fence": "Jellyshroom Fence", + "block.betterend.jellyshroom_gate": "Jellyshroom Gate", + "block.betterend.jellyshroom_ladder": "Jellyshroom Ladder", + "block.betterend.jellyshroom_log": "Jellyshroom Log", + "block.betterend.jellyshroom_planks": "Jellyshroom Planks", + "block.betterend.jellyshroom_plate": "Jellyshroom Pressure Plate", + "block.betterend.jellyshroom_sign": "Jellyshroom Sign", + "block.betterend.jellyshroom_slab": "Jellyshroom Slab", + "block.betterend.jellyshroom_stairs": "Jellyshroom Stairs", + "block.betterend.jellyshroom_stripped_bark": "Stripped Jellyshroom Bark", + "block.betterend.jellyshroom_stripped_log": "Stripped Jellyshroom Log", + "block.betterend.jellyshroom_trapdoor": "Jellyshroom Trapdoor", + + "biome.betterend.eterial_grove": "Eterial Grove", + "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling", + "item.betterend.umbrella_cluster_juice": "Umbrella Cluster Juice", + "block.betterend.blossom_berry_seed": "Blossom Berry Seed", + "item.betterend.blossom_berry": "Blossom Berry", + + "biome.betterend.nightshade_redwoods": "Nightshade Redwoods", + "block.betterend.nightshade_moss": "Nightshade Moss", + + "biome.betterend.glowing_grasslands": "Glowing Grasslands", + "block.betterend.blooming_cooksonia": "Blooming Cooksonia", + "block.betterend.fracturn": "Fracturn", + "block.betterend.lumecorn": "Lumecorn", + "block.betterend.salteago": "Salteago", + "block.betterend.vaiolush_fern": "Vaiolush Fern", + "entity.betterend.silk_moth": "Silk Moth", + "item.betterend.silk_fiber": "Silk Fiber", + "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg", + + "block.betterend.thallasium_ore": "Thallasium Ore", + "item.betterend.thallasium_axe": "Thallasium Axe", + "item.betterend.thallasium_hoe": "Thallasium Hoe", + "item.betterend.thallasium_ingot": "Thallasium Ingot", + "item.betterend.thallasium_pickaxe": "Thallasium Pickaxe", + "item.betterend.thallasium_shovel": "Thallasium Shovel", + "item.betterend.thallasium_sword": "Thallasium Sword", + "block.betterend.thallasium_block": "Thallasium Block", + + "block.betterend.thallasium_bars": "Thallasium Bars", + "block.betterend.thallasium_door": "Thallasium Door", + "block.betterend.thallasium_plate": "Thallasium Pressure Plate", + "block.betterend.thallasium_tile": "Thallasium Tile", + "block.betterend.thallasium_trapdoor": "Thallasium Trapdoor", + + "block.betterend.lumecorn_seed": "Lumecorn Seed", + "item.betterend.lumecorn_rod": "Lumecorn Rod", + "block.betterend.thallasium_chandelier": "Thallasium Chandelier", + + "block.betterend.thallasium_anvil": "Thallasium Anvil", + "block.betterend.thallasium_chain": "Thallasium Chain", + "block.betterend.thallasium_slab": "Thallasium Slab", + "block.betterend.thallasium_stairs": "Thallasium Stairs", + + "block.betterend.gold_chandelier": "Gold Chandelier", + "block.betterend.iron_chandelier": "Iron Chandelier", + "item.betterend.thallasium_nugget": "Thallasium Nugget", + + "block.betterend.terminite_anvil": "Terminite Anvil", + "block.betterend.terminite_bars": "Terminite Bars", + + "block.betterend.terminite_bulb_lantern": "Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_black": "Black Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_blue": "Blue Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_brown": "Brown Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_cyan": "Cyan Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_gray": "Gray Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_green": "Green Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_blue": "Light Blue Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_gray": "Light Gray Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_lime": "Lime Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_magenta": "Magenta Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_orange": "Orange Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_pink": "Pink Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_purple": "Purple Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_red": "Red Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_white": "White Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_yellow": "Yellow Terminite Bulb Lantern", + + "block.betterend.terminite_chain": "Terminite Chain", + "block.betterend.terminite_chandelier": "Terminite Chandelier", + "block.betterend.terminite_door": "Terminite Door", + "block.betterend.terminite_plate": "Terminite Pressure Plate", + "block.betterend.terminite_slab": "Terminite Slab", + "block.betterend.terminite_stairs": "Terminite Stairs", + "block.betterend.terminite_tile": "Terminite Tile", + "block.betterend.terminite_trapdoor": "Terminite Trapdoor", + "item.betterend.terminite_nugget": "Terminite Nugget", + "item.betterend.thallasium_boots": "Thallasium Boots", + "item.betterend.thallasium_chestplate": "Thallasium Chestplate", + "item.betterend.thallasium_hammer": "Thallasium Hammer", + "item.betterend.thallasium_helmet": "Thallasium Helmet", + "item.betterend.thallasium_leggings": "Thallasium Leggings", + "block.betterend.missing_tile": "Missing Tile", + "block.betterend.charcoal_block": "Charcoal Block", + "block.betterend.end_stone_furnace": "End Stone Furnace", + "block.betterend.flavolite_furnace": "Flavolite Furnace", + "block.betterend.sulphuric_rock_furnace": "Sulfuric Rock Furnace", + "block.betterend.violecite_furnace": "Violecite Furnace", + + "item.betterend.terminite_axe_head": "Terminite Axe Head", + "item.betterend.terminite_hoe_head": "Terminite Hoe Head", + "item.betterend.terminite_pickaxe_head": "Terminite Pickaxe Head", + "item.betterend.terminite_shovel_head": "Terminite Shovel Head", + "item.betterend.terminite_sword_blade": "Terminite Sword Blade", + "item.betterend.terminite_sword_handle": "Terminite Sword Handle", + "item.betterend.thallasium_axe_head": "Thallasium Axe Head", + "item.betterend.thallasium_hoe_head": "Thallasium Hoe Head", + "item.betterend.thallasium_pickaxe_head": "Thallasium Pickaxe Head", + "item.betterend.thallasium_shovel_head": "Thallasium Shovel Head", + "item.betterend.thallasium_sword_blade": "Thallasium Sword Blade", + "item.betterend.thallasium_sword_handle": "Thallasium Sword Handle", + "block.betterend.aeternium_anvil": "Aeternium Anvil", + + "biome.betterend.dragon_graveyards": "Dragon Graveyards", + "biome.betterend.dry_shrubland": "Dry Shrubland", + "block.betterend.aeridium": "Aeridium", + "block.betterend.amaranita_cap": "Amaranita Cap", + "block.betterend.amaranita_fur": "Amaranita Fur", + "block.betterend.amaranita_hymenophore": "Amaranita Hymenophore", + "block.betterend.amaranita_hyphae": "Amaranita Hyphae", + "block.betterend.amaranita_lantern": "Amaranita Lantern", + "block.betterend.amaranita_stem": "Amaranita Stem", + "block.betterend.clawfern": "Clawfern", + "block.betterend.globulagus": "Globulagus", + "block.betterend.lamellarium": "Lamellarium", + "block.betterend.large_amaranita_mushroom": "Large Amaranita Mushroom", + "block.betterend.lutebus": "Lutebus", + "block.betterend.mossy_bone": "Mossy Bone", + "block.betterend.mossy_obsidian": "Mossy Obsidian", + "block.betterend.orango": "Orango", + "block.betterend.rutiscus": "Rutiscus", + "block.betterend.rutiscus_path": "Rutiscus Path", + "block.betterend.sangnum": "Sangnum", + "block.betterend.sangnum_path": "Sangnum Path", + "block.betterend.small_amaranita_mushroom": "Small Amaranita Mushroom", + + "block.betterend.amber_root_seed": "Amber Root Seed", + "block.betterend.azure_jadestone": "Azure Jadestone", + "block.betterend.azure_jadestone_bricks": "Azure Jadestone Bricks", + "block.betterend.azure_jadestone_bricks_slab": "Azure Jadestone Bricks Slab", + "block.betterend.azure_jadestone_bricks_stairs": "Azure Jadestone Bricks Stairs", + "block.betterend.azure_jadestone_bricks_wall": "Azure Jadestone Bricks Wall", + "block.betterend.azure_jadestone_button": "Azure Jadestone Button", + "block.betterend.azure_jadestone_furnace": "Azure Jadestone Furnace", + "block.betterend.azure_jadestone_lantern": "Azure Jadestone Lantern", + "block.betterend.azure_jadestone_pedestal": "Azure Jadestone Pedestal", + "block.betterend.azure_jadestone_pillar": "Azure Jadestone Pillar", + "block.betterend.azure_jadestone_plate": "Azure Jadestone Pressure Plate", + "block.betterend.azure_jadestone_polished": "Azure Jadestone Polished", + "block.betterend.azure_jadestone_slab": "Azure Jadestone Slab", + "block.betterend.azure_jadestone_stairs": "Azure Jadestone Stairs", + "block.betterend.azure_jadestone_tiles": "Azure Jadestone Tiles", + "block.betterend.azure_jadestone_wall": "Azure Jadestone Wall", + "block.betterend.chorus_mushroom_seed": "Chorus Mushroom Seed", + "block.betterend.end_stone_stalactite": "End Stone Stalactite", + "block.betterend.end_stone_stalactite_cavemoss": "Cave Moss Endstone Stalactite", + "block.betterend.pearlberry_seed": "Pearlberry Seed", + "block.betterend.rubinea": "Rubinea", + "block.betterend.sandy_jadestone": "Sandy Jadestone", + "block.betterend.sandy_jadestone_bricks": "Sandy Jadestone Bricks", + "block.betterend.sandy_jadestone_bricks_slab": "Sandy Jadestone Bricks Slab", + "block.betterend.sandy_jadestone_bricks_stairs": "Sandy Jadestone Bricks Stairs", + "block.betterend.sandy_jadestone_bricks_wall": "Sandy Jadestone Bricks Wall", + "block.betterend.sandy_jadestone_button": "Sandy Jadestone Button", + "block.betterend.sandy_jadestone_furnace": "Sandy Jadestone Furnace", + "block.betterend.sandy_jadestone_lantern": "Sandy Jadestone Lantern", + "block.betterend.sandy_jadestone_pedestal": "Sandy Jadestone Pedestal", + "block.betterend.sandy_jadestone_pillar": "Sandy Jadestone Pillar", + "block.betterend.sandy_jadestone_plate": "Sandy Jadestone Pressure Plate", + "block.betterend.sandy_jadestone_polished": "Sandy Jadestone Polished", + "block.betterend.sandy_jadestone_slab": "Sandy Jadestone Slab", + "block.betterend.sandy_jadestone_stairs": "Sandy Jadestone Stairs", + "block.betterend.sandy_jadestone_tiles": "Sandy Jadestone Tiles", + "block.betterend.sandy_jadestone_wall": "Sandy Jadestone Wall", + "block.betterend.smaragdant_crystal": "Smaragdant Crystal", + "block.betterend.smaragdant_crystal_shard": "Smaragdant Crystal Shard", + "block.betterend.virid_jadestone": "Virid Jadestone", + "block.betterend.virid_jadestone_bricks": "Virid Jadestone Bricks", + "block.betterend.virid_jadestone_bricks_slab": "Virid Jadestone Bricks Slab", + "block.betterend.virid_jadestone_bricks_stairs": "Virid Jadestone Bricks Stairs", + "block.betterend.virid_jadestone_bricks_wall": "Virid Jadestone Bricks Wall", + "block.betterend.virid_jadestone_button": "Virid Jadestone Button", + "block.betterend.virid_jadestone_furnace": "Virid Jadestone Furnace", + "block.betterend.virid_jadestone_lantern": "Virid Jadestone Lantern", + "block.betterend.virid_jadestone_pedestal": "Virid Jadestone Pedestal", + "block.betterend.virid_jadestone_pillar": "Virid Jadestone Pillar", + "block.betterend.virid_jadestone_plate": "Virid Jadestone Pressure Plate", + "block.betterend.virid_jadestone_polished": "Virid Jadestone Polished", + "block.betterend.virid_jadestone_slab": "Virid Jadestone Slab", + "block.betterend.virid_jadestone_stairs": "Virid Jadestone Stairs", + "block.betterend.virid_jadestone_tiles": "Virid Jadestone Tiles", + "block.betterend.virid_jadestone_wall": "Virid Jadestone Wall", + "item.betterend.amber_root_raw": "Raw Amber Root", + "item.betterend.chorus_mushroom_cooked": "Cooked Chorus Mushroom", + "item.betterend.chorus_mushroom_raw": "Raw Chorus Mushroom", + + "biome.betterend.empty_aurora_cave": "Empty Aurora Cave", + "biome.betterend.empty_end_cave": "Empty End Cave", + "biome.betterend.empty_smaragdant_cave": "Empty Smaragdant Cave", + "biome.betterend.lush_aurora_cave": "Lush Aurora Cave", + "biome.betterend.lush_smaragdant_cave": "Lush Smaragdant Cave", + + "block.betterend.dragon_bone_block": "Dragon Bone Block", + "block.betterend.dragon_bone_slab": "Dragon Bone Slab", + "block.betterend.dragon_bone_stairs": "Dragon Bone Stairs", + "block.betterend.mossy_dragon_bone": "Mossy Dragon Bone", + + "biome.betterend.lantern_woods": "Lantern Woods", + "block.betterend.filalux": "Filalux", + "block.betterend.filalux_lantern": "Filalux Lantern", + "block.betterend.filalux_wings": "Filalux Wings", + "block.betterend.lucernia_bark": "Lucernia Bark", + "block.betterend.lucernia_barrel": "Lucernia Barrel", + "block.betterend.lucernia_bookshelf": "Lucernia Bookshelf", + "block.betterend.lucernia_button": "Lucernia Button", + "block.betterend.lucernia_chest": "Lucernia Chest", + "block.betterend.lucernia_composter": "Lucernia Composter", + "block.betterend.lucernia_crafting_table": "Lucernia Crafting Table", + "block.betterend.lucernia_door": "Lucernia Door", + "block.betterend.lucernia_fence": "Lucernia Fence", + "block.betterend.lucernia_gate": "Lucernia Gate", + "block.betterend.lucernia_ladder": "Lucernia Ladder", + "block.betterend.lucernia_leaves": "Lucernia Leaves", + "block.betterend.lucernia_log": "Lucernia Log", + "block.betterend.lucernia_outer_leaves": "Lucernia Outer Leaves", + "block.betterend.lucernia_planks": "Lucernia Planks", + "block.betterend.lucernia_plate": "Lucernia Pressure Plate", + "block.betterend.lucernia_sapling": "Lucernia Sapling", + "block.betterend.lucernia_sign": "Lucernia Sign", + "block.betterend.lucernia_slab": "Lucernia Slab", + "block.betterend.lucernia_stairs": "Lucernia Stairs", + "block.betterend.lucernia_stripped_bark": "Stripped Lucernia Bark", + "block.betterend.lucernia_stripped_log": "Stripped Lucernia Log", + "block.betterend.lucernia_trapdoor": "Lucernia Trapdoor", + + "block.betterend.aurant_polypore": "Aurant Polypore", + "block.betterend.bolux_mushroom": "Bolux Mushroom", + "block.betterend.flamaea": "Flamaea", + "block.betterend.pond_anemone": "Pond Anemone", + "block.betterend.ruscus": "Ruscus", + "item.betterend.bolux_mushroom_cooked": "Cooked Bolux Mushroom", + + "block.betterend.silk_moth_hive": "Silk Moth Hive", + "item.betterend.silk_moth_matrix": "Silk Moth Matrix", + + "biome.betterend.neon_oasis": "Neon Oasis", + "block.betterend.cave_pumpkin": "Cave Pumpkin", + "block.betterend.cave_pumpkin_seed": "Cave Pumpkin Seed", + "block.betterend.magnula": "Magnula", + "block.betterend.neon_cactus": "Neon Cactus", + "item.betterend.cave_pumpkin_pie": "Cave Pumpkin Pie", + + "item.betterend.music_disc_strange_and_alien": "§bMusic Disc§r", + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r", + + "block.betterend.hydralux_petal_block_amber": "Amber Petal Block", + "block.betterend.hydralux_petal_block_beige": "Beige Petal Block", + "block.betterend.hydralux_petal_block_cream": "Cream Petal Block", + "block.betterend.hydralux_petal_block_dark_green": "Dark Green Petal Block", + "block.betterend.hydralux_petal_block_forest_green": "Forest Green Petal Block", + "block.betterend.hydralux_petal_block_hot_pink": "Hot Pink Petal Block", + "block.betterend.hydralux_petal_block_indigo": "Indigo Petal Block", + "block.betterend.hydralux_petal_block_maroon": "Maroon Petal Block", + "block.betterend.hydralux_petal_block_navy": "Navy Petal Block", + "block.betterend.hydralux_petal_block_olive": "Olive Petal Block", + "block.betterend.hydralux_petal_block_pale_green": "Pale Green Petal Block", + "block.betterend.hydralux_petal_block_pale_pink": "Pale Pink Petal Block", + "block.betterend.hydralux_petal_block_pale_yellow": "Pale Yellow Petal Block", + "block.betterend.hydralux_petal_block_sky_blue": "Sky Blue Petal Block", + "block.betterend.hydralux_petal_block_slate_gray": "Slate Gray Petal Block", + "block.betterend.hydralux_petal_block_violet": "Violet Petal Block", + + "block.betterend.smaragdant_crystal_bricks": "Smaragdant Bricks", + "block.betterend.smaragdant_crystal_bricks_slab": "Smaragdant Bricks Slab", + "block.betterend.smaragdant_crystal_bricks_stairs": "Smaragdant Bricks Stairs", + "block.betterend.smaragdant_crystal_bricks_wall": "Smaragdant Bricks Wall", + "block.betterend.smaragdant_crystal_pedestal": "Smaragdant Pedestal", + "block.betterend.smaragdant_crystal_pillar": "Smaragdant Pillar", + "block.betterend.smaragdant_crystal_polished": "Smaragdant Polished", + "block.betterend.smaragdant_crystal_slab": "Smaragdant Slab", + "block.betterend.smaragdant_crystal_stairs": "Smaragdant Stairs", + "block.betterend.smaragdant_crystal_tiles": "Smaragdant Tiles", + "block.betterend.smaragdant_crystal_wall": "Smaragdant Wall", + "message.betterend.anvil_damage": "§cDamage", + + "block.betterend.neon_cactus_block": "Neon Cactus Block", + "block.betterend.neon_cactus_slab": "Neon Cactus Slab", + "block.betterend.neon_cactus_stairs": "Neon Cactus Stairs", + "biome.betterend.jade_cave": "Jade Cave" } diff --git a/src/main/resources/assets/betterend/lang/ko_kr.json b/src/main/resources/assets/betterend/lang/ko_kr.json new file mode 100644 index 00000000..07515255 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/ko_kr.json @@ -0,0 +1,680 @@ +{ + "itemGroup.betterend.end_items": "Better End: 아이템", + "itemGroup.betterend.end_blocks": "Better End: 블록", + + "item.betterend.guidebook": "엔드 무작정 따라하기", + "book.betterend.landing": "엔드의 극한환경에서 살아남기 위한 짤막한 가이드", + "book.betterend.subtitle": "엔드에서 살아남기", + + "category.rei.damage.amount&dmg": "도구 손상: %s", + "category.rei.infusion.time&val": "주입 시간: %s", + + "biome.betterend.foggy_mushroomland": "안개 낀 버섯 지대", + "biome.betterend.dust_wastelands": "칙칙한 불모지", + "biome.betterend.chorus_forest": "후렴 숲", + "biome.betterend.megalake": "거대한 호수", + "biome.betterend.crystal_mountains": "수정 산맥", + + "entity.betterend.dragonfly": "잠자리", + "item.betterend.spawn_egg_dragonfly": "잠자리 생성 알", + + "entity.betterend.end_slime": "엔드 슬라임", + "item.betterend.spawn_egg_end_slime": "엔드 슬라임 생성 알", + + "block.betterend.end_mycelium": "엔드 균사체", + "block.betterend.end_moss": "엔드 이끼", + "block.betterend.endstone_dust": "엔드 돌 가루", + + "block.betterend.end_mycelium_path": "엔드 균사체 길", + "block.betterend.end_moss_path": "엔드 이끼 길", + + "block.betterend.ender_ore": "엔더 원석", + "block.betterend.terminite_block": "터미나이트 블록", + "block.betterend.aeternium_block": "에테르늄 블록", + "block.betterend.ender_block": "엔더 블록", + "block.betterend.end_stone_smelter": "엔드 돌 용광로", + + "item.betterend.ender_dust": "엔더 가루", + "item.betterend.ender_shard": "엔더 조각", + "item.betterend.terminite_ingot": "터미나이트 주괴", + "item.betterend.aeternium_ingot": "에테르늄 주괴", + "item.betterend.terminite_helmet": "터미나이트 투구", + "item.betterend.terminite_chestplate": "터미나이트 흉갑", + "item.betterend.terminite_leggings": "터미나이트 각반", + "item.betterend.terminite_boots": "터미나이트 부츠", + "item.betterend.terminite_shovel": "터미나이트 삽", + "item.betterend.terminite_sword": "터미나이트 검", + "item.betterend.terminite_pickaxe": "터미나이트 곡괭이", + "item.betterend.terminite_axe": "터미나이트 도끼", + "item.betterend.terminite_hoe": "터미나이트 괭이", + "item.betterend.terminite_hammer": "터미나이트 단조 망치", + "item.betterend.aeternium_helmet": "에테르늄 투구", + "item.betterend.aeternium_chestplate": "에테르늄 흉갑", + "item.betterend.aeternium_leggings": "에테르늄 각반", + "item.betterend.aeternium_boots": "에테르늄 부츠", + "item.betterend.aeternium_shovel": "에테르늄 삽", + "item.betterend.aeternium_sword": "에테르늄 검", + "item.betterend.aeternium_pickaxe": "에테르늄 곡괭이", + "item.betterend.aeternium_axe": "에테르늄 도끼", + "item.betterend.aeternium_hoe": "에테르늄 괭이", + "item.betterend.aeternium_hammer": "에테르늄 단조 망치", + "item.betterend.iron_hammer": "철 단조 망치", + "item.betterend.golden_hammer": "황금 단조 망치", + "item.betterend.diamond_hammer": "다이아몬드 단조 망치", + "item.betterend.netherite_hammer": "네더라이트 단조 망치", + "item.betterend.crystalite_boots": "크리스탈라이트 부츠", + "item.betterend.crystalite_chestplate": "크리스탈라이트 흉갑", + "item.betterend.crystalite_helmet": "크리스탈라이트 투구", + "item.betterend.crystalite_leggings": "크리스탈라이트 각반", + "item.betterend.aeternium_axe_head": "에테르늄 도끼 머리", + "item.betterend.aeternium_hammer_head": "에테르늄 망치 머리", + "item.betterend.aeternium_hoe_head": "에테르늄 괭이 머리", + "item.betterend.aeternium_pickaxe_head": "에테르늄 곡괭이 머리", + "item.betterend.aeternium_shovel_head": "에테르늄 삽 머리", + "item.betterend.aeternium_sword_blade": "에테르늄 검 날", + "item.betterend.aeternium_sword_handle": "에테르늄 검 손잡이", + "item.betterend.leather_stripe": "가죽끈", + "item.betterend.leather_wrapped_stick": "가죽을 감은 막대기", + + "effect.betterend.end_veil": "엔드 베일", + "enchantment.betterend.end_veil": "엔드 베일", + "item.minecraft.potion.effect.end_veil": "엔드 베일의 물약", + "item.minecraft.potion.effect.long_end_veil": "엔드 베일의 물약", + "item.minecraft.splash_potion.effect.end_veil": "투척용 엔드 베일의 물약", + "item.minecraft.splash_potion.effect.long_end_veil": "투척용 엔드 베일의 물약", + "item.minecraft.lingering_potion.effect.end_veil": "잔류형 엔드 베일의 물약", + "item.minecraft.lingering_potion.effect.long_end_veil": "잔류형 엔드 베일의 물약", + "item.minecraft.tipped_arrow.effect.end_veil": "엔드 베일의 화살", + "item.minecraft.tipped_arrow.effect.long_end_veil": "엔드 베일의 화살", + + "block.betterend.mossy_glowshroom_sapling": "이끼 낀 발광버섯 묘목", + "block.betterend.mossy_glowshroom_cap": "이끼 낀 발광버섯 갓", + "block.betterend.mossy_glowshroom_fur": "이끼 낀 발광버섯 털", + "block.betterend.mossy_glowshroom_hymenophore": "이끼 낀 발광버섯 자실층탁", + "block.betterend.mossy_glowshroom_bark": "이끼 낀 발광버섯", + "block.betterend.mossy_glowshroom_barrel": "이끼 낀 발광버섯 통", + "block.betterend.mossy_glowshroom_button": "이끼 낀 발광버섯 버튼", + "block.betterend.mossy_glowshroom_chest": "이끼 낀 발광버섯 상자", + "block.betterend.mossy_glowshroom_crafting_table": "이끼 낀 발광버섯 제작대", + "block.betterend.mossy_glowshroom_door": "이끼 낀 발광버섯 문", + "block.betterend.mossy_glowshroom_fence": "이끼 낀 발광버섯 울타리", + "block.betterend.mossy_glowshroom_gate": "이끼 낀 발광버섯 울타리 문", + "block.betterend.mossy_glowshroom_ladder": "이끼 낀 발광버섯 사다리", + "block.betterend.mossy_glowshroom_log": "이끼 낀 발광버섯 원목", + "block.betterend.mossy_glowshroom_planks": "이끼 낀 발광버섯 판자", + "block.betterend.mossy_glowshroom_plate": "이끼 낀 발광버섯 압력판", + "block.betterend.mossy_glowshroom_sign": "이끼 낀 발광버섯 표지판", + "block.betterend.mossy_glowshroom_slab": "이끼 낀 발광버섯 반 블록", + "block.betterend.mossy_glowshroom_stairs": "이끼 낀 발광버섯 계단", + "block.betterend.mossy_glowshroom_stripped_bark": "껍질 벗긴 이끼 낀 발광버섯", + "block.betterend.mossy_glowshroom_stripped_log": "껍질 벗긴 이끼 낀 발광버섯 원목", + "block.betterend.mossy_glowshroom_trapdoor": "이끼 낀 발광버섯 다락문", + + "block.betterend.umbrella_moss": "우산 이끼", + "block.betterend.umbrella_moss_tall": "긴 우산 이끼", + "block.betterend.creeping_moss": "포복성 이끼", + + "block.betterend.blue_vine_seed": "파란색 덩굴 씨앗", + "block.betterend.blue_vine": "파란색 덩굴", + "block.betterend.blue_vine_lantern": "파란색 덩굴 랜턴", + "block.betterend.blue_vine_fur": "파란색 덩굴 털", + + "block.betterend.dense_vine": "조밀한 덩굴", + "block.betterend.bubble_coral": "거품 산호", + "block.betterend.aurora_crystal": "오로라 수정", + "item.betterend.crystal_shards": "수정 조각", + + "block.betterend.pythadendron_sapling": "피타덴드론 묘목", + "block.betterend.pythadendron_bark": "피타덴드론", + "block.betterend.pythadendron_barrel": "피타덴드론 통", + "block.betterend.pythadendron_button": "피타덴드론 버튼", + "block.betterend.pythadendron_chest": "피타덴드론 상자", + "block.betterend.pythadendron_crafting_table": "피타덴드론 제작대", + "block.betterend.pythadendron_door": "피타덴드론 문", + "block.betterend.pythadendron_fence": "피타덴드론 울타리", + "block.betterend.pythadendron_gate": "피타덴드론 울타리 문", + "block.betterend.pythadendron_ladder": "피타덴드론 사다리", + "block.betterend.pythadendron_log": "피타덴드론 원목", + "block.betterend.pythadendron_planks": "피타덴드론 판자", + "block.betterend.pythadendron_plate": "피타덴드론 압력판", + "block.betterend.pythadendron_sign": "피타덴드론 표지판", + "block.betterend.pythadendron_slab": "피타덴드론 반 블록", + "block.betterend.pythadendron_stairs": "피타덴드론 계단", + "block.betterend.pythadendron_stripped_bark": "껍질 벗긴 피타덴드론", + "block.betterend.pythadendron_stripped_log": "껍질 벗긴 피타덴드론 원목", + "block.betterend.pythadendron_trapdoor": "피타덴드론 다락문", + + "block.betterend.chorus_nylium": "후렴 네사체", + "block.betterend.chorus_nylium_path": "후렴 네사체 길", + "block.betterend.chorus_grass": "후렴 잔디", + + "block.betterend.end_lily": "엔드 수련", + "block.betterend.end_lily_seed": "엔드 수련 씨앗", + "item.betterend.end_lily_leaf": "엔드 수련 잎", + "item.betterend.end_lily_leaf_dried": "말린 엔드 수련 잎", + + "block.betterend.violecite": "바이올사이트", + "block.betterend.violecite_bricks": "바이올사이트 벽돌", + "block.betterend.violecite_bricks_slab": "바이올사이트 벽돌 반 블록", + "block.betterend.violecite_bricks_stairs": "바이올사이트 벽돌 계단", + "block.betterend.violecite_bricks_wall": "바이올사이트 벽돌 담장", + "block.betterend.violecite_button": "바이올사이트 버튼", + "block.betterend.violecite_pillar": "바이올사이트 기둥", + "block.betterend.violecite_plate": "바이올사이트 압력판", + "block.betterend.violecite_slab": "바이올사이트 반 블록", + "block.betterend.violecite_tiles": "바이올사이트 타일", + "block.betterend.violecite_stairs": "바이올사이트 계단", + "block.betterend.violecite_polished": "윤나는 바이올사이트", + "block.betterend.violecite_wall": "바이올사이트 담장", + "block.betterend.violecite_pedestal": "바이올사이트 받침대", + + "block.betterend.flavolite": "플라보라이트", + "block.betterend.flavolite_bricks": "플라보라이트 벽돌", + "block.betterend.flavolite_bricks_slab": "플라보라이트 벽돌 반 블록", + "block.betterend.flavolite_bricks_stairs": "플라보라이트 벽돌 계단", + "block.betterend.flavolite_bricks_wall": "플라보라이트 벽돌 담장", + "block.betterend.flavolite_button": "플라보라이트 버튼", + "block.betterend.flavolite_pillar": "플라보라이트 기둥", + "block.betterend.flavolite_plate": "플라보라이트 압력판", + "block.betterend.flavolite_slab": "플라보라이트 반 블록", + "block.betterend.flavolite_tiles": "플라보라이트 타일", + "block.betterend.flavolite_stairs": "플라보라이트 계단", + "block.betterend.flavolite_polished": "윤나는 플라보라이트", + "block.betterend.flavolite_wall": "플라보라이트 담장", + "block.betterend.flavolite_pedestal": "플라보라이트 받침대", + + "block.betterend.andesite_pedestal": "안산암 받침대", + "block.betterend.diorite_pedestal": "섬록암 받침대", + "block.betterend.granite_pedestal": "화강암 받침대", + "block.betterend.purpur_pedestal": "퍼퍼 받침대", + "block.betterend.quartz_pedestal": "석영 받침대", + "block.betterend.infusion_pedestal": "주입 받침대", + + "block.betterend.end_lotus_seed": "엔드 연꽃 씨앗", + "block.betterend.end_lotus_stem": "엔드 연꽃 줄기", + "block.betterend.end_lotus_leaf": "엔드 연꽃 잎", + "block.betterend.end_lotus_flower": "엔드 연꽃", + + "block.betterend.end_lotus_bark": "엔드 연꽃", + "block.betterend.end_lotus_barrel": "엔드 연꽃 통", + "block.betterend.end_lotus_button": "엔드 연꽃 버튼", + "block.betterend.end_lotus_chest": "엔드 연꽃 상자", + "block.betterend.end_lotus_crafting_table": "엔드 연꽃 제작대", + "block.betterend.end_lotus_door": "엔드 연꽃 문", + "block.betterend.end_lotus_fence": "엔드 연꽃 울타리", + "block.betterend.end_lotus_gate": "엔드 연꽃 울타리 문", + "block.betterend.end_lotus_ladder": "엔드 연꽃 사다리", + "block.betterend.end_lotus_log": "엔드 연꽃 원목", + "block.betterend.end_lotus_planks": "엔드 연꽃 판자", + "block.betterend.end_lotus_plate": "엔드 연꽃 압력판", + "block.betterend.end_lotus_sign": "엔드 연꽃 표지판", + "block.betterend.end_lotus_slab": "엔드 연꽃 반 블록", + "block.betterend.end_lotus_stairs": "엔드 연꽃 계단", + "block.betterend.end_lotus_stripped_bark": "껍질 벗긴 엔드 연꽃", + "block.betterend.end_lotus_stripped_log": "껍질 벗긴 엔드 연꽃 원목", + "block.betterend.end_lotus_trapdoor": "엔드 연꽃 다락문", + + "block.betterend.cave_moss": "동굴 이끼", + "block.betterend.cave_grass": "동굴 잔디", + "block.betterend.cave_bush": "동굴 덤불", + + "block.betterend.cave_moss_path": "동굴 이끼 길", + "block.betterend.crystal_moss": "수정 이끼", + "block.betterend.crystal_moss_path": "수정 이끼 길", + "block.betterend.pythadendron_leaves": "피타덴드론 잎", + "item.betterend.spawn_egg_end_fish": "엔드 물고기 생성 알", + "block.betterend.crystal_grass": "수정 잔디", + + "block.betterend.flavolite_runed": "룬을 새긴 플라보라이트", + "block.betterend.end_portal_block": "엔드 포탈", + "block.betterend.eternal_pedestal": "영원한 받침대", + "block.betterend.flavolite_runed_eternal": "영원한 룬을 새긴 플라보라이트", + "item.betterend.eternal_crystal": "영원한 수정", + + "block.betterend.lacugrove_bark": "라쿠그로브", + "block.betterend.lacugrove_barrel": "라쿠그로브 통", + "block.betterend.lacugrove_button": "라쿠그로브 버튼", + "block.betterend.lacugrove_chest": "라쿠그로브 상자", + "block.betterend.lacugrove_crafting_table": "라쿠그로브 제작대", + "block.betterend.lacugrove_door": "라쿠그로브 문", + "block.betterend.lacugrove_fence": "라쿠그로브 울타리", + "block.betterend.lacugrove_gate": "라쿠그로브 울타리 문", + "block.betterend.lacugrove_ladder": "라쿠그로브 사다리", + "block.betterend.lacugrove_log": "라쿠그로브 원목", + "block.betterend.lacugrove_planks": "라쿠그로브 판자", + "block.betterend.lacugrove_plate": "라쿠그로브 압력판", + "block.betterend.lacugrove_sign": "라쿠그로브 표지판", + "block.betterend.lacugrove_slab": "라쿠그로브 반 블록", + "block.betterend.lacugrove_stairs": "라쿠그로브 계단", + "block.betterend.lacugrove_stripped_bark": "껍질 벗긴 라쿠그로브", + "block.betterend.lacugrove_stripped_log": "껍질 벗긴 라쿠그로브 원목", + "block.betterend.lacugrove_trapdoor": "라쿠그로브 다락문", + + "block.betterend.lacugrove_leaves": "라쿠그로브 잎", + "block.betterend.lacugrove_sapling": "라쿠그로브 묘목", + + "biome.betterend.megalake_grove": "거대한 호수 숲", + "biome.betterend.painted_mountains": "채색 산맥", + + "block.betterend.dragon_tree_bark": "용혈수", + "block.betterend.dragon_tree_barrel": "용혈수 통", + "block.betterend.dragon_tree_button": "용혈수 버튼", + "block.betterend.dragon_tree_chest": "용혈수 상자", + "block.betterend.dragon_tree_crafting_table": "용혈수 제작대", + "block.betterend.dragon_tree_door": "용혈수 문", + "block.betterend.dragon_tree_fence": "용혈수 울타리", + "block.betterend.dragon_tree_gate": "용혈수 울타리 문", + "block.betterend.dragon_tree_ladder": "용혈수 사다리", + "block.betterend.dragon_tree_log": "용혈수 원목", + "block.betterend.dragon_tree_planks": "용혈수 판자", + "block.betterend.dragon_tree_plate": "용혈수 압력판", + "block.betterend.dragon_tree_sign": "용혈수 표지판", + "block.betterend.dragon_tree_slab": "용혈수 반 블록", + "block.betterend.dragon_tree_stairs": "용혈수 계단", + "block.betterend.dragon_tree_stripped_bark": "껍질 벗긴 용혈수", + "block.betterend.dragon_tree_stripped_log": "껍질 벗긴 용혈수 원목", + "block.betterend.dragon_tree_trapdoor": "용혈수 다락문", + + "biome.betterend.shadow_forest": "그림자 숲", + "block.betterend.dragon_tree_leaves": "용혈수 잎", + "block.betterend.dragon_tree_sapling": "용혈수 묘목", + "block.betterend.shadow_grass": "그림자 잔디", + "block.betterend.shadow_grass_path": "그림자 잔디 길", + "block.betterend.shadow_plant": "그림자 식물", + + "block.betterend.dragon_tree_bookshelf": "용혈수 책장", + "block.betterend.end_lotus_bookshelf": "엔드 연꽃 책장", + "block.betterend.lacugrove_bookshelf": "라쿠그로브 책장", + "block.betterend.mossy_glowshroom_bookshelf": "이끼 낀 발광버섯 책장", + "block.betterend.pythadendron_bookshelf": "피타덴드론 책장", + + "block.betterend.murkweed": "컴컴한풀", + "block.betterend.needlegrass": "털수염풀", + "block.betterend.twisted_vine": "뒤틀린 덩굴", + + "block.betterend.shadow_berry": "그림자 열매 씨앗", + "item.betterend.shadow_berry_cooked": "익힌 그림자 열매", + "item.betterend.shadow_berry_raw": "그림자 열매", + "block.betterend.purple_polypore": "보라색 버섯", + + "block.betterend.cyan_moss": "청록색 이끼", + "block.betterend.tail_moss": "꼬리 이끼", + + "block.betterend.flavolite_lantern": "플라보라이트 랜턴", + "block.betterend.end_stone_lantern": "엔드 돌 랜턴", + "block.betterend.violecite_lantern": "바이올사이트 랜턴", + + "entity.betterend.end_fish": "엔드 물고기", + "entity.betterend.shadow_walker": "그림자 워커", + "item.betterend.spawn_egg_shadow_walker": "그림자 워커 생성 알", + + "block.betterend.andesite_lantern": "안산암 랜턴", + "block.betterend.blackstone_lantern": "흑암 랜턴", + "block.betterend.diorite_lantern": "섬록암 랜턴", + "block.betterend.granite_lantern": "화강암 랜턴", + "block.betterend.purpur_lantern": "퍼퍼 랜턴", + "block.betterend.quartz_lantern": "석영 랜턴", + + "item.betterend.bucket_end_fish": "엔드 물고기가 담긴 양동이", + "item.betterend.end_fish_cooked": "익힌 엔드 물고기", + "item.betterend.end_fish_raw": "엔드 물고기", + + "biome.betterend.amber_land": "호박 지대", + "biome.betterend.blossoming_spires": "만발한 첨탑", + "block.betterend.amber_grass": "호박 잔디", + "block.betterend.amber_grass_path": "호박 잔디 길", + "block.betterend.tenanea_bark": "테나네아", + "block.betterend.tenanea_barrel": "테나네아 통", + "block.betterend.tenanea_bookshelf": "테나네아 책장", + "block.betterend.tenanea_button": "테나네아 버튼", + "block.betterend.tenanea_chest": "테나네아 상자", + "block.betterend.tenanea_crafting_table": "테나네아 제작대", + "block.betterend.tenanea_door": "테나네아 문", + "block.betterend.tenanea_fence": "테나네아 울타리", + "block.betterend.tenanea_gate": "테나네아 울타리 문", + "block.betterend.tenanea_ladder": "테나네아 사다리", + "block.betterend.tenanea_leaves": "테나네아 잎", + "block.betterend.tenanea_log": "테나네아 원목", + "block.betterend.tenanea_planks": "테나네아 판자", + "block.betterend.tenanea_plate": "테나네아 압력판", + "block.betterend.tenanea_sapling": "테나네아 묘목", + "block.betterend.tenanea_sign": "테나네아 표지판", + "block.betterend.tenanea_slab": "테나네아 반 블록", + "block.betterend.tenanea_stairs": "테나네아 계단", + "block.betterend.tenanea_stripped_bark": "껍질 벗긴 테나네아", + "block.betterend.tenanea_stripped_log": "껍질 벗긴 테나네아 원목", + "block.betterend.tenanea_trapdoor": "테나네아 다락문", + + "block.betterend.amber_block": "호박 블록", + "block.betterend.amber_ore": "호박 원석", + "item.betterend.amber_gem": "호박", + "item.betterend.raw_amber": "가공하지 않은 호박", + "block.betterend.tenanea_flowers": "테나네아 꽃", + "block.betterend.tenanea_outer_leaves": "테나네아 겉잎", + + "block.betterend.pink_moss": "분홍색 이끼", + "block.betterend.pink_moss_path": "분홍색 이끼 길", + + "block.betterend.twisted_moss": "뒤틀린 이끼", + + "block.betterend.bulb_vine": "구근 덩굴", + "block.betterend.bulb_vine_seed": "구근 덩굴 씨앗", + "item.betterend.glowing_bulb": "발광 구근", + + "block.betterend.iron_bulb_lantern": "철 구근 랜턴", + "block.betterend.iron_bulb_lantern_black": "검은색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_blue": "파란색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_brown": "갈색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_cyan": "청록색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_gray": "회색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_green": "초록색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_light_blue": "하늘색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_light_gray": "회백색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_lime": "연두색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_magenta": "자홍색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_orange": "주황색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_pink": "분홍색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_purple": "보라색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_red": "빨간색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_white": "흰색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_yellow": "노란색 철 구근 랜턴", + + "block.betterend.thallasium_bulb_lantern": "탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_black": "검은색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_blue": "파란색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_brown": "갈색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_cyan": "청록색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_gray": "회색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_green": "초록색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_light_blue": "하늘색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_light_gray": "회백색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_lime": "연두색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_magenta": "자홍색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_orange": "주황색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_pink": "분홍색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_purple": "보라색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_red": "빨간색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_white": "흰색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_yellow": "노란색 탈라슘 구근 랜턴", + + "block.betterend.bushy_grass": "무성한 잔디", + + "block.betterend.brimstone": "유황석", + "block.betterend.sulphuric_rock": "유황암", + "block.betterend.sulphuric_rock_bricks": "유황암 벽돌", + "block.betterend.sulphuric_rock_bricks_slab": "유황암 벽돌 반 블록", + "block.betterend.sulphuric_rock_bricks_stairs": "유황암 벽돌 계단", + "block.betterend.sulphuric_rock_bricks_wall": "유황암 벽돌 담장", + "block.betterend.sulphuric_rock_button": "유황암 버튼", + "block.betterend.sulphuric_rock_lantern": "유황암 랜턴", + "block.betterend.sulphuric_rock_pedestal": "유황암 받침대", + "block.betterend.sulphuric_rock_pillar": "유황암 기둥", + "block.betterend.sulphuric_rock_plate": "유황암 압력판", + "block.betterend.sulphuric_rock_polished": "윤나는 유황암", + "block.betterend.sulphuric_rock_slab": "유황암 반 블록", + "block.betterend.sulphuric_rock_stairs": "유황암 계단", + "block.betterend.sulphuric_rock_tiles": "유황암 타일", + "block.betterend.sulphuric_rock_wall": "유황암 담장", + "block.betterend.sulphur_crystal": "유황 수정", + "item.betterend.crystalline_sulphur": "유황", + + "biome.betterend.sulphur_springs": "유황천", + "block.betterend.hydralux_petal_block": "하이드라럭스 꽃잎 블록", + "block.betterend.hydralux_petal_block_black": "검은색 꽃잎 블록", + "block.betterend.hydralux_petal_block_blue": "파란색 꽃잎 블록", + "block.betterend.hydralux_petal_block_brown": "갈색 꽃잎 블록", + "block.betterend.hydralux_petal_block_cyan": "청록색 꽃잎 블록", + "block.betterend.hydralux_petal_block_gray": "회색 꽃잎 블록", + "block.betterend.hydralux_petal_block_green": "초록색 꽃잎 블록", + "block.betterend.hydralux_petal_block_light_blue": "하늘색 꽃잎 블록", + "block.betterend.hydralux_petal_block_light_gray": "회백색 꽃잎 블록", + "block.betterend.hydralux_petal_block_lime": "연두색 꽃잎 블록", + "block.betterend.hydralux_petal_block_magenta": "자홍색 꽃잎 블록", + "block.betterend.hydralux_petal_block_orange": "주황색 꽃잎 블록", + "block.betterend.hydralux_petal_block_pink": "분홍색 꽃잎 블록", + "block.betterend.hydralux_petal_block_purple": "보라색 꽃잎 블록", + "block.betterend.hydralux_petal_block_red": "빨간색 꽃잎 블록", + "block.betterend.hydralux_petal_block_white": "흰색 꽃잎 블록", + "block.betterend.hydralux_petal_block_yellow": "노란색 꽃잎 블록", + "block.betterend.hydralux_sapling": "하이드라럭스 묘목", + "block.betterend.hydrothermal_vent": "열수구", + "item.betterend.hydralux_petal": "하이드라럭스 꽃잎", + "item.betterend.enchanted_petal": "마법이 부여된 꽃잎", + + "block.betterend.menger_sponge": "멩거 스펀지", + "block.betterend.menger_sponge_wet": "젖은 멩거 스펀지", + "block.betterend.tube_worm": "관벌레", + + "block.betterend.charnia_cyan": "청록색 차니아", + "block.betterend.charnia_light_blue": "하늘색 차니아", + "block.betterend.charnia_orange": "주황색 차니아", + "block.betterend.charnia_purple": "보라색 차니아", + "block.betterend.charnia_red": "빨간색 차니아", + + "entity.betterend.cubozoa": "상자해파리", + "item.betterend.spawn_egg_cubozoa": "상자해파리 생성 알", + + "item.betterend.gelatine": "젤라틴", + "item.betterend.sweet_berry_jelly": "달콤한 열매 젤리", + "item.betterend.shadow_berry_jelly": "그림자 열매 젤리", + + "block.betterend.amber_moss": "호박 이끼", + "block.betterend.amber_moss_path": "호박 이끼 길", + "block.betterend.helix_tree_bark": "나선형 나무", + "block.betterend.helix_tree_barrel": "나선형 나무 통", + "block.betterend.helix_tree_bookshelf": "나선형 나무 책장", + "block.betterend.helix_tree_button": "나선형 나무 버튼", + "block.betterend.helix_tree_chest": "나선형 나무 상자", + "block.betterend.helix_tree_crafting_table": "나선형 나무 제작대", + "block.betterend.helix_tree_door": "나선형 나무 문", + "block.betterend.helix_tree_fence": "나선형 나무 울타리", + "block.betterend.helix_tree_gate": "나선형 나무 울타리 문", + "block.betterend.helix_tree_ladder": "나선형 나무 사다리", + "block.betterend.helix_tree_leaves": "나선형 나무 잎", + "block.betterend.helix_tree_log": "나선형 나무 원목", + "block.betterend.helix_tree_planks": "나선형 나무 판자", + "block.betterend.helix_tree_plate": "나선형 나무 압력판", + "block.betterend.helix_tree_sapling": "나선형 나무 묘목", + "block.betterend.helix_tree_sign": "나선형 나무 표지판", + "block.betterend.helix_tree_slab": "나선형 나무 반 블록", + "block.betterend.helix_tree_stairs": "나선형 나무 계단", + "block.betterend.helix_tree_stripped_bark": "껍질 벗긴 나선형 나무", + "block.betterend.helix_tree_stripped_log": "껍질 벗긴 나선형 나무 원목", + "block.betterend.helix_tree_trapdoor": "나선형 나무 다락문", + "block.betterend.lanceleaf": "창엽", + "block.betterend.lanceleaf_seed": "창엽 씨앗", + "block.betterend.hydralux": "하이드라럭스", + "block.betterend.helix_tree_luminophor": "나선형 나무 발광체", + + "block.betterend.glowing_pillar_leaves": "발광 기둥 잎", + "block.betterend.glowing_pillar_luminophor": "발광 기둥 발광체", + "block.betterend.glowing_pillar_roots": "발광 기둥 뿌리", + "block.betterend.glowing_pillar_seed": "발광 기둥 씨앗", + + "biome.betterend.ice_starfield": "얼음 별", + + "block.betterend.ancient_emerald_ice": "고대의 에메랄드 얼음", + "block.betterend.dense_emerald_ice": "조밀한 에메랄드 얼음", + "block.betterend.dense_snow": "조밀한 눈", + "block.betterend.emerald_ice": "에메랄드 얼음", + + "block.betterend.bulb_moss": "구근 이끼", + + "block.betterend.charnia_green": "초록색 차니아", + "block.betterend.vent_bubble_column": "거품 분출 기둥", + "block.betterend.respawn_obelisk": "리스폰 오벨리스크", + "message.betterend.set_spawn": "\u00A7b\u00A7l리스폰 지점을 설정했습니다", + "message.betterend.fail_spawn": "\u00A7c\u00A7l호박 6개를 가지고 있어야 리스폰 지점을 설정할 수 있습니다", + + "block.betterend.dragon_tree_composter": "용혈수 퇴비통", + "block.betterend.end_lotus_composter": "엔드 연꽃 퇴비통", + "block.betterend.helix_tree_composter": "나선형 나무 퇴비통", + "block.betterend.lacugrove_composter": "라쿠그로브 퇴비통", + "block.betterend.mossy_glowshroom_composter": "이끼 낀 발광버섯 퇴비통", + "block.betterend.pythadendron_composter": "피타덴드론 퇴비통", + "block.betterend.tenanea_composter": "테나네아 퇴비통", + + "biome.betterend.old_bulbis_gardens": "오래된 구근 정원", + "block.betterend.ivis_moss": "이비스 이끼", + "block.betterend.ivis_vine": "이비스 덩굴", + "block.betterend.silk_moth_nest": "비단나방 둥지", + + "block.betterend.umbrella_tree_bark": "우산 나무", + "block.betterend.umbrella_tree_barrel": "우산 나무 통", + "block.betterend.umbrella_tree_bookshelf": "우산 나무 책장", + "block.betterend.umbrella_tree_button": "우산 나무 버튼", + "block.betterend.umbrella_tree_chest": "우산 나무 상자", + "block.betterend.umbrella_tree_composter": "우산 나무 퇴비통", + "block.betterend.umbrella_tree_crafting_table": "우산 나무 제작대", + "block.betterend.umbrella_tree_door": "우산 나무 문", + "block.betterend.umbrella_tree_fence": "우산 나무 울타리", + "block.betterend.umbrella_tree_gate": "우산 나무 울타리 문", + "block.betterend.umbrella_tree_ladder": "우산 나무 사다리", + "block.betterend.umbrella_tree_log": "우산 나무 원목", + "block.betterend.umbrella_tree_planks": "우산 나무 판자", + "block.betterend.umbrella_tree_plate": "우산 나무 압력판", + "block.betterend.umbrella_tree_sign": "우산 나무 표지판", + "block.betterend.umbrella_tree_slab": "우산 나무 반 블록", + "block.betterend.umbrella_tree_stairs": "우산 나무 계단", + "block.betterend.umbrella_tree_stripped_bark": "껍질 벗긴 우산 나무", + "block.betterend.umbrella_tree_stripped_log": "껍질 벗긴 우산 나무 원목", + "block.betterend.umbrella_tree_trapdoor": "우산 나무 다락문", + "block.betterend.umbrella_tree_membrane": "우산 나무 막", + + "biome.betterend.umbrella_jungle": "우산 정글", + "block.betterend.jungle_grass": "정글 잔디", + "block.betterend.jungle_moss": "정글 이끼", + "block.betterend.jungle_moss_path": "정글 이끼 길", + "block.betterend.small_jellyshroom": "작은 젤리버섯", + "block.betterend.twisted_umbrella_moss": "뒤틀린 우산 이끼", + "block.betterend.twisted_umbrella_moss_tall": "긴 뒤틀린 우산 이끼", + "block.betterend.umbrella_tree_cluster": "우산 나무 송이", + "block.betterend.umbrella_tree_cluster_empty": "빈 우산 나무 송이", + "block.betterend.jungle_vine": "정글 덩굴", + "block.betterend.jungle_fern": "정글 고사리", + + "block.betterend.jellyshroom_bark": "젤리버섯", + "block.betterend.jellyshroom_barrel": "젤리버섯 통", + "block.betterend.jellyshroom_bookshelf": "젤리버섯 책장", + "block.betterend.jellyshroom_button": "젤리버섯 버튼", + "block.betterend.jellyshroom_cap_purple": "보라색 젤리버섯 갓", + "block.betterend.jellyshroom_chest": "젤리버섯 상자", + "block.betterend.jellyshroom_composter": "젤리버섯 퇴비통", + "block.betterend.jellyshroom_crafting_table": "젤리버섯 제작대", + "block.betterend.jellyshroom_door": "젤리버섯 문", + "block.betterend.jellyshroom_fence": "젤리버섯 울타리", + "block.betterend.jellyshroom_gate": "젤리버섯 울타리 문", + "block.betterend.jellyshroom_ladder": "젤리버섯 사다리", + "block.betterend.jellyshroom_log": "젤리버섯 원목", + "block.betterend.jellyshroom_planks": "젤리버섯 판자", + "block.betterend.jellyshroom_plate": "젤리버섯 압력판", + "block.betterend.jellyshroom_sign": "젤리버섯 표지판", + "block.betterend.jellyshroom_slab": "젤리버섯 반 블록", + "block.betterend.jellyshroom_stairs": "젤리버섯 계단", + "block.betterend.jellyshroom_stripped_bark": "껍질 벗긴 젤리버섯", + "block.betterend.jellyshroom_stripped_log": "껍질 벗긴 젤리버섯 원목", + "block.betterend.jellyshroom_trapdoor": "젤리버섯 다락문", + + "biome.betterend.eterial_grove": "에테리얼 숲", + "block.betterend.umbrella_tree_sapling": "우산 나무 묘목", + "item.betterend.umbrella_cluster_juice": "우산 송이 주스", + "block.betterend.blossom_berry_seed": "만발한 열매 씨앗", + "item.betterend.blossom_berry": "만발한 열매", + + "biome.betterend.nightshade_redwoods": "밤그림자 삼나무 숲", + "block.betterend.nightshade_moss": "밤그림자 이끼", + + "biome.betterend.glowing_grasslands": "빛나는 초원", + "block.betterend.blooming_cooksonia": "만발한 쿡소니아", + "block.betterend.fracturn": "프랙턴", + "block.betterend.lumecorn": "루메콘", + "block.betterend.salteago": "살테고", + "block.betterend.vaiolush_fern": "바이올루시 고사리", + "entity.betterend.silk_moth": "비단나방", + "item.betterend.silk_fiber": "비단 실", + "item.betterend.spawn_egg_silk_moth": "비단나방 생성 알", + + "block.betterend.thallasium_ore": "탈라슘 광석", + "item.betterend.thallasium_axe": "탈라슘 도끼", + "item.betterend.thallasium_hoe": "탈라슘 괭이", + "item.betterend.thallasium_ingot": "탈라슘 주괴", + "item.betterend.thallasium_pickaxe": "탈라슘 곡괭이", + "item.betterend.thallasium_shovel": "탈라슘 삽", + "item.betterend.thallasium_sword": "탈라슘 검", + "block.betterend.thallasium_block": "탈라슘 블록", + + "block.betterend.thallasium_bars": "탈라슘창", + "block.betterend.thallasium_door": "탈라슘 문", + "block.betterend.thallasium_plate": "탈라슘 압력판", + "block.betterend.thallasium_tile": "탈라슘 타일", + "block.betterend.thallasium_trapdoor": "탈라슘 다락문", + + "block.betterend.lumecorn_seed": "루메콘 씨앗", + "item.betterend.lumecorn_rod": "루메콘 막대기", + "block.betterend.thallasium_chandelier": "탈라슘 샹들리에", + + "block.betterend.thallasium_anvil": "탈라슘 모루", + "block.betterend.thallasium_chain": "탈라슘 사슬", + "block.betterend.thallasium_slab": "탈라슘 반 블록", + "block.betterend.thallasium_stairs": "탈라슘 계단", + + "block.betterend.gold_chandelier": "황금 샹들리에", + "block.betterend.iron_chandelier": "철 샹들리에", + "item.betterend.thallasium_nugget": "탈라슘 조각", + + "block.betterend.terminite_anvil": "터미나이트 모루", + "block.betterend.terminite_bars": "터미나이트창", + + "block.betterend.terminite_bulb_lantern": "터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_black": "검은색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_blue": "파란색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_brown": "갈색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_cyan": "청록색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_gray": "회색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_green": "초록색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_light_blue": "하늘색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_light_gray": "회백색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_lime": "연두색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_magenta": "자홍색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_orange": "주황색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_pink": "분홍색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_purple": "보라색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_red": "빨간색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_white": "흰색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_yellow": "노란색 터미나이트 구근 랜턴", + + "block.betterend.terminite_chain": "터미나이트 사슬", + "block.betterend.terminite_chandelier": "터미나이트 샹들리에", + "block.betterend.terminite_door": "터미나이트 문", + "block.betterend.terminite_plate": "터미나이트 압력판", + "block.betterend.terminite_slab": "터미나이트 반 블록", + "block.betterend.terminite_stairs": "터미나이트 계단", + "block.betterend.terminite_tile": "터미나이트 타일", + "block.betterend.terminite_trapdoor": "터미나이트 다락문", + "item.betterend.terminite_nugget": "터미나이트 조각", + "item.betterend.thallasium_boots": "탈라슘 부츠", + "item.betterend.thallasium_chestplate": "탈라슘 흉갑", + "item.betterend.thallasium_hammer": "탈라슘 망치", + "item.betterend.thallasium_helmet": "탈라슘 투구", + "item.betterend.thallasium_leggings": "탈라슘 각반", + "block.betterend.missing_tile": "누락된 타일", + "block.betterend.charcoal_block": "숯 블록", + "block.betterend.end_stone_furnace": "엔드 돌 화로", + "block.betterend.flavolite_furnace": "플라보라이트 화로", + "block.betterend.sulphuric_rock_furnace": "유황암 화로", + "block.betterend.violecite_furnace": "바이올사이트 화로", + + "item.betterend.terminite_axe_head": "터미나이트 도끼 머리", + "item.betterend.terminite_hoe_head": "터미나이트 괭이 머리", + "item.betterend.terminite_pickaxe_head": "터미나이트 곡괭이 머리", + "item.betterend.terminite_shovel_head": "터미나이트 삽 머리", + "item.betterend.terminite_sword_blade": "터미나이트 검 날", + "item.betterend.terminite_sword_handle": "터미나이트 검 손잡이", + "item.betterend.thallasium_axe_head": "탈라슘 도끼 머리", + "item.betterend.thallasium_hoe_head": "탈라슘 괭이 머리", + "item.betterend.thallasium_pickaxe_head": "탈라슘 곡괭이 머리", + "item.betterend.thallasium_shovel_head": "탈라슘 삽 머리", + "item.betterend.thallasium_sword_blade": "탈라슘 검 날", + "item.betterend.thallasium_sword_handle": "탈라슘 검 손잡이", + "block.betterend.aeternium_anvil": "에테르늄 모루" +} diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8d96aefc..0e550b66 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -29,43 +29,53 @@ "block.betterend.end_moss_path": "Тропа из мха Края", "block.betterend.ender_ore": "Руда Края", - "block.betterend.terminite_block": "Блок Терминита", - "block.betterend.aeternium_block": "Блок Этерия", - "block.betterend.ender_block": "Блок Края", - "block.betterend.end_stone_smelter": "Плавильня из камня Края", + "block.betterend.terminite_block": "Блок терминита", + "block.betterend.aeternium_block": "Блок этерия", + "block.betterend.ender_block": "Блок жемчуга Края", + "block.betterend.end_stone_smelter": "Плавильня из эндерняка", "item.betterend.ender_dust": "Пыль Края", "item.betterend.ender_shard": "Осколок Края", - "item.betterend.terminite_ingot": "Слиток Терминита", + "item.betterend.terminite_ingot": "Слиток терминита", "item.betterend.aeternium_ingot": "Этериевый слиток", - "item.betterend.terminite_helmet": "Шлем из Терминита", - "item.betterend.terminite_chestplate": "Кираса из Терминита", - "item.betterend.terminite_leggings": "Поножи из Терминита", - "item.betterend.terminite_boots": "Сапоги из Терминита", - "item.betterend.terminite_shovel": "Лопата из Терминита", - "item.betterend.terminite_sword": "Меч из Терминита", - "item.betterend.terminite_pickaxe": "Кирка из Терминита", - "item.betterend.terminite_axe": "Топор из Терминита", - "item.betterend.terminite_hoe": "Мотыга из Терминита", - "item.betterend.terminite_hammer": "Кузнечный Молот из Терминита", - "item.betterend.aeternium_helmet": "Этериевый Шлем", - "item.betterend.aeternium_chestplate": "Этериевая Кираса", - "item.betterend.aeternium_leggings": "Этериевые Поножи", - "item.betterend.aeternium_boots": "Этериевые Сапоги", - "item.betterend.aeternium_shovel": "Этериевая Лопата", - "item.betterend.aeternium_sword": "Этериевый Меч", - "item.betterend.aeternium_pickaxe": "Этериевая Кирка", - "item.betterend.aeternium_axe": "Этериевый Топор", - "item.betterend.aeternium_hoe": "Этериевая Мотыга", - "item.betterend.aeternium_hammer": "Этериевый Кузнечный Молот", - "item.betterend.iron_hammer": "Железный Кузнечный Молот", - "item.betterend.golden_hammer": "Золотой Кузнечный Молот", - "item.betterend.diamond_hammer": "Алмазный Кузнечный Молот", + "item.betterend.terminite_helmet": "Шлем из терминита", + "item.betterend.terminite_chestplate": "Кираса из терминита", + "item.betterend.terminite_leggings": "Поножи из терминита", + "item.betterend.terminite_boots": "Сапоги из терминита", + "item.betterend.terminite_shovel": "Лопата из терминита", + "item.betterend.terminite_sword": "Меч из терминита", + "item.betterend.terminite_pickaxe": "Кирка из терминита", + "item.betterend.terminite_axe": "Топор из терминита", + "item.betterend.terminite_hoe": "Мотыга из терминита", + "item.betterend.terminite_hammer": "Кузнечный молот из терминита", + "item.betterend.aeternium_helmet": "Этериевый шлем", + "item.betterend.aeternium_chestplate": "Этериевая кираса", + "item.betterend.aeternium_leggings": "Этериевые поножи", + "item.betterend.aeternium_boots": "Этериевые сапоги", + "item.betterend.aeternium_shovel": "Этериевая лопата", + "item.betterend.aeternium_sword": "Этериевый меч", + "item.betterend.aeternium_pickaxe": "Этериевая кирка", + "item.betterend.aeternium_axe": "Этериевый топор", + "item.betterend.aeternium_hoe": "Этериевая мотыга", + "item.betterend.aeternium_hammer": "Этериевый кузнечный молот", + "item.betterend.iron_hammer": "Железный кузнечный молот", + "item.betterend.golden_hammer": "Золотой кузнечный молот", + "item.betterend.diamond_hammer": "Алмазный кузнечный молот", "item.betterend.netherite_hammer": "Кузнечный Молот из Незерита", "item.betterend.crystalite_boots": "Кристалитовые сапоги", "item.betterend.crystalite_chestplate": "Кристалитовая кираса", "item.betterend.crystalite_helmet": "Кристалитовый шлем", "item.betterend.crystalite_leggings": "Кристалитовые поножи", + "item.betterend.aeternium_axe_head": "Навершие этериевого топора", + "item.betterend.aeternium_hammer_head": "Навершие этериевого молота", + "item.betterend.aeternium_hoe_head": "Навершие этериевой мотыги", + "item.betterend.aeternium_pickaxe_head": "Навершие этериевой кирки", + "item.betterend.aeternium_shovel_head": "Навершие этериевой лопаты", + "item.betterend.aeternium_sword_blade": "Лезвие этериевого меча", + "item.betterend.aeternium_sword_handle": "Рукоятка этериевого меча", + "item.betterend.leather_stripe": "Полоска кожи", + "item.betterend.leather_wrapped_stick": "Обернутая кожей палка", + "item.betterend.elytra_armored": "Армированная Элитра", "effect.betterend.end_veil": "Вуаль Края", "enchantment.betterend.end_veil": "Вуаль Края", @@ -294,7 +304,7 @@ "block.betterend.tail_moss": "Хвостовидный мох", "block.betterend.flavolite_lantern": "Флаволитовый фонарь", - "block.betterend.end_stone_lantern": "Фонарь из камня Края", + "block.betterend.end_stone_lantern": "Фонарь из эндерняка", "block.betterend.violecite_lantern": "Виолецитовый фонарь", "entity.betterend.end_fish": "Рыба Края", @@ -309,6 +319,7 @@ "block.betterend.quartz_lantern": "Кварцевый фонарь", "item.betterend.bucket_end_fish": "Ведро с рыбой Края", + "item.betterend.bucket_cubozoa": "Ведро с кубомедузой", "item.betterend.end_fish_cooked": "Приготовленная рыба Края", "item.betterend.end_fish_raw": "Рыба Края", @@ -351,26 +362,62 @@ "block.betterend.twisted_moss": "Закрученный мох", "block.betterend.bulb_vine": "Луковичная лоза", - "block.betterend.bulb_lantern": "Луковичный фонарь", "block.betterend.bulb_vine_seed": "Семя луковичной лозы", "item.betterend.glowing_bulb": "Светящаяся луковица", - "block.betterend.bulb_lantern_black": "Чёрный луковичный фонарь", - "block.betterend.bulb_lantern_blue": "Синий луковичный фонарь", - "block.betterend.bulb_lantern_brown": "Коричневый луковичный фонарь", - "block.betterend.bulb_lantern_cyan": "Циановый луковичный фонарь", - "block.betterend.bulb_lantern_gray": "Серый луковичный фонарь", - "block.betterend.bulb_lantern_green": "Зелёный луковичный фонарь", - "block.betterend.bulb_lantern_light_blue": "Голубой луковичный фонарь", - "block.betterend.bulb_lantern_light_gray": "Светло-серый луковичный фонарь", - "block.betterend.bulb_lantern_lime": "Лаймовый луковичный фонарь", - "block.betterend.bulb_lantern_magenta": "Фиолетовый луковичный фонарь", - "block.betterend.bulb_lantern_orange": "Оранжевый луковичный фонарь", - "block.betterend.bulb_lantern_pink": "Розовый луковичный фонарь", - "block.betterend.bulb_lantern_purple": "Пурпурный луковичный фонарь", - "block.betterend.bulb_lantern_red": "Красный луковичный фонарь", - "block.betterend.bulb_lantern_white": "Белый луковичный фонарь", - "block.betterend.bulb_lantern_yellow": "Жёлтый луковичный фонарь", + "block.betterend.iron_bulb_lantern": "Железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_black": "Чёрный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_blue": "Синий железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_brown": "Коричневый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_cyan": "Циановый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_gray": "Серый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_green": "Зелёный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_light_blue": "Голубой железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_light_gray": "Светло-серый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_lime": "Лаймовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_magenta": "Фиолетовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_orange": "Оранжевый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_pink": "Розовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_purple": "Пурпурный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_red": "Красный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_white": "Белый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_yellow": "Жёлтый железный луковичный фонарь", + + "block.betterend.gold_bulb_lantern": "Золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_black": "Чёрный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_blue": "Синий золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_brown": "Коричневый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_cyan": "Циановый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_gray": "Серый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_green": "Зелёный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_light_blue": "Голубой золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_light_gray": "Светло-серый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_lime": "Лаймовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_magenta": "Фиолетовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_orange": "Оранжевый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_pink": "Розовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_purple": "Пурпурный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_red": "Красный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_white": "Белый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_yellow": "Жёлтый золотой луковичный фонарь", + + "block.betterend.thallasium_bulb_lantern": "Талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_black": "Чёрный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_blue": "Синий талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_brown": "Коричневый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_cyan": "Циановый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_gray": "Серый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_green": "Зелёный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_light_blue": "Голубой талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_light_gray": "Светло-серый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_lime": "Лаймовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_magenta": "Фиолетовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_orange": "Оранжевый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_pink": "Розовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_purple": "Пурпурный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_red": "Красный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_white": "Белый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_yellow": "Жёлтый талласиевый луковичный фонарь", "block.betterend.bushy_grass": "Густая трава", @@ -414,6 +461,7 @@ "block.betterend.hydralux_sapling": "Саженец гидралюкса", "block.betterend.hydrothermal_vent": "Гидротермальный источник", "item.betterend.hydralux_petal": "Лепесток гидралюкса", + "item.betterend.enchanted_petal": "Зачарованный лепесток", "block.betterend.menger_sponge": "Губка Менгера", "block.betterend.menger_sponge_wet": "Мокрая губка Менгера", @@ -513,5 +561,318 @@ "block.betterend.umbrella_tree_stripped_bark": "Обтёсанная кора зонтичного дерева", "block.betterend.umbrella_tree_stripped_log": "Обтёсанное бревно зонтичного дерева", "block.betterend.umbrella_tree_trapdoor": "Люк из зонтичного дерева", - "block.betterend.umbrella_tree_membrane": "Мембрана зонтичного дерева" + "block.betterend.umbrella_tree_membrane": "Мембрана зонтичного дерева", + + "biome.betterend.umbrella_jungle": "Зонтичные джунгли", + "block.betterend.jungle_grass": "Трава джунглей", + "block.betterend.jungle_moss": "Мох джунглей", + "block.betterend.jungle_moss_path": "Тропа из мха джунглей", + "block.betterend.small_jellyshroom": "Маленький слизнегриб", + "block.betterend.twisted_umbrella_moss": "Закрученный зонтичный мох", + "block.betterend.twisted_umbrella_moss_tall": "Высокий закрученный зонтичный мох", + "block.betterend.umbrella_tree_cluster": "Кластер зонтичного дерева", + "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева", + "block.betterend.jungle_vine": "Лоза джунглей", + "block.betterend.jungle_fern": "Папоротник джунглей", + + "block.betterend.jellyshroom_bark": "Кора желейного гриба", + "block.betterend.jellyshroom_barrel": "Бочка из желейного гриба", + "block.betterend.jellyshroom_bookshelf": "Книжные полки из желейного гриба", + "block.betterend.jellyshroom_button": "Кнопка из желейного гриба", + "block.betterend.jellyshroom_cap_purple": "Пурпурная шляпка желейного гриба", + "block.betterend.jellyshroom_chest": "Сундук из желейного гриба", + "block.betterend.jellyshroom_composter": "Компостер из желейного гриба", + "block.betterend.jellyshroom_crafting_table": "Верстак из желейного гриба", + "block.betterend.jellyshroom_door": "Дверь из желейного гриба", + "block.betterend.jellyshroom_fence": "Забор из желейного гриба", + "block.betterend.jellyshroom_gate": "Калитка из желейного гриба", + "block.betterend.jellyshroom_ladder": "Лестница из желейного гриба", + "block.betterend.jellyshroom_log": "Бревно желейного гриба", + "block.betterend.jellyshroom_planks": "Доски из желейного гриба", + "block.betterend.jellyshroom_plate": "Нажимная плита из желейного гриба", + "block.betterend.jellyshroom_sign": "Табличка из желейного гриба", + "block.betterend.jellyshroom_slab": "Плита из желейного гриба", + "block.betterend.jellyshroom_stairs": "Ступени из желейного гриба", + "block.betterend.jellyshroom_stripped_bark": "Обтёсанная кора желейного гриба", + "block.betterend.jellyshroom_stripped_log": "Обтёсанное бревно желейного гриба", + "block.betterend.jellyshroom_trapdoor": "Люк из желейного гриба", + + "biome.betterend.eterial_grove": "Эфирная роща", + "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева", + "item.betterend.umbrella_cluster_juice": "Сок зонтичного кластера", + "block.betterend.blossom_berry_seed": "Семя цветущей ягоды", + "item.betterend.blossom_berry": "Цветущая ягода", + + "biome.betterend.nightshade_redwoods": "Теневой Секвойник", + "block.betterend.nightshade_moss": "Теневой мох", + + "biome.betterend.glowing_grasslands": "Светящиеся луга", + "block.betterend.blooming_cooksonia": "Цветущая куксония", + "block.betterend.fracturn": "Фрактюрн", + "block.betterend.lumecorn": "Люмекорн", + "block.betterend.salteago": "Сальтеаго", + "block.betterend.vaiolush_fern": "Пышнопёрый папоротник", + "entity.betterend.silk_moth": "Шелковичная моль", + "item.betterend.silk_fiber": "Шёлковое волокно", + "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли", + + "block.betterend.thallasium_ore": "Талласиевая руда", + "item.betterend.thallasium_axe": "Талласиевый топор", + "item.betterend.thallasium_hoe": "Талласиевая мотыга", + "item.betterend.thallasium_ingot": "Талласиевый слиток", + "item.betterend.thallasium_pickaxe": "Талласиевая кирка", + "item.betterend.thallasium_shovel": "Талласиевая лопата", + "item.betterend.thallasium_sword": "Талласиевый меч", + "block.betterend.thallasium_block": "Талласиевый блок", + + "block.betterend.thallasium_bars": "Талласиевые прутья", + "block.betterend.thallasium_door": "Талласиевая дверь", + "block.betterend.thallasium_plate": "Талласиевая нажимная плита", + "block.betterend.thallasium_tile": "Талласиевая плитка", + "block.betterend.thallasium_trapdoor": "Талласиевый люк", + + "block.betterend.lumecorn_seed": "Семя люмекорна", + "item.betterend.lumecorn_rod": "Стержень люмекорна", + "block.betterend.thallasium_chandelier": "Талласиевый канделябр", + + "block.betterend.thallasium_anvil": "Талласиевая наковальня", + "block.betterend.thallasium_chain": "Талласиевая цепь", + "block.betterend.thallasium_slab": "Талласиевая плита", + "block.betterend.thallasium_stairs": "Талласиевые ступени", + + "block.betterend.gold_chandelier": "Золотой канделябр", + "block.betterend.iron_chandelier": "Железный канделябр", + "item.betterend.thallasium_nugget": "Талласиевый самородок", + + "block.betterend.terminite_anvil": "Терминитовая наковальня", + "block.betterend.terminite_bars": "Терминитовая решётка", + + "block.betterend.terminite_bulb_lantern": "Терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_black": "Чёрный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_blue": "Синий терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_brown": "Коричневый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_cyan": "Циановый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_gray": "Серый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_green": "Зелёный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_light_blue": "Голубой терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_light_gray": "Светло-серый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_lime": "Лаймовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_magenta": "Фиолетовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_orange": "Оранжевый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_pink": "Розовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_purple": "Пурпурный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_red": "Красный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_white": "Белый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_yellow": "Жёлтый терминитовый луковичный фонарь", + + "block.betterend.terminite_chain": "Терминитовая цепь", + "block.betterend.terminite_chandelier": "Терминитовый канделябр", + "block.betterend.terminite_door": "Терминитовая дверь", + "block.betterend.terminite_plate": "Терминитовая нажимная плита", + "block.betterend.terminite_slab": "Терминитовая плита", + "block.betterend.terminite_stairs": "Терминитовые ступени", + "block.betterend.terminite_tile": "Терминитовая плитка", + "block.betterend.terminite_trapdoor": "Терминитовый люк", + "item.betterend.terminite_nugget": "Терминитовый самородок", + "item.betterend.thallasium_boots": "Талласиевые ботинки", + "item.betterend.thallasium_chestplate": "Талласиевый нагрудник", + "item.betterend.thallasium_hammer": "Талласиевый молот", + "item.betterend.thallasium_helmet": "Талласиевый шлем", + "item.betterend.thallasium_leggings": "Талласиевые поножи", + "block.betterend.missing_tile": "Отсутствующая плитка", + "block.betterend.charcoal_block": "Блок древесного угля", + "block.betterend.end_stone_furnace": "Эндерняковая печь", + "block.betterend.flavolite_furnace": "Флаволитовая печь", + "block.betterend.sulphuric_rock_furnace": "Печь из серного камня", + "block.betterend.violecite_furnace": "Виолецитовая печь", + + "item.betterend.terminite_axe_head": "Навершие терминитового топора", + "item.betterend.terminite_hoe_head": "Навершие терминитовой мотыги", + "item.betterend.terminite_pickaxe_head": "Навершие терминитовой кирки", + "item.betterend.terminite_shovel_head": "Навершие терминитовой лопаты", + "item.betterend.terminite_sword_blade": "Лезвие терминитового меча", + "item.betterend.terminite_sword_handle": "Рукоятка терминитового меча", + "item.betterend.thallasium_axe_head": "Навершие талласиевого топора", + "item.betterend.thallasium_hoe_head": "Навершие талласиевой мотыги", + "item.betterend.thallasium_pickaxe_head": "Навершие талласиевой кирки", + "item.betterend.thallasium_shovel_head": "Навершие талласиевой лопаты", + "item.betterend.thallasium_sword_blade": "Лезвие талласиевого меча", + "item.betterend.thallasium_sword_handle": "Рукоятка талласиевого меча", + "block.betterend.aeternium_anvil": "Этериевая наковальня", + + "biome.betterend.dragon_graveyards": "Драконье кладбище", + "biome.betterend.dry_shrubland": "Сухая степь", + "block.betterend.aeridium": "Аэридиум", + "block.betterend.amaranita_cap": "Шляпка амаранита", + "block.betterend.amaranita_fur": "Волоски амаранита", + "block.betterend.amaranita_hymenophore": "Гименофор амаранита", + "block.betterend.amaranita_hyphae": "Гифа амаранита", + "block.betterend.amaranita_lantern": "Фонарь амаранита", + "block.betterend.amaranita_stem": "Стебель амаранита", + "block.betterend.clawfern": "Когтелист", + "block.betterend.globulagus": "Глобулагус", + "block.betterend.lamellarium": "Ламеллариум", + "block.betterend.large_amaranita_mushroom": "Большой амаранит", + "block.betterend.lutebus": "Лютебус", + "block.betterend.mossy_bone": "Мшистые кости", + "block.betterend.mossy_obsidian": "Мшистый обсидиан", + "block.betterend.orango": "Оранго", + "block.betterend.rutiscus": "Рутискус", + "block.betterend.rutiscus_path": "Тропа из рутискуса", + "block.betterend.sangnum": "Сагнум", + "block.betterend.sangnum_path": "Тропа из сагнума", + "block.betterend.small_amaranita_mushroom": "Маленький амаранит", + + "block.betterend.amber_root_seed": "Семена янтарного корня", + "block.betterend.azure_jadestone": "Лазурный нефрит", + "block.betterend.azure_jadestone_bricks": "Кирпичи из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_slab": "Кирпичная плита из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_stairs": "Кирпичные ступени из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_wall": "Кирпичная стена из лазурного нефрита", + "block.betterend.azure_jadestone_button": "Кнопка из лазурного нефрита", + "block.betterend.azure_jadestone_furnace": "Печь из лазурного нефрита", + "block.betterend.azure_jadestone_lantern": "Фонарь из лазурного нефрита", + "block.betterend.azure_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.azure_jadestone_pillar": "Колонна из лазурного нефрита", + "block.betterend.azure_jadestone_plate": "Нажимная плита из лазурного нефрита", + "block.betterend.azure_jadestone_polished": "Полированный лазурный нефрит", + "block.betterend.azure_jadestone_slab": "Плита из лазурного нефрита", + "block.betterend.azure_jadestone_stairs": "Ступени из лазурного нефрита", + "block.betterend.azure_jadestone_tiles": "Плитка из лазурного нефрита", + "block.betterend.azure_jadestone_wall": "Стена из лазурного нефрита", + "block.betterend.chorus_mushroom_seed": "Семена хорусового гриба", + "block.betterend.end_stone_stalactite": "Эндерняковый сталактит", + "block.betterend.end_stone_stalactite_cavemoss": "Замшелый эндерняковый сталактит", + "block.betterend.pearlberry_seed": "Семена жемчужной ягоды", + "block.betterend.rubinea": "Рубинея", + "block.betterend.sandy_jadestone": "Песчаный нефрит", + "block.betterend.sandy_jadestone_bricks": "Кирпичи из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_slab": "Кирпичная плита из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_stairs": "Кирпичные ступени из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_wall": "Кирпичная стена из песчаного нефрита", + "block.betterend.sandy_jadestone_button": "Кнопка из песчаного нефрита", + "block.betterend.sandy_jadestone_furnace": "Печь из песчаного нефрита", + "block.betterend.sandy_jadestone_lantern": "Фонарь из песчаного нефрита", + "block.betterend.sandy_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.sandy_jadestone_pillar": "Колонна из песчаного нефрита", + "block.betterend.sandy_jadestone_plate": "Нажимная плита из песчаного нефрита", + "block.betterend.sandy_jadestone_polished": "Полированный песчаный нефрит", + "block.betterend.sandy_jadestone_slab": "Плита из песчаного нефрита", + "block.betterend.sandy_jadestone_stairs": "Ступени из песчаного нефрита", + "block.betterend.sandy_jadestone_tiles": "Плитка из песчаного нефрита", + "block.betterend.sandy_jadestone_wall": "Стена из песчаного нефрита", + "block.betterend.smaragdant_crystal": "Кристалл смарагданта", + "block.betterend.smaragdant_crystal_shard": "Осколок кристалла смарагданта", + "block.betterend.virid_jadestone": "Зелёный нефрит", + "block.betterend.virid_jadestone_bricks": "Кирпичи из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_slab": "Кирпичная плита из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_stairs": "Кирпичные ступени из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_wall": "Кирпичная стена из зелёного нефрита", + "block.betterend.virid_jadestone_button": "Кнопка из зелёного нефрита", + "block.betterend.virid_jadestone_furnace": "Печь из зелёного нефрита", + "block.betterend.virid_jadestone_lantern": "Фонарь из зелёного нефрита", + "block.betterend.virid_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.virid_jadestone_pillar": "Колонна из зелёного нефрита", + "block.betterend.virid_jadestone_plate": "Нажимная плита из зелёного нефрита", + "block.betterend.virid_jadestone_polished": "Полированный зелёный нефрит", + "block.betterend.virid_jadestone_slab": "Плита из зелёного нефрита", + "block.betterend.virid_jadestone_stairs": "Ступени из зелёного нефрита", + "block.betterend.virid_jadestone_tiles": "Плитка из зелёного нефрита", + "block.betterend.virid_jadestone_wall": "Стена из зелёного нефрита", + "item.betterend.amber_root_raw": "Сырой янтарный корень", + "item.betterend.chorus_mushroom_cooked": "Приготовленный хорусовый гриб", + "item.betterend.chorus_mushroom_raw": "Сырой хорусовый гриб", + + "biome.betterend.empty_aurora_cave": "Пустая пещера авроры", + "biome.betterend.empty_end_cave": "Пустая пещера Энда", + "biome.betterend.empty_smaragdant_cave": "Пустая смарагдантовая пещера", + "biome.betterend.lush_aurora_cave": "Пышная пещера авроры", + "biome.betterend.lush_smaragdant_cave": "Пышная смарагдантовая пещера", + + "block.betterend.dragon_bone_block": "Блок драконьих костей", + "block.betterend.dragon_bone_slab": "Плита из блока драконьих костей", + "block.betterend.dragon_bone_stairs": "Ступени из блока драконьих костей", + "block.betterend.mossy_dragon_bone": "Замшелые драконьи кости", + + "biome.betterend.lantern_woods": "Лес фонарей", + "block.betterend.filalux": "Филалюкс", + "block.betterend.filalux_lantern": "Филалюксовый фонарь", + "block.betterend.filalux_wings": "Филалюксовые крылья", + "block.betterend.lucernia_bark": "Кора люцернии", + "block.betterend.lucernia_barrel": "Бочка из люцернии", + "block.betterend.lucernia_bookshelf": "Книжные полки из люцернии", + "block.betterend.lucernia_button": "Кнопка из люцернии", + "block.betterend.lucernia_chest": "Сундук из люцернии", + "block.betterend.lucernia_composter": "Компостер из люцернии", + "block.betterend.lucernia_crafting_table": "Верстак из люцернии", + "block.betterend.lucernia_door": "Дверь из люцернии", + "block.betterend.lucernia_fence": "Забор из люцернии", + "block.betterend.lucernia_gate": "Калитка из люцернии", + "block.betterend.lucernia_ladder": "Лестница из люцернии", + "block.betterend.lucernia_leaves": "Листья люцернии", + "block.betterend.lucernia_log": "Бревно люцернии", + "block.betterend.lucernia_outer_leaves": "Внешние листья люцернии", + "block.betterend.lucernia_planks": "Доски из люцернии", + "block.betterend.lucernia_plate": "Нажимная плита из люцернии", + "block.betterend.lucernia_sapling": "Саженец люцернии", + "block.betterend.lucernia_sign": "Табличка из люцернии", + "block.betterend.lucernia_slab": "Плита из люцернии", + "block.betterend.lucernia_stairs": "Ступени из люцернии", + "block.betterend.lucernia_stripped_bark": "Обтёсанная кора люцернии", + "block.betterend.lucernia_stripped_log": "Обтёсанное бревно люцернии", + "block.betterend.lucernia_trapdoor": "Люцерниевый люк", + + "block.betterend.aurant_polypore": "Аурантовый трутовик", + "block.betterend.bolux_mushroom": "Болюкс", + "block.betterend.flamaea": "Фламея", + "block.betterend.pond_anemone": "Озёрный анемон", + "block.betterend.ruscus": "Рускус", + "item.betterend.bolux_mushroom_cooked": "Приготовленный болюкс", + + "block.betterend.silk_moth_hive": "Улей шелковичной моли", + "item.betterend.silk_moth_matrix": "Матрица шелковичной моли", + + "biome.betterend.neon_oasis": "Неоновый оазис", + "block.betterend.cave_pumpkin": "Пещерная тыква", + "block.betterend.cave_pumpkin_seed": "Семена пещерной тыквы", + "block.betterend.magnula": "Магнула", + "block.betterend.neon_cactus": "Неоновый кактус", + "item.betterend.cave_pumpkin_pie": "Пирог из пещерной тыквы", + + "item.betterend.music_disc_strange_and_alien": "§bПластинка§r", + + "block.betterend.hydralux_petal_block_amber": "Янтарный блок лепестков", + "block.betterend.hydralux_petal_block_beige": "Бежевый блок лепестков", + "block.betterend.hydralux_petal_block_cream": "Кремовый блок лепестков", + "block.betterend.hydralux_petal_block_dark_green": "Тёмно-зелёный блок лепестков", + "block.betterend.hydralux_petal_block_forest_green": "Лесной зелёный блок лепестков", + "block.betterend.hydralux_petal_block_hot_pink": "Ярко-розовый блок лепестков", + "block.betterend.hydralux_petal_block_indigo": "Индиго блок лепестков", + "block.betterend.hydralux_petal_block_maroon": "Бордовый блок лепестков", + "block.betterend.hydralux_petal_block_navy": "Темно-синий блок лепестков", + "block.betterend.hydralux_petal_block_olive": "Оливковый блок лепестков", + "block.betterend.hydralux_petal_block_pale_green": "Бледно-зеленый блок лепестков", + "block.betterend.hydralux_petal_block_pale_pink": "Бледно-розовый блок лепестков", + "block.betterend.hydralux_petal_block_pale_yellow": "Бледно-жёлтый блок лепестков", + "block.betterend.hydralux_petal_block_sky_blue": "Неьесно-голубой блок лепестков", + "block.betterend.hydralux_petal_block_slate_gray": "Сланцево-серый блок лепестков", + "block.betterend.hydralux_petal_block_violet": "Лиловый блок лепестков", + + "block.betterend.smaragdant_crystal_bricks": "Смарагдантовые кирпичи", + "block.betterend.smaragdant_crystal_bricks_slab": "Плита из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_bricks_stairs": "Ступени из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_bricks_wall": "Стена из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_pedestal": "Смарагдантовый пьедестал", + "block.betterend.smaragdant_crystal_pillar": "Смарагдантовая колонна", + "block.betterend.smaragdant_crystal_polished": "Полированный смарагдант", + "block.betterend.smaragdant_crystal_slab": "Смарагдантовая плита", + "block.betterend.smaragdant_crystal_stairs": "Смарагдантовые ступени", + "block.betterend.smaragdant_crystal_tiles": "Смарагдантовая плитка", + "block.betterend.smaragdant_crystal_wall": "Смарагдантовая стена", + "message.betterend.anvil_damage": "§cПовреждение", + + "block.betterend.neon_cactus_block": "Блок неонового кактуса", + "block.betterend.neon_cactus_slab": "Плита из неонового кактуса", + "block.betterend.neon_cactus_stairs": "Ступени из неонового кактуса", + "biome.betterend.jade_cave": "Нефритовая пещера" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/zh_cn.json b/src/main/resources/assets/betterend/lang/zh_cn.json index c4f30199..d07edbf2 100644 --- a/src/main/resources/assets/betterend/lang/zh_cn.json +++ b/src/main/resources/assets/betterend/lang/zh_cn.json @@ -1,13 +1,18 @@ { - "itemGroup.betterend.items": "更好的末地 (BetterEnd)", - + "itemGroup.betterend.end_items": "更好的末地:物品", + "itemGroup.betterend.end_blocks": "更好的末地:方块", + + "item.betterend.guidebook": "给新人看的末地指南", + "book.betterend.landing": "一本极端条件下在末地生存的指南", + "book.betterend.subtitle": "在末地生存", + "category.rei.damage.amount&dmg": "工具伤害:%s", - "category.rei.infusion.time&val": "灌注时间: %s", + "category.rei.infusion.time&val": "灌注时间:%s", "biome.betterend.foggy_mushroomland": "雾霭蘑菇岛", "biome.betterend.dust_wastelands": "尘土飞扬的荒地", - "biome.betterend.chorus_forest": "咏唱森林", - "biome.betterend.megalake": "巨泊", + "biome.betterend.chorus_forest": "紫颂森林", + "biome.betterend.megalake": "巨型湖泊", "biome.betterend.crystal_mountains": "水晶山脉", "entity.betterend.dragonfly": "蜻蜓", @@ -18,7 +23,7 @@ "block.betterend.end_mycelium": "末地菌丝", "block.betterend.end_moss": "末地苔藓", - "block.betterend.endstone_dust": "末地石粉", + "block.betterend.endstone_dust": "末地尘埃", "block.betterend.end_mycelium_path": "末地菌丝径", "block.betterend.end_moss_path": "末地苔藓径", @@ -30,6 +35,7 @@ "block.betterend.end_stone_smelter": "末地石冶炼炉", "item.betterend.ender_dust": "末影粉", + "item.betterend.ender_shard": "末影碎片", "item.betterend.terminite_ingot": "终界铁锭", "item.betterend.aeternium_ingot": "太古合金锭", "item.betterend.terminite_helmet": "终界铁头盔", @@ -41,7 +47,7 @@ "item.betterend.terminite_pickaxe": "终界铁镐", "item.betterend.terminite_axe": "终界铁斧", "item.betterend.terminite_hoe": "终界铁锄", - "item.betterend.terminite_hammer": "终界铁匠锤", + "item.betterend.terminite_hammer": "终界铁锻锤", "item.betterend.aeternium_helmet": "太古合金头盔", "item.betterend.aeternium_chestplate": "太古合金胸甲", "item.betterend.aeternium_leggings": "太古合金护腿", @@ -51,45 +57,49 @@ "item.betterend.aeternium_pickaxe": "太古合金镐", "item.betterend.aeternium_axe": "太古合金斧", "item.betterend.aeternium_hoe": "太古合金锄", - "item.betterend.aeternium_hammer": "太古合金匠锤", - "item.betterend.iron_hammer": "铁匠锤", - "item.betterend.golden_hammer": "金匠锤", - "item.betterend.diamond_hammer": "钻石匠锤", - "item.betterend.netherite_hammer": "下界合金匠锤", + "item.betterend.aeternium_hammer": "太古合金锻锤", + "item.betterend.iron_hammer": "铁锻锤", + "item.betterend.golden_hammer": "金锻锤", + "item.betterend.diamond_hammer": "钻石锻锤", + "item.betterend.netherite_hammer": "下界合金锻锤", + "item.betterend.crystalite_boots": "融晶合金靴子", + "item.betterend.crystalite_chestplate": "融晶合金胸甲", + "item.betterend.crystalite_helmet": "融晶合金头盔", + "item.betterend.crystalite_leggings": "融晶合金护腿", - "effect.betterend.end_veil": "末地面具", - "enchantment.betterend.end_veil": "末地面具", - "item.minecraft.potion.effect.end_veil": "末地面具药水", - "item.minecraft.potion.effect.long_end_veil": "末地面具药水", - "item.minecraft.splash_potion.effect.end_veil": "喷溅型末地面具药水", - "item.minecraft.splash_potion.effect.long_end_veil": "喷溅型末地面具药水", - "item.minecraft.lingering_potion.effect.end_veil": "滞留型末地面具药水", - "item.minecraft.lingering_potion.effect.long_end_veil": "滞留型末地面具药水", - "item.minecraft.tipped_arrow.effect.end_veil": "末地面具之箭", - "item.minecraft.tipped_arrow.effect.long_end_veil": "末地面具之箭", + "effect.betterend.end_veil": "末地面纱", + "enchantment.betterend.end_veil": "末地面纱", + "item.minecraft.potion.effect.end_veil": "末地面纱药水", + "item.minecraft.potion.effect.long_end_veil": "末地面纱药水", + "item.minecraft.splash_potion.effect.end_veil": "喷溅型末地面纱药水", + "item.minecraft.splash_potion.effect.long_end_veil": "喷溅型末地面纱药水", + "item.minecraft.lingering_potion.effect.end_veil": "滞留型末地面纱药水", + "item.minecraft.lingering_potion.effect.long_end_veil": "滞留型末地面纱药水", + "item.minecraft.tipped_arrow.effect.end_veil": "末地面纱之箭", + "item.minecraft.tipped_arrow.effect.long_end_veil": "末地面纱之箭", - "block.betterend.mossy_glowshroom_sapling": "苔光菇种子", + "block.betterend.mossy_glowshroom_sapling": "苔光菇幼苗", "block.betterend.mossy_glowshroom_cap": "苔光菇菌盖", "block.betterend.mossy_glowshroom_fur": "苔光菇菌绒", "block.betterend.mossy_glowshroom_hymenophore": "苔光菇菌褶", - "block.betterend.mossy_glowshroom_bark": "苔光菇菌木", + "block.betterend.mossy_glowshroom_bark": "苔光菇菌柄", "block.betterend.mossy_glowshroom_barrel": "苔光菇木桶", - "block.betterend.mossy_glowshroom_button": "苔光菇按钮", + "block.betterend.mossy_glowshroom_button": "苔光菇木按钮", "block.betterend.mossy_glowshroom_chest": "苔光菇木箱", - "block.betterend.mossy_glowshroom_crafting_table": "苔光菇工作台", + "block.betterend.mossy_glowshroom_crafting_table": "苔光菇木工作台", "block.betterend.mossy_glowshroom_door": "苔光菇木门", "block.betterend.mossy_glowshroom_fence": "苔光菇木栅栏", "block.betterend.mossy_glowshroom_gate": "苔光菇木栅栏门", "block.betterend.mossy_glowshroom_ladder": "苔光菇木梯", "block.betterend.mossy_glowshroom_log": "苔光菇原木", "block.betterend.mossy_glowshroom_planks": "苔光菇木板", - "block.betterend.mossy_glowshroom_plate": "苔光菇压力板", - "block.betterend.mossy_glowshroom_sign": "苔光菇告示牌", - "block.betterend.mossy_glowshroom_slab": "苔光菇台阶", - "block.betterend.mossy_glowshroom_stairs": "苔光菇楼梯", - "block.betterend.mossy_glowshroom_stripped_bark": "去皮苔光菇菌木", + "block.betterend.mossy_glowshroom_plate": "苔光菇木压力板", + "block.betterend.mossy_glowshroom_sign": "苔光菇木告示牌", + "block.betterend.mossy_glowshroom_slab": "苔光菇木台阶", + "block.betterend.mossy_glowshroom_stairs": "苔光菇木楼梯", + "block.betterend.mossy_glowshroom_stripped_bark": "去皮苔光菇菌柄", "block.betterend.mossy_glowshroom_stripped_log": "去皮苔光菇原木", - "block.betterend.mossy_glowshroom_trapdoor": "苔光菇活板门", + "block.betterend.mossy_glowshroom_trapdoor": "苔光菇木活板门", "block.betterend.umbrella_moss": "伞状苔藓", "block.betterend.umbrella_moss_tall": "高伞状苔藓", @@ -97,37 +107,37 @@ "block.betterend.blue_vine_seed": "蓝藤种子", "block.betterend.blue_vine": "蓝藤", - "block.betterend.blue_vine_lantern": "蓝藤灯", - "block.betterend.blue_vine_fur": "蓝藤菌毛", + "block.betterend.blue_vine_lantern": "蓝藤菌光体", + "block.betterend.blue_vine_fur": "蓝藤菌绒", "block.betterend.dense_vine": "茂密藤蔓", - "block.betterend.bubble_coral": "气泡珊瑚", + "block.betterend.bubble_coral": "冒泡珊瑚", "block.betterend.aurora_crystal": "极光水晶", "item.betterend.crystal_shards": "水晶碎片", - "block.betterend.pythadendron_sapling": "咏唱木树苗", - "block.betterend.pythadendron_bark": "咏唱木树皮", - "block.betterend.pythadendron_barrel": "咏唱木桶", - "block.betterend.pythadendron_button": "咏唱木按钮", - "block.betterend.pythadendron_chest": "咏唱木箱", - "block.betterend.pythadendron_crafting_table": "咏唱木工作台", - "block.betterend.pythadendron_door": "咏唱木门", - "block.betterend.pythadendron_fence": "咏唱木栅栏", - "block.betterend.pythadendron_gate": "咏唱木栅栏门", - "block.betterend.pythadendron_ladder": "咏唱木梯", - "block.betterend.pythadendron_log": "咏唱木原木", - "block.betterend.pythadendron_planks": "咏唱木板", - "block.betterend.pythadendron_plate": "咏唱木压力板", - "block.betterend.pythadendron_sign": "咏唱木告示牌", - "block.betterend.pythadendron_slab": "咏唱木台阶", - "block.betterend.pythadendron_stairs": "咏唱木楼梯", - "block.betterend.pythadendron_stripped_bark": "去皮咏唱木树皮", - "block.betterend.pythadendron_stripped_log": "去皮咏唱木原木", - "block.betterend.pythadendron_trapdoor": "咏唱木活板门", + "block.betterend.pythadendron_sapling": "毕达树苗", + "block.betterend.pythadendron_bark": "毕达木", + "block.betterend.pythadendron_barrel": "毕达木桶", + "block.betterend.pythadendron_button": "毕达木按钮", + "block.betterend.pythadendron_chest": "毕达木箱", + "block.betterend.pythadendron_crafting_table": "毕达木工作台", + "block.betterend.pythadendron_door": "毕达木门", + "block.betterend.pythadendron_fence": "毕达木栅栏", + "block.betterend.pythadendron_gate": "毕达木栅栏门", + "block.betterend.pythadendron_ladder": "毕达木梯", + "block.betterend.pythadendron_log": "毕达木原木", + "block.betterend.pythadendron_planks": "毕达木板", + "block.betterend.pythadendron_plate": "毕达木压力板", + "block.betterend.pythadendron_sign": "毕达木告示牌", + "block.betterend.pythadendron_slab": "毕达木台阶", + "block.betterend.pythadendron_stairs": "毕达木楼梯", + "block.betterend.pythadendron_stripped_bark": "去皮毕达木", + "block.betterend.pythadendron_stripped_log": "去皮毕达木原木", + "block.betterend.pythadendron_trapdoor": "毕达木活板门", - "block.betterend.chorus_nylium": "咏唱菌岩", - "block.betterend.chorus_nylium_path": "咏唱菌岩径", - "block.betterend.chorus_grass": "咏唱菌草", + "block.betterend.chorus_nylium": "紫颂菌岩", + "block.betterend.chorus_nylium_path": "紫颂菌岩径", + "block.betterend.chorus_grass": "紫颂草", "block.betterend.end_lily": "末地睡莲", "block.betterend.end_lily_seed": "末地睡莲种子", @@ -149,20 +159,20 @@ "block.betterend.violecite_wall": "紫罗兰石墙", "block.betterend.violecite_pedestal": "紫罗兰石基座", - "block.betterend.flavolite": "香料石", - "block.betterend.flavolite_bricks": "香料石砖", - "block.betterend.flavolite_bricks_slab": "香料石砖台阶", - "block.betterend.flavolite_bricks_stairs": "香料石砖楼梯", - "block.betterend.flavolite_bricks_wall": "香料石砖墙", - "block.betterend.flavolite_button": "香料石按钮", - "block.betterend.flavolite_pillar": "香料石柱", - "block.betterend.flavolite_plate": "香料石压力板", - "block.betterend.flavolite_slab": "香料石台阶", - "block.betterend.flavolite_tiles": "香料石瓷砖", - "block.betterend.flavolite_stairs": "香料石楼梯", - "block.betterend.flavolite_polished": "磨制香料石", - "block.betterend.flavolite_wall": "香料石墙", - "block.betterend.flavolite_pedestal": "香料石基座", + "block.betterend.flavolite": "苍黄石", + "block.betterend.flavolite_bricks": "苍黄石砖", + "block.betterend.flavolite_bricks_slab": "苍黄石砖台阶", + "block.betterend.flavolite_bricks_stairs": "苍黄石砖楼梯", + "block.betterend.flavolite_bricks_wall": "苍黄石砖墙", + "block.betterend.flavolite_button": "苍黄石按钮", + "block.betterend.flavolite_pillar": "苍黄石柱", + "block.betterend.flavolite_plate": "苍黄石压力板", + "block.betterend.flavolite_slab": "苍黄石台阶", + "block.betterend.flavolite_tiles": "苍黄石瓷砖", + "block.betterend.flavolite_stairs": "苍黄石楼梯", + "block.betterend.flavolite_polished": "磨制苍黄石", + "block.betterend.flavolite_wall": "苍黄石墙", + "block.betterend.flavolite_pedestal": "苍黄石基座", "block.betterend.andesite_pedestal": "安山岩基座", "block.betterend.diorite_pedestal": "闪长岩基座", @@ -173,71 +183,71 @@ "block.betterend.end_lotus_seed": "末地莲种子", "block.betterend.end_lotus_stem": "末地莲茎", - "block.betterend.end_lotus_leaf": "末地莲叶", + "block.betterend.end_lotus_leaf": "末地莲树", "block.betterend.end_lotus_flower": "末地莲花", - "block.betterend.end_lotus_bark": "末地莲树皮", + "block.betterend.end_lotus_bark": "末地莲木", "block.betterend.end_lotus_barrel": "末地莲木桶", - "block.betterend.end_lotus_button": "末地莲按钮", - "block.betterend.end_lotus_chest": "末地莲箱", - "block.betterend.end_lotus_crafting_table": "末地莲工作台", - "block.betterend.end_lotus_door": "末地莲门", - "block.betterend.end_lotus_fence": "末地莲栅栏", - "block.betterend.end_lotus_gate": "末地莲栅栏门", - "block.betterend.end_lotus_ladder": "末地莲梯", + "block.betterend.end_lotus_button": "末地莲木按钮", + "block.betterend.end_lotus_chest": "末地莲木箱", + "block.betterend.end_lotus_crafting_table": "末地莲木工作台", + "block.betterend.end_lotus_door": "末地莲木门", + "block.betterend.end_lotus_fence": "末地莲木栅栏", + "block.betterend.end_lotus_gate": "末地莲木栅栏门", + "block.betterend.end_lotus_ladder": "末地莲木梯", "block.betterend.end_lotus_log": "末地莲原木", "block.betterend.end_lotus_planks": "末地莲木板", - "block.betterend.end_lotus_plate": "末地莲压力板", - "block.betterend.end_lotus_sign": "末地莲告示牌", + "block.betterend.end_lotus_plate": "末地莲木压力板", + "block.betterend.end_lotus_sign": "末地莲木告示牌", "block.betterend.end_lotus_slab": "末地莲台阶", - "block.betterend.end_lotus_stairs": "末地莲楼梯", - "block.betterend.end_lotus_stripped_bark": "去皮末地莲树皮", + "block.betterend.end_lotus_stairs": "末地莲木楼梯", + "block.betterend.end_lotus_stripped_bark": "去皮末地莲木", "block.betterend.end_lotus_stripped_log": "去皮末地莲原木", - "block.betterend.end_lotus_trapdoor": "末地莲活板门", + "block.betterend.end_lotus_trapdoor": "末地莲木活板门", "block.betterend.cave_moss": "洞穴苔藓", - "block.betterend.cave_grass": "洞穴草丛", + "block.betterend.cave_grass": "洞穴草", "block.betterend.cave_bush": "洞穴灌木", "block.betterend.cave_moss_path": "洞穴苔藓径", "block.betterend.crystal_moss": "水晶苔藓", "block.betterend.crystal_moss_path": "水晶苔藓径", - "block.betterend.pythadendron_leaves": "咏唱木树叶", + "block.betterend.pythadendron_leaves": "毕达树叶", "item.betterend.spawn_egg_end_fish": "末地鱼刷怪蛋", - "block.betterend.crystal_grass": "水晶草丛", + "block.betterend.crystal_grass": "水晶草", - "block.betterend.flavolite_runed": "符文香料石", + "block.betterend.flavolite_runed": "符文苍黄石", "block.betterend.end_portal_block": "末地传送门", "block.betterend.eternal_pedestal": "永恒基座", - "block.betterend.flavolite_runed_eternal": "永恒符文香料石", + "block.betterend.flavolite_runed_eternal": "永恒符文苍黄石", "item.betterend.eternal_crystal": "永恒水晶", - "block.betterend.lacugrove_bark": "林泊木树皮", - "block.betterend.lacugrove_barrel": "林泊木桶", - "block.betterend.lacugrove_button": "林泊木按钮", - "block.betterend.lacugrove_chest": "林泊木箱", - "block.betterend.lacugrove_crafting_table": "林泊木工作台", - "block.betterend.lacugrove_door": "林泊木门", - "block.betterend.lacugrove_fence": "林泊木栅栏", - "block.betterend.lacugrove_gate": "林泊木栅栏门", - "block.betterend.lacugrove_ladder": "林泊木梯", - "block.betterend.lacugrove_log": "林泊木原木", - "block.betterend.lacugrove_planks": "林泊木木板", - "block.betterend.lacugrove_plate": "林泊木压力板", - "block.betterend.lacugrove_sign": "林泊木告示牌", - "block.betterend.lacugrove_slab": "林泊木台阶", - "block.betterend.lacugrove_stairs": "林泊木楼梯", - "block.betterend.lacugrove_stripped_bark": "去皮林泊木树皮", - "block.betterend.lacugrove_stripped_log": "去皮林泊木原木", - "block.betterend.lacugrove_trapdoor": "林泊木活板门", + "block.betterend.lacugrove_bark": "泊树林木", + "block.betterend.lacugrove_barrel": "泊树林木桶", + "block.betterend.lacugrove_button": "泊树林木按钮", + "block.betterend.lacugrove_chest": "泊树林木箱", + "block.betterend.lacugrove_crafting_table": "泊树林木工作台", + "block.betterend.lacugrove_door": "泊树林木门", + "block.betterend.lacugrove_fence": "泊树林木栅栏", + "block.betterend.lacugrove_gate": "泊树林木栅栏门", + "block.betterend.lacugrove_ladder": "泊树林木梯", + "block.betterend.lacugrove_log": "泊树林原木", + "block.betterend.lacugrove_planks": "泊树林木板", + "block.betterend.lacugrove_plate": "泊树林木压力板", + "block.betterend.lacugrove_sign": "泊树林木告示牌", + "block.betterend.lacugrove_slab": "泊树林木台阶", + "block.betterend.lacugrove_stairs": "泊树林木楼梯", + "block.betterend.lacugrove_stripped_bark": "去皮泊树林木", + "block.betterend.lacugrove_stripped_log": "去皮泊树林原木", + "block.betterend.lacugrove_trapdoor": "泊树林木活板门", - "block.betterend.lacugrove_leaves": "林泊木树叶", - "block.betterend.lacugrove_sapling": "林泊木树苗", + "block.betterend.lacugrove_leaves": "泊树林树叶", + "block.betterend.lacugrove_sapling": "泊树林树苗", - "biome.betterend.megalake_grove": "巨泊树林", - "biome.betterend.painted_mountains": "点缀过的山地", + "biome.betterend.megalake_grove": "巨型湖泊树林", + "biome.betterend.painted_mountains": "彩绘山脉", - "block.betterend.dragon_tree_bark": "龙鳞木树皮", + "block.betterend.dragon_tree_bark": "龙鳞木", "block.betterend.dragon_tree_barrel": "龙鳞木桶", "block.betterend.dragon_tree_button": "龙鳞木按钮", "block.betterend.dragon_tree_chest": "龙鳞木箱", @@ -247,48 +257,46 @@ "block.betterend.dragon_tree_gate": "龙鳞木栅栏门", "block.betterend.dragon_tree_ladder": "龙鳞木梯", "block.betterend.dragon_tree_log": "龙鳞木原木", - "block.betterend.dragon_tree_planks": "龙鳞木木板", + "block.betterend.dragon_tree_planks": "龙鳞木板", "block.betterend.dragon_tree_plate": "龙鳞木压力板", "block.betterend.dragon_tree_sign": "龙鳞木告示牌", "block.betterend.dragon_tree_slab": "龙鳞木台阶", "block.betterend.dragon_tree_stairs": "龙鳞木楼梯", - "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞木树皮", + "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞木", "block.betterend.dragon_tree_stripped_log": "去皮龙鳞木原木", "block.betterend.dragon_tree_trapdoor": "龙鳞木活板门", "biome.betterend.shadow_forest": "黯影森林", - "block.betterend.dragon_tree_leaves": "龙鳞木树叶", - "block.betterend.dragon_tree_sapling": "龙鳞木树苗", - "block.betterend.shadow_grass": "黯影草地", + "block.betterend.dragon_tree_leaves": "龙鳞树叶", + "block.betterend.dragon_tree_sapling": "龙鳞树苗", + "block.betterend.shadow_grass": "黯影草", "block.betterend.shadow_grass_path": "黯影草径", "block.betterend.shadow_plant": "黯影植物", "block.betterend.dragon_tree_bookshelf": "龙鳞木书架", - "block.betterend.end_lotus_bookshelf": "末地莲书架", - "block.betterend.lacugrove_bookshelf": "林泊木书架", - "block.betterend.mossy_glowshroom_bookshelf": "苔光菇书架", - "block.betterend.pythadendron_bookshelf": "咏唱木书架", + "block.betterend.end_lotus_bookshelf": "末地莲木书架", + "block.betterend.lacugrove_bookshelf": "泊树林木书架", + "block.betterend.mossy_glowshroom_bookshelf": "苔光菇木书架", + "block.betterend.pythadendron_bookshelf": "毕达木书架", "block.betterend.murkweed": "黝黯草", - "block.betterend.needlegrass": "针芒草", - "block.betterend.twisted_vine": "扭曲藤", + "block.betterend.needlegrass": "针茅草", + "block.betterend.twisted_vine": "蜷曲藤", "block.betterend.shadow_berry": "黯影浆果种子", "item.betterend.shadow_berry_cooked": "熟黯影浆果", - "item.betterend.shadow_berry_raw": "黯影浆果", + "item.betterend.shadow_berry_raw": "生黯影浆果", "block.betterend.purple_polypore": "紫色多孔菌", "block.betterend.cyan_moss": "青色苔藓", - "block.betterend.tail_moss": "尾状苔藓", + "block.betterend.tail_moss": "鼠尾苔藓", - "block.betterend.flavolite_lantern": "香料石灯笼", + "block.betterend.flavolite_lantern": "苍黄石灯笼", "block.betterend.end_stone_lantern": "末地石灯笼", "block.betterend.violecite_lantern": "紫罗兰石灯笼", - "biome.betterend.dragonfly": "蜻蜓", - "biome.betterend.end_fish": "末地鱼", - "biome.betterend.end_slime": "末地史莱姆", - "biome.betterend.shadow_walker": "黯影行者", + "entity.betterend.end_fish": "末地鱼", + "entity.betterend.shadow_walker": "黯影行者", "item.betterend.spawn_egg_shadow_walker": "黯影行者刷怪蛋", "block.betterend.andesite_lantern": "安山岩灯笼", @@ -300,5 +308,246 @@ "item.betterend.bucket_end_fish": "末地鱼桶", "item.betterend.end_fish_cooked": "熟末地鱼", - "item.betterend.end_fish_raw": "末地鱼" + "item.betterend.end_fish_raw": "生末地鱼", + + "biome.betterend.amber_land": "琥珀岛", + "biome.betterend.blossoming_spires": "花开尖塔", + "block.betterend.amber_grass": "琥珀草方块", + "block.betterend.amber_grass_path": "琥珀草径", + "block.betterend.tenanea_bark": "十纹木", + "block.betterend.tenanea_barrel": "十纹木桶", + "block.betterend.tenanea_bookshelf": "十纹木书架", + "block.betterend.tenanea_button": "十纹木按钮", + "block.betterend.tenanea_chest": "十纹木箱", + "block.betterend.tenanea_crafting_table": "十纹木工作台", + "block.betterend.tenanea_door": "十纹木门", + "block.betterend.tenanea_fence": "十纹木栅栏", + "block.betterend.tenanea_gate": "十纹木栅栏门", + "block.betterend.tenanea_ladder": "十纹木梯", + "block.betterend.tenanea_leaves": "十纹树叶", + "block.betterend.tenanea_log": "十纹木原木", + "block.betterend.tenanea_planks": "十纹木板", + "block.betterend.tenanea_plate": "十纹木压力板", + "block.betterend.tenanea_sapling": "十纹树苗", + "block.betterend.tenanea_sign": "十纹木告示牌", + "block.betterend.tenanea_slab": "十纹木台阶", + "block.betterend.tenanea_stairs": "十纹木楼梯", + "block.betterend.tenanea_stripped_bark": "去皮十纹木", + "block.betterend.tenanea_stripped_log": "去皮十纹木原木", + "block.betterend.tenanea_trapdoor": "十纹木活板门", + + "block.betterend.amber_block": "琥珀块", + "block.betterend.amber_ore": "琥珀矿石", + "item.betterend.amber_gem": "琥珀", + "item.betterend.raw_amber": "生琥珀", + "block.betterend.tenanea_flowers": "十纹花藤", + "block.betterend.tenanea_outer_leaves": "十纹树叶(外层)", + + "block.betterend.pink_moss": "粉色苔藓", + "block.betterend.pink_moss_path": "粉色苔藓径", + + "block.betterend.twisted_moss": "蜷曲苔藓", + + "block.betterend.bulb_vine": "灯泡藤", + "block.betterend.bulb_lantern": "灯泡灯笼", + "block.betterend.bulb_vine_seed": "灯泡藤种子", + "item.betterend.glowing_bulb": "发光灯泡果", + + "block.betterend.bulb_lantern_black": "黑色灯泡灯笼", + "block.betterend.bulb_lantern_blue": "蓝色灯泡灯笼", + "block.betterend.bulb_lantern_brown": "棕色灯泡灯笼", + "block.betterend.bulb_lantern_cyan": "青色灯泡灯笼", + "block.betterend.bulb_lantern_gray": "灰色灯泡灯笼", + "block.betterend.bulb_lantern_green": "绿色灯泡灯笼", + "block.betterend.bulb_lantern_light_blue": "淡蓝色灯泡灯笼", + "block.betterend.bulb_lantern_light_gray": "淡灰色灯泡灯笼", + "block.betterend.bulb_lantern_lime": "黄绿色灯泡灯笼", + "block.betterend.bulb_lantern_magenta": "品红色灯泡灯笼", + "block.betterend.bulb_lantern_orange": "橙色灯泡灯笼", + "block.betterend.bulb_lantern_pink": "粉色灯泡灯笼", + "block.betterend.bulb_lantern_purple": "紫色灯泡灯笼", + "block.betterend.bulb_lantern_red": "红色灯泡灯笼", + "block.betterend.bulb_lantern_white": "白色灯泡灯笼", + "block.betterend.bulb_lantern_yellow": "黄色灯泡灯笼", + + "block.betterend.bushy_grass": "丛藓", + + "block.betterend.brimstone": "硫磺石", + "block.betterend.sulphuric_rock": "硫磺岩", + "block.betterend.sulphuric_rock_bricks": "硫磺岩砖", + "block.betterend.sulphuric_rock_bricks_slab": "硫磺岩砖台阶", + "block.betterend.sulphuric_rock_bricks_stairs": "硫磺岩砖楼梯", + "block.betterend.sulphuric_rock_bricks_wall": "硫磺岩砖墙", + "block.betterend.sulphuric_rock_button": "硫磺岩按钮", + "block.betterend.sulphuric_rock_lantern": "硫磺岩灯笼", + "block.betterend.sulphuric_rock_pedestal": "硫磺岩基座", + "block.betterend.sulphuric_rock_pillar": "硫磺岩柱", + "block.betterend.sulphuric_rock_plate": "硫磺岩压力板", + "block.betterend.sulphuric_rock_polished": "磨制硫磺岩", + "block.betterend.sulphuric_rock_slab": "硫磺岩台阶", + "block.betterend.sulphuric_rock_stairs": "硫磺岩楼梯", + "block.betterend.sulphuric_rock_tiles": "硫磺岩瓷砖", + "block.betterend.sulphuric_rock_wall": "硫磺岩墙", + "block.betterend.sulphur_crystal": "硫磺结晶", + "item.betterend.crystalline_sulphur": "硫磺", + + "biome.betterend.sulphur_springs": "硫磺矿泉", + "block.betterend.hydralux_petal_block": "水生勒克斯花瓣块", + "block.betterend.hydralux_petal_block_black": "黑色花瓣块", + "block.betterend.hydralux_petal_block_blue": "蓝色花瓣块", + "block.betterend.hydralux_petal_block_brown": "棕色花瓣块", + "block.betterend.hydralux_petal_block_cyan": "青色花瓣块", + "block.betterend.hydralux_petal_block_gray": "灰色花瓣块", + "block.betterend.hydralux_petal_block_green": "绿色花瓣块", + "block.betterend.hydralux_petal_block_light_blue": "淡蓝色花瓣块", + "block.betterend.hydralux_petal_block_light_gray": "淡灰色花瓣块", + "block.betterend.hydralux_petal_block_lime": "黄绿色花瓣块", + "block.betterend.hydralux_petal_block_magenta": "品红色花瓣块", + "block.betterend.hydralux_petal_block_orange": "橙色花瓣块", + "block.betterend.hydralux_petal_block_pink": "粉色花瓣块", + "block.betterend.hydralux_petal_block_purple": "紫色花瓣块", + "block.betterend.hydralux_petal_block_red": "红色花瓣块", + "block.betterend.hydralux_petal_block_white": "白色花瓣块", + "block.betterend.hydralux_petal_block_yellow": "黄色花瓣块", + "block.betterend.hydralux_sapling": "水生勒克斯幼苗", + "block.betterend.hydrothermal_vent": "热泉排气孔", + "item.betterend.hydralux_petal": "水生勒克斯花瓣", + + "block.betterend.menger_sponge": "门格海绵", + "block.betterend.menger_sponge_wet": "湿门格海绵", + "block.betterend.tube_worm": "管栖蠕虫", + + "block.betterend.charnia_cyan": "青色查恩海笔", + "block.betterend.charnia_light_blue": "淡蓝色查恩海笔", + "block.betterend.charnia_orange": "橙色查恩海笔", + "block.betterend.charnia_purple": "紫色查恩海笔", + "block.betterend.charnia_red": "红色查恩海笔", + + "entity.betterend.cubozoa": "箱水母", + "item.betterend.spawn_egg_cubozoa": "箱水母刷怪蛋", + + "item.betterend.gelatine": "水母凝胶", + "item.betterend.sweet_berry_jelly": "甜浆果冻", + "item.betterend.shadow_berry_jelly": "黯影浆果冻", + + "block.betterend.amber_moss": "琥珀苔藓", + "block.betterend.amber_moss_path": "琥珀苔藓径", + "block.betterend.helix_tree_bark": "螺旋木", + "block.betterend.helix_tree_barrel": "螺旋木桶", + "block.betterend.helix_tree_bookshelf": "螺旋木书架", + "block.betterend.helix_tree_button": "螺旋木按钮", + "block.betterend.helix_tree_chest": "螺旋木箱", + "block.betterend.helix_tree_crafting_table": "螺旋木工作台", + "block.betterend.helix_tree_door": "螺旋木门", + "block.betterend.helix_tree_fence": "螺旋木栅栏", + "block.betterend.helix_tree_gate": "螺旋木栅栏门", + "block.betterend.helix_tree_ladder": "螺旋木梯", + "block.betterend.helix_tree_leaves": "螺旋树叶", + "block.betterend.helix_tree_log": "螺旋木原木", + "block.betterend.helix_tree_planks": "螺旋木板", + "block.betterend.helix_tree_plate": "螺旋木压力板", + "block.betterend.helix_tree_sapling": "螺旋树苗", + "block.betterend.helix_tree_sign": "螺旋木告示牌", + "block.betterend.helix_tree_slab": "螺旋木台阶", + "block.betterend.helix_tree_stairs": "螺旋木楼梯", + "block.betterend.helix_tree_stripped_bark": "去皮螺旋木", + "block.betterend.helix_tree_stripped_log": "去皮螺旋木原木", + "block.betterend.helix_tree_trapdoor": "螺旋木活板门", + "block.betterend.lanceleaf": "兰塞尔叶", + "block.betterend.lanceleaf_seed": "兰塞尔叶种子", + "block.betterend.hydralux": "水生勒克斯", + "block.betterend.helix_tree_luminophor": "螺旋树发光体", + + "block.betterend.glowing_pillar_leaves": "发光楹树叶", + "block.betterend.glowing_pillar_luminophor": "发光楹发光体", + "block.betterend.glowing_pillar_roots": "发光楹菌索", + "block.betterend.glowing_pillar_seed": "发光楹种子", + + "biome.betterend.ice_starfield": "冰晶星空", + + "block.betterend.ancient_emerald_ice": "远古翡翠冰", + "block.betterend.dense_emerald_ice": "紧实的翡翠冰", + "block.betterend.dense_snow": "紧实的雪", + "block.betterend.emerald_ice": "翡翠冰", + + "block.betterend.bulb_moss": "灯泡 苔藓", + + "block.betterend.charnia_green": "绿色查恩海笔", + "block.betterend.vent_bubble_column": "气泡柱排气口", + "block.betterend.respawn_obelisk": "重生方尖碑", + "message.betterend.set_spawn": "\u00A7b\u00A7l你的出生点已设置在这", + "message.betterend.fail_spawn": "\u00A7c\u00A7l你需要拿着6个琥珀宝石才能设置出生点!", + + "block.betterend.dragon_tree_composter": "龙鳞木堆肥桶", + "block.betterend.end_lotus_composter": "末地莲木堆肥桶", + "block.betterend.helix_tree_composter": "螺旋木堆肥桶", + "block.betterend.lacugrove_composter": "泊树林木堆肥桶", + "block.betterend.mossy_glowshroom_composter": "苔光菇木堆肥桶", + "block.betterend.pythadendron_composter": "毕达木堆肥桶", + "block.betterend.tenanea_composter": "十纹木堆肥桶", + + "biome.betterend.old_bulbis_gardens": "旧灯泡花园", + "block.betterend.ivis_moss": "常青藓", + "block.betterend.ivis_vine": "常青藤", + "block.betterend.silk_moth_nest": "蚕蛾巢", + + "block.betterend.umbrella_tree_bark": "胶伞木", + "block.betterend.umbrella_tree_barrel": "胶伞木桶", + "block.betterend.umbrella_tree_bookshelf": "胶伞树书架", + "block.betterend.umbrella_tree_button": "胶伞木按钮", + "block.betterend.umbrella_tree_chest": "胶伞木箱", + "block.betterend.umbrella_tree_composter": "胶伞木堆肥桶", + "block.betterend.umbrella_tree_crafting_table": "胶伞树工作台", + "block.betterend.umbrella_tree_door": "胶伞木门", + "block.betterend.umbrella_tree_fence": "胶伞木栅栏", + "block.betterend.umbrella_tree_gate": "胶伞木栅栏门", + "block.betterend.umbrella_tree_ladder": "胶伞木梯", + "block.betterend.umbrella_tree_log": "胶伞木原木", + "block.betterend.umbrella_tree_planks": "胶伞木板", + "block.betterend.umbrella_tree_plate": "胶伞木压力板", + "block.betterend.umbrella_tree_sign": "胶伞木告示牌", + "block.betterend.umbrella_tree_slab": "胶伞木台阶", + "block.betterend.umbrella_tree_stairs": "胶伞木楼梯", + "block.betterend.umbrella_tree_stripped_bark": "去皮胶伞木", + "block.betterend.umbrella_tree_stripped_log": "去皮胶伞木原木", + "block.betterend.umbrella_tree_trapdoor": "胶伞木活板门", + "block.betterend.umbrella_tree_membrane": "胶伞树膜", + + "biome.betterend.umbrella_jungle": "胶伞丛林", + "block.betterend.jungle_grass": "丛林草", + "block.betterend.jungle_moss": "丛林苔藓", + "block.betterend.jungle_moss_path": "丛林苔藓径", + "block.betterend.small_jellyshroom": "小果冻菌", + "block.betterend.twisted_umbrella_moss": "蜷曲伞状苔藓", + "block.betterend.twisted_umbrella_moss_tall": "高蜷曲伞状苔藓", + "block.betterend.umbrella_tree_cluster": "胶伞树花簇", + "block.betterend.umbrella_tree_cluster_empty": "空的胶伞树花簇", + "block.betterend.jungle_vine": "丛林藤", + "block.betterend.jungle_fern": "丛林蕨", + + "block.betterend.jellyshroom_bark": "果冻菌柄", + "block.betterend.jellyshroom_barrel": "果冻菌木桶", + "block.betterend.jellyshroom_bookshelf": "果冻菌书架", + "block.betterend.jellyshroom_button": "果冻菌木按钮", + "block.betterend.jellyshroom_cap_purple": "紫色果冻菌盖", + "block.betterend.jellyshroom_chest": "果冻菌木箱", + "block.betterend.jellyshroom_composter": "果冻菌木堆肥桶", + "block.betterend.jellyshroom_crafting_table": "果冻菌木工作台", + "block.betterend.jellyshroom_door": "果冻菌木门", + "block.betterend.jellyshroom_fence": "果冻菌木栅栏", + "block.betterend.jellyshroom_gate": "果冻菌木栅栏门", + "block.betterend.jellyshroom_ladder": "果冻菌木梯", + "block.betterend.jellyshroom_log": "果冻菌原木", + "block.betterend.jellyshroom_planks": "果冻菌木板", + "block.betterend.jellyshroom_plate": "果冻菌木压力板", + "block.betterend.jellyshroom_sign": "果冻菌木告示牌", + "block.betterend.jellyshroom_slab": "果冻菌木台阶", + "block.betterend.jellyshroom_stairs": "果冻菌木楼梯", + "block.betterend.jellyshroom_stripped_bark": "去皮果冻菌柄", + "block.betterend.jellyshroom_stripped_log": "去皮果冻菌原木", + "block.betterend.jellyshroom_trapdoor": "果冻菌活板门", + + "biome.betterend.eterial_grove": "永恒树林", + "block.betterend.umbrella_tree_sapling": "胶伞树苗", + "item.betterend.umbrella_cluster_juice": "胶伞花簇果汁" } diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_blue.json rename to src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_orange.json rename to src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_chandelier.json b/src/main/resources/assets/betterend/lights/item/gold_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/gold_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_black.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_brown.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_cyan.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_gray.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_green.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_light_blue.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_light_gray.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_lime.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_magenta.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_pink.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_purple.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_red.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_white.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_yellow.json rename to src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json diff --git a/src/main/resources/assets/betterend/lights/item/iron_chandelier.json b/src/main/resources/assets/betterend/lights/item/iron_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_black.json new file mode 100644 index 00000000..26b54a96 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_black.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.1, + "green": 0.1, + "blue": 0.1, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_blue.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_brown.json new file mode 100644 index 00000000..0936aeb3 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_brown.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.32, + "green": 0.18, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_cyan.json new file mode 100644 index 00000000..f21fd061 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_cyan.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_gray.json new file mode 100644 index 00000000..38131230 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.3, + "green": 0.3, + "blue": 0.3, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_green.json new file mode 100644 index 00000000..fa215316 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_green.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_blue.json new file mode 100644 index 00000000..55a59fe6 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_gray.json new file mode 100644 index 00000000..4d9bc9b4 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_lime.json new file mode 100644 index 00000000..44c23281 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_lime.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_magenta.json new file mode 100644 index 00000000..4884ec74 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_magenta.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_orange.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_orange.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_pink.json new file mode 100644 index 00000000..9aaba1df --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_pink.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_purple.json new file mode 100644 index 00000000..11d0542e --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_purple.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_red.json new file mode 100644 index 00000000..801dd380 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_red.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_white.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_white.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_yellow.json new file mode 100644 index 00000000..92c63bba --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_yellow.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json b/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json new file mode 100644 index 00000000..26b54a96 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.1, + "green": 0.1, + "blue": 0.1, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json new file mode 100644 index 00000000..0936aeb3 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.32, + "green": 0.18, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json new file mode 100644 index 00000000..f21fd061 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json new file mode 100644 index 00000000..38131230 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.3, + "green": 0.3, + "blue": 0.3, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json new file mode 100644 index 00000000..fa215316 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json new file mode 100644 index 00000000..55a59fe6 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json new file mode 100644 index 00000000..4d9bc9b4 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json new file mode 100644 index 00000000..44c23281 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json new file mode 100644 index 00000000..4884ec74 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json new file mode 100644 index 00000000..9aaba1df --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json new file mode 100644 index 00000000..11d0542e --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json new file mode 100644 index 00000000..801dd380 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json new file mode 100644 index 00000000..92c63bba --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/aeridium.json b/src/main/resources/assets/betterend/materialmaps/block/aeridium.json new file mode 100644 index 00000000..83329294 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/aeridium.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50_blue" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json b/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json new file mode 100644 index 00000000..5879aa38 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall_inverted_glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json rename to src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json new file mode 100644 index 00000000..157b99b4 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/azure_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json b/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json b/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json b/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json index a9fa165f..e1736ac5 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json +++ b/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:waving_glow_50_blue" + "defaultMaterial": "betterend:waving_glow_80_blue" } diff --git a/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json b/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json new file mode 100644 index 00000000..256acaf2 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json @@ -0,0 +1,14 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/cave_pumpkin_lantern_side", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/cave_pumpkin_lantern_bottom", + "material": "betterend:glow_inc" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/clawfern.json b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json b/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json index 3b73d687..3af6aa5a 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json +++ b/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json @@ -3,7 +3,7 @@ "spriteMap": [ { "sprite": "betterend:block/creeping_moss_spores", - "material": "betterend:wave_glow_50_half" + "material": "betterend:waving_floor_glow_half" }, { "sprite": "betterend:block/creeping_moss_leaves", diff --git a/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json b/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json b/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json new file mode 100644 index 00000000..5d23c84f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_purple" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/filalux.json b/src/main/resources/assets/betterend/materialmaps/block/filalux.json new file mode 100644 index 00000000..3b0f7feb --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/filalux.json @@ -0,0 +1,14 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/filalux_bottom", + "material": "betterend:waving_glow_inc" + }, + { + "sprite": "betterend:block/filalux_middle", + "material": "betterend:waving" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/flamaea.json b/src/main/resources/assets/betterend/materialmaps/block/flamaea.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flamaea.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json new file mode 100644 index 00000000..9e241063 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/flavolite_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json b/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json new file mode 100644 index 00000000..5d23c84f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_purple" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/fracturn.json b/src/main/resources/assets/betterend/materialmaps/block/fracturn.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/fracturn.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/globulagus.json b/src/main/resources/assets/betterend/materialmaps/block/globulagus.json new file mode 100644 index 00000000..de846edf --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/globulagus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_black.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_blue.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_brown.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_cyan.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_gray.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_green.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_blue.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_gray.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_lime.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_magenta.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_orange.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_pink.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_purple.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_red.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_white.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_yellow.json rename to src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json new file mode 100644 index 00000000..11187571 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json @@ -0,0 +1,42 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/jungle_fern_leaf", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_leaf_2", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_leaf_3", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_middle", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_middle_2", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_middle_3", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_spore", + "material": "betterend:waving_small" + }, + { + "sprite": "betterend:block/jungle_fern_spore_2", + "material": "betterend:waving_small" + }, + { + "sprite": "betterend:block/jungle_fern_spore_3", + "material": "betterend:waving_small" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json b/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json new file mode 100644 index 00000000..1fc9123d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json b/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json b/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json new file mode 100644 index 00000000..c3f7bd4d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/large_amaranita_cap_bottom", + "material": "betterend:glow_green_2" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json new file mode 100644 index 00000000..11eeb91f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:leaves_noshade" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json new file mode 100644 index 00000000..45210670 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json new file mode 100644 index 00000000..5b4926ac --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json @@ -0,0 +1,34 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/lumecorn_light_bottom", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_middle", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_top_middle", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_top", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_leaf_2", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/lumecorn_leaf_1", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/lumecorn_big_petal", + "material": "betterend:waving" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lutebus.json b/src/main/resources/assets/betterend/materialmaps/block/lutebus.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lutebus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json new file mode 100644 index 00000000..36ea95c2 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_80_cyan" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/orango.json b/src/main/resources/assets/betterend/materialmaps/block/orango.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/orango.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json b/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/rubinea.json b/src/main/resources/assets/betterend/materialmaps/block/rubinea.json new file mode 100644 index 00000000..1fc9123d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/rubinea.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/ruscus.json b/src/main/resources/assets/betterend/materialmaps/block/ruscus.json new file mode 100644 index 00000000..45210670 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/ruscus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/salteago.json b/src/main/resources/assets/betterend/materialmaps/block/salteago.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/salteago.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json new file mode 100644 index 00000000..10ce1422 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/sandy_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json new file mode 100644 index 00000000..be8b6e0f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/sulphuric_rock_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json new file mode 100644 index 00000000..40da75b3 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json @@ -0,0 +1,22 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/twisted_umbrella_moss_sporophyte", + "material": "betterend:wave_glow_all" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_small", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_up", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_end", + "material": "betterend:waving_floor" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..6bf927c7 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json @@ -0,0 +1,22 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/twisted_umbrella_moss_sporophyte", + "material": "betterend:wave_glow_all" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_up", + "material": "betterend:waving" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_end", + "material": "betterend:waving" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_bottom", + "material": "betterend:waving_floor" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json b/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json b/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json new file mode 100644 index 00000000..d8868020 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/violecite_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json new file mode 100644 index 00000000..ced57eae --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/virid_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/item/aeridium.json b/src/main/resources/assets/betterend/materialmaps/item/aeridium.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/aeridium.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json b/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json b/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/clawfern.json b/src/main/resources/assets/betterend/materialmaps/item/clawfern.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/clawfern.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/filalux.json b/src/main/resources/assets/betterend/materialmaps/item/filalux.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/filalux.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/fracturn.json b/src/main/resources/assets/betterend/materialmaps/item/fracturn.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/fracturn.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/globulagus.json b/src/main/resources/assets/betterend/materialmaps/item/globulagus.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/globulagus.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json b/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json b/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json new file mode 100644 index 00000000..36db9946 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lutebus.json b/src/main/resources/assets/betterend/materialmaps/item/lutebus.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lutebus.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/orango.json b/src/main/resources/assets/betterend/materialmaps/item/orango.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/orango.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/rubinea.json b/src/main/resources/assets/betterend/materialmaps/item/rubinea.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/rubinea.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/salteago.json b/src/main/resources/assets/betterend/materialmaps/item/salteago.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/salteago.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json b/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json b/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/particle/firefly.json b/src/main/resources/assets/betterend/materialmaps/particle/firefly.json new file mode 100644 index 00000000..ab909d8e --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/particle/firefly.json @@ -0,0 +1,3 @@ +{ + "material": "canvas:emissive_no_diffuse" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json b/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json new file mode 100644 index 00000000..ab909d8e --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json @@ -0,0 +1,3 @@ +{ + "material": "canvas:emissive_no_diffuse" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materials/glow_65.json b/src/main/resources/assets/betterend/materials/glow_65.json new file mode 100644 index 00000000..4df0ffa1 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_65.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_65.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/glow_80_blue.json b/src/main/resources/assets/betterend/materials/glow_80_blue.json new file mode 100644 index 00000000..57abfb68 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_80_blue.json @@ -0,0 +1,8 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_80_blue.frag" + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/glow_80_cyan.json b/src/main/resources/assets/betterend/materials/glow_80_cyan.json new file mode 100644 index 00000000..1a103f39 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_80_cyan.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_80_cyan.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/glow_green.json b/src/main/resources/assets/betterend/materials/glow_green.json new file mode 100644 index 00000000..952f0717 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_green.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_green.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/glow_green_2.json b/src/main/resources/assets/betterend/materials/glow_green_2.json new file mode 100644 index 00000000..4ce910e1 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_green_2.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_green_2.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json b/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json new file mode 100644 index 00000000..25d1427b --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave_floor.vert", + "fragmentSource": "betterend:shaders/material/glow_green_2.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json b/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json new file mode 100644 index 00000000..6217c243 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave_floor.vert", + "fragmentSource": "betterend:shaders/material/glow_all_half.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json b/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json new file mode 100644 index 00000000..478d4ac3 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json @@ -0,0 +1,8 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave.vert", + "fragmentSource": "betterend:shaders/material/glow_80_blue.frag" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/aeridium_01.json b/src/main/resources/assets/betterend/models/block/aeridium_01.json new file mode 100644 index 00000000..7c2d6701 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aeridium_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/aeridium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/aeridium_02.json b/src/main/resources/assets/betterend/models/block/aeridium_02.json new file mode 100644 index 00000000..37ebd850 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aeridium_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/aeridium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_fur.json b/src/main/resources/assets/betterend/models/block/amaranita_fur.json new file mode 100644 index 00000000..2d30f61f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_fur.json @@ -0,0 +1,75 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_fur", + "texture": "betterend:block/amaranita_fur" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -8 ], + "to": [ 16, 0, 8 ], + "rotation": { "origin": [ 0, 0, 8 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 8 ], + "to": [ 16, 0.001, 24 ], + "rotation": { "origin": [ 0, 0.000000954, 8 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 8, -0.001, 0 ], + "to": [ 24, 0, 16 ], + "rotation": { "origin": [ 8, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -8, 0, 2 ], + "to": [ 8, 0.001, 18 ], + "rotation": { "origin": [ 8, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json b/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json new file mode 100644 index 00000000..71b5a46c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_hymenophore_fur", + "texture": "betterend:block/amaranita_hymenophore_fur" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 5, 12, 0 ], + "to": [ 5.001, 16, 16 ], + "faces": { + "west": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 12, 0 ], + "to": [ 11.001, 16, 16 ], + "faces": { + "west": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 16, 12, 0 ], + "to": [ 16.001, 16, 16 ], + "faces": { + "west": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 0, 12, 0 ], + "to": [ 0.001, 16, 16 ], + "faces": { + "west": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 0 ], + "to": [ 16, 16, 0.001 ], + "faces": { + "north": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "south": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 5 ], + "to": [ 16, 16, 5.001 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 11 ], + "to": [ 16, 16, 11.001 ], + "faces": { + "north": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "south": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 16 ], + "to": [ 16, 16, 16.001 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json new file mode 100644 index 00000000..29dec972 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/amaranita_hyphae_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_lantern.json b/src/main/resources/assets/betterend/models/block/amaranita_lantern.json new file mode 100644 index 00000000..ff85ca1a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/amaranita_lantern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_stem.json b/src/main/resources/assets/betterend/models/block/amaranita_stem.json new file mode 100644 index 00000000..ddef4114 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_stem.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/amaranita_hyphae_top", + "east": "betterend:block/amaranita_hyphae_side", + "north": "betterend:block/amaranita_hyphae_side", + "particle": "betterend:block/amaranita_hyphae_side", + "south": "betterend:block/amaranita_hyphae_side", + "up": "betterend:block/amaranita_hyphae_top", + "west": "betterend:block/amaranita_hyphae_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amber_root_0.json b/src/main/resources/assets/betterend/models/block/amber_root_0.json new file mode 100644 index 00000000..b14bcf08 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_1.json b/src/main/resources/assets/betterend/models/block/amber_root_1.json new file mode 100644 index 00000000..3e64c93c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_2.json b/src/main/resources/assets/betterend/models/block/amber_root_2.json new file mode 100644 index 00000000..f8021e7a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_3.json b/src/main/resources/assets/betterend/models/block/amber_root_3.json new file mode 100644 index 00000000..b542e478 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_4.json b/src/main/resources/assets/betterend/models/block/amber_root_4.json new file mode 100644 index 00000000..4edf302e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_5.json b/src/main/resources/assets/betterend/models/block/amber_root_5.json new file mode 100644 index 00000000..c40cb933 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_6.json b/src/main/resources/assets/betterend/models/block/amber_root_6.json new file mode 100644 index 00000000..747cf5bb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_7.json b/src/main/resources/assets/betterend/models/block/amber_root_7.json new file mode 100644 index 00000000..23144eda --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_7.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json new file mode 100644 index 00000000..34b18ae5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json @@ -0,0 +1,153 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 4, 0 ], + "to": [ 8, 7, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 12, 0 ], + "to": [ 15, 15, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 1, 0 ], + "to": [ 15, 3, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 9, 0 ], + "to": [ 7, 11, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 6, 0 ], + "to": [ 15, 8, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 14, 0 ], + "to": [ 6, 16, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 10, 0, 0 ], + "to": [ 14, 1, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 12, 5, 0 ], + "to": [ 14, 6, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 8, 0 ], + "to": [ 6, 9, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 8, 10, 0 ], + "to": [ 14, 12, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 1, 2, 0 ], + "to": [ 7, 4, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 3, 13, 0 ], + "to": [ 5, 14, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json new file mode 100644 index 00000000..1072b074 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json @@ -0,0 +1,105 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 8, 0 ], + "to": [ 9, 11, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 3, 0 ], + "to": [ 11, 5, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 13, 0 ], + "to": [ 14, 15, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 7, 0 ], + "to": [ 15, 9, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 6, 2, 0 ], + "to": [ 10, 3, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 12, 6, 0 ], + "to": [ 14, 7, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 12, 0 ], + "to": [ 13, 13, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 6, 0 ], + "to": [ 8, 8, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json new file mode 100644 index 00000000..ffae55f7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, 6, 0 ], + "to": [ 8, 8, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 13, 0 ], + "to": [ 14, 15, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 8, 0 ], + "to": [ 14, 10, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 3, 5, 0 ], + "to": [ 7, 6, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 11, 7, 0 ], + "to": [ 13, 8, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 12, 0 ], + "to": [ 13, 13, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 11, 0 ], + "to": [ 5, 13, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 10, 0 ], + "to": [ 4, 11, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 2, 0 ], + "to": [ 12, 4, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 1, 0 ], + "to": [ 11, 2, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json new file mode 100644 index 00000000..c68906bb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/blooming_cooksonia" + } +} diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json new file mode 100644 index 00000000..ac276975 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json new file mode 100644 index 00000000..ccaffe10 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json new file mode 100644 index 00000000..703797e8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry.json b/src/main/resources/assets/betterend/models/block/blossom_berry.json new file mode 100644 index 00000000..d31374b9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry.json @@ -0,0 +1,56 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/blossom_berry_flower", + "stem": "betterend:block/blossom_berry_stem", + "flower": "betterend:block/blossom_berry_flower", + "texture": "betterend:block/blossom_berry_fruit" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneY3", + "from": [ 0, 12, 0 ], + "to": [ 16, 12.001, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#flower" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#flower" } + } + }, + { + "__comment": "Box4", + "from": [ 5, 11, 5 ], + "to": [ 11, 17, 11 ], + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json new file mode 100644 index 00000000..7d0ca93f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json new file mode 100644 index 00000000..5b9545ab --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json new file mode 100644 index 00000000..78ed4004 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json new file mode 100644 index 00000000..4c80d918 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 3, 1 ], + "to": [ 9, 7, 9 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "west": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 7, 2 ], + "to": [ 8, 8, 8 ], + "faces": { + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "south": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "west": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "east": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 6, 3, 6 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 12 ], + "to": [ 12, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 2, 10 ], + "to": [ 14, 5, 16 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 5, 11 ], + "to": [ 13, 6, 15 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json new file mode 100644 index 00000000..e8b85497 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json @@ -0,0 +1,117 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 11, 0, 4 ], + "to": [ 13, 2, 6 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 2, 2 ], + "to": [ 15, 5, 8 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 5, 3 ], + "to": [ 14, 6, 7 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 0, 6 ], + "to": [ 5, 3, 8 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 3, 4 ], + "to": [ 7, 6, 10 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 270 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 6, 5 ], + "to": [ 6, 7, 9 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 270 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 12 ], + "to": [ 12, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 2, 11 ], + "to": [ 13, 4, 15 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 4, 12 ], + "to": [ 12, 5, 14 ], + "faces": { + "up": { "uv": [ 5, 5, 7, 7 ], "texture": "#texture" }, + "north": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "south": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "west": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "east": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json new file mode 100644 index 00000000..f11b78b7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json @@ -0,0 +1,153 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 3, 6 ], + "to": [ 15, 7, 14 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "west": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 7, 7 ], + "to": [ 14, 8, 13 ], + "faces": { + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "south": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "west": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "east": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 9 ], + "to": [ 12, 3, 11 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 5 ], + "to": [ 4, 3, 7 ], + "faces": { + "north": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "west": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "east": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 0, 3, 3 ], + "to": [ 6, 6, 9 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 6, 4 ], + "to": [ 5, 7, 8 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture" }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 0, 2 ], + "to": [ 11, 4, 4 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 4, 1 ], + "to": [ 12, 9, 5 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture" }, + "north": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 9, 2 ], + "to": [ 11, 10, 4 ], + "faces": { + "up": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "south": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "west": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "east": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 5, 12 ], + "to": [ 4, 6, 14 ], + "faces": { + "up": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "south": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "west": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "east": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 12 ], + "to": [ 4, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "east": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 2, 11 ], + "to": [ 5, 5, 15 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json b/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json deleted file mode 100644 index cac5d4b2..00000000 --- a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", - "textures": { - "particle": "betterend:block/bulb_vine_lantern", - "texture": "betterend:block/bulb_vine_lantern" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 4, 4, 4 ], - "to": [ 12, 12, 12 ], - "shade": false, - "faces": { - "down": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, - "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "south": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "west": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "east": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "Box11", - "from": [ 6, 12, 6 ], - "to": [ 10, 13, 10 ], - "faces": { - "up": { "uv": [ 10, 8, 14, 12 ], "texture": "#texture" }, - "north": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "south": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "west": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "east": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 7, 13, 7 ], - "to": [ 7.001, 16, 10 ], - "rotation": { "origin": [ 7, 13, 7 ], "axis": "y", "angle": 45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 9, 13, 7 ], - "to": [ 9.001, 16, 10 ], - "rotation": { "origin": [ 9, 13, 7 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json b/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json deleted file mode 100644 index ddbed87f..00000000 --- a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", - "textures": { - "particle": "betterend:block/bulb_vine_lantern", - "texture": "betterend:block/bulb_vine_lantern" - }, - "elements": [ - { - "from": [ 4, 0, 4 ], - "to": [ 12, 8, 12 ], - "shade": false, - "faces": { - "down": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, - "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "south": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "west": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "east": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" } - } - }, - { - "from": [ 6, 8, 6 ], - "to": [ 10, 9, 10 ], - "faces": { - "up": { "uv": [ 10, 8, 14, 12 ], "texture": "#texture" }, - "north": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "south": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "west": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "east": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 7, 9, 7 ], - "to": [ 7.001, 12, 10 ], - "rotation": { "origin": [ 7, 13, 7 ], "axis": "y", "angle": 45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 9, 9, 7 ], - "to": [ 9.001, 12, 10 ], - "rotation": { "origin": [ 9, 13, 7 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_moss.json b/src/main/resources/assets/betterend/models/block/cave_moss.json deleted file mode 100644 index c5ae0c77..00000000 --- a/src/main/resources/assets/betterend/models/block/cave_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/cave_moss_side", - "north": "betterend:block/cave_moss_side", - "particle": "betterend:block/cave_moss_side", - "south": "betterend:block/cave_moss_side", - "up": "betterend:block/cave_moss_top", - "west": "betterend:block/cave_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/cave_moss_path.json b/src/main/resources/assets/betterend/models/block/cave_moss_path.json deleted file mode 100644 index d46c7c2e..00000000 --- a/src/main/resources/assets/betterend/models/block/cave_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/cave_moss_path_top", - "side": "betterend:block/cave_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin.json new file mode 100644 index 00000000..aa035548 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin.json @@ -0,0 +1,89 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/cave_pumpkin_lantern_side", + "lantern_side": "betterend:block/cave_pumpkin_lantern_side", + "lantern_bottom": "betterend:block/cave_pumpkin_lantern_bottom", + "top": "betterend:block/cave_pumpkin_top", + "side": "betterend:block/cave_pumpkin_side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 15, 13, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#lantern_bottom" }, + "north": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "south": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "west": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "east": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" } + } + }, + { + "__comment": "Box2", + "from": [ 0, 13, 0 ], + "to": [ 16, 15, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 0, 10, 0 ], + "to": [ 0.001, 15, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "east": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 16, 10, 0 ], + "to": [ 16.001, 15, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "east": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0, 10, 16 ], + "to": [ 16, 15, 16.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "south": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0, 10, 0 ], + "to": [ 16, 15, 0.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "south": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "Box7", + "from": [ 5, 15, 5 ], + "to": [ 11, 16, 11 ], + "shade": false, + "faces": { + "up": { "uv": [ 5, 10, 11, 16 ], "texture": "#side" }, + "north": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "south": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "west": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "east": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json new file mode 100644 index 00000000..dc0b57ca --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json @@ -0,0 +1,90 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/cave_pumpkin_lantern_side", + "lantern_side": "betterend:block/cave_pumpkin_lantern_side", + "lantern_bottom": "betterend:block/cave_pumpkin_lantern_bottom", + "top": "betterend:block/cave_pumpkin_top", + "side": "betterend:block/cave_pumpkin_side" + }, + "elements": [ + { + "__comment": "Box8", + "from": [ 5, 7, 5 ], + "to": [ 11, 13, 11 ], + "shade": false, + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#lantern_bottom" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#lantern_side" }, + "north": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "south": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "west": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "east": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" } + } + }, + { + "__comment": "Box9", + "from": [ 4, 13, 4 ], + "to": [ 12, 15, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneX12", + "from": [ 12, 10, 4 ], + "to": [ 12.001, 15, 12 ], + "shade": false, + "faces": { + "west": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "east": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX12", + "from": [ 4, 10, 4 ], + "to": [ 4.001, 15, 12 ], + "shade": false, + "faces": { + "west": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "east": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ14", + "from": [ 4, 10, 4 ], + "to": [ 12, 15, 4.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "south": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ14", + "from": [ 4, 10, 12 ], + "to": [ 12, 15, 12.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "south": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "Box16", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "shade": false, + "faces": { + "up": { "uv": [ 6, 11, 10, 15 ], "texture": "#side" }, + "north": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "south": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "west": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "east": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json new file mode 100644 index 00000000..9083c228 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json new file mode 100644 index 00000000..8c145e38 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json new file mode 100644 index 00000000..ebc4a4f6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json new file mode 100644 index 00000000..6d1d460a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json new file mode 100644 index 00000000..e338603f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json new file mode 100644 index 00000000..c4d07a60 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json new file mode 100644 index 00000000..bdfc11b9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json new file mode 100644 index 00000000..7c379921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json new file mode 100644 index 00000000..aae1e0d1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json new file mode 100644 index 00000000..1367615a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json new file mode 100644 index 00000000..ffadfcd9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json new file mode 100644 index 00000000..3df87588 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json new file mode 100644 index 00000000..f0e174e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json new file mode 100644 index 00000000..d5049831 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json new file mode 100644 index 00000000..5b53ad87 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json new file mode 100644 index 00000000..60260713 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium.json b/src/main/resources/assets/betterend/models/block/chorus_nylium.json deleted file mode 100644 index 9acf413a..00000000 --- a/src/main/resources/assets/betterend/models/block/chorus_nylium.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/chorus_nylium_side", - "north": "betterend:block/chorus_nylium_side", - "particle": "betterend:block/chorus_nylium_side", - "south": "betterend:block/chorus_nylium_side", - "up": "betterend:block/chorus_nylium_top", - "west": "betterend:block/chorus_nylium_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json deleted file mode 100644 index 34fa8e53..00000000 --- a/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/chorus_nylium_path_top", - "side": "betterend:block/chorus_nylium_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/clawfern_01.json b/src/main/resources/assets/betterend/models/block/clawfern_01.json new file mode 100644 index 00000000..99c9d784 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/clawfern_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/clawfern_02.json b/src/main/resources/assets/betterend/models/block/clawfern_02.json new file mode 100644 index 00000000..d8ea43a5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/clawfern_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/column_noshade.json b/src/main/resources/assets/betterend/models/block/column_noshade.json new file mode 100644 index 00000000..163be8b0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/column_noshade.json @@ -0,0 +1,22 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/crop_block_inverted.json b/src/main/resources/assets/betterend/models/block/crop_block_inverted.json index b7794ac1..84d0e038 100644 --- a/src/main/resources/assets/betterend/models/block/crop_block_inverted.json +++ b/src/main/resources/assets/betterend/models/block/crop_block_inverted.json @@ -4,32 +4,32 @@ "particle": "#texture" }, "elements": [ - { "from": [ 4, 0, 0 ], - "to": [ 4, 16, 16 ], + { "from": [ 4.1, 0, 0 ], + "to": [ 4.1, 16, 16 ], "shade": false, "faces": { "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 12, 0, 0 ], - "to": [ 12, 16, 16 ], + { "from": [ 11.9, 0, 0 ], + "to": [ 11.9, 16, 16 ], "shade": false, "faces": { "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 0, 0, 4 ], - "to": [ 16, 16, 4 ], + { "from": [ 0, 0, 4.1 ], + "to": [ 16, 16, 4.1 ], "shade": false, "faces": { "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "south": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 0, 0, 12 ], - "to": [ 16, 16, 12 ], + { "from": [ 0, 0, 11.9 ], + "to": [ 16, 16, 11.9 ], "shade": false, "faces": { "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, diff --git a/src/main/resources/assets/betterend/models/block/crystal_moss.json b/src/main/resources/assets/betterend/models/block/crystal_moss.json deleted file mode 100644 index a64db84a..00000000 --- a/src/main/resources/assets/betterend/models/block/crystal_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/crystal_moss_side", - "north": "betterend:block/crystal_moss_side", - "particle": "betterend:block/crystal_moss_side", - "south": "betterend:block/crystal_moss_side", - "up": "betterend:block/crystal_moss_top", - "west": "betterend:block/crystal_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/crystal_moss_path.json b/src/main/resources/assets/betterend/models/block/crystal_moss_path.json deleted file mode 100644 index ae4d6b55..00000000 --- a/src/main/resources/assets/betterend/models/block/crystal_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/crystal_moss_path_top", - "side": "betterend:block/crystal_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_moss.json b/src/main/resources/assets/betterend/models/block/end_moss.json deleted file mode 100644 index ee5cc869..00000000 --- a/src/main/resources/assets/betterend/models/block/end_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/end_moss_side", - "north": "betterend:block/end_moss_side", - "particle": "betterend:block/end_moss_side", - "south": "betterend:block/end_moss_side", - "up": "betterend:block/end_moss_top", - "west": "betterend:block/end_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_moss_path.json b/src/main/resources/assets/betterend/models/block/end_moss_path.json deleted file mode 100644 index 39a4c538..00000000 --- a/src/main/resources/assets/betterend/models/block/end_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/end_moss_path_top", - "side": "betterend:block/end_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_mycelium.json b/src/main/resources/assets/betterend/models/block/end_mycelium.json deleted file mode 100644 index 825b3395..00000000 --- a/src/main/resources/assets/betterend/models/block/end_mycelium.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/end_mycelium_side", - "north": "betterend:block/end_mycelium_side", - "particle": "betterend:block/end_mycelium_side", - "south": "betterend:block/end_mycelium_side", - "up": "betterend:block/end_mycelium_top", - "west": "betterend:block/end_mycelium_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_mycelium_path.json b/src/main/resources/assets/betterend/models/block/end_mycelium_path.json deleted file mode 100644 index 4fc48331..00000000 --- a/src/main/resources/assets/betterend/models/block/end_mycelium_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/end_mycelium_path_top", - "side": "betterend:block/end_mycelium_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_portal_ax.json b/src/main/resources/assets/betterend/models/block/end_portal.json similarity index 53% rename from src/main/resources/assets/betterend/models/block/end_portal_ax.json rename to src/main/resources/assets/betterend/models/block/end_portal.json index 8448f5c0..8cdabc6d 100644 --- a/src/main/resources/assets/betterend/models/block/end_portal_ax.json +++ b/src/main/resources/assets/betterend/models/block/end_portal.json @@ -8,8 +8,8 @@ "from": [ 0, 0, 6 ], "to": [ 16, 16, 10 ], "faces": { - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" } + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } } } ] diff --git a/src/main/resources/assets/betterend/models/block/end_portal_az.json b/src/main/resources/assets/betterend/models/block/end_portal_az.json deleted file mode 100644 index 35c5f76a..00000000 --- a/src/main/resources/assets/betterend/models/block/end_portal_az.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "textures": { - "particle": "betterend:block/end_portal", - "portal": "betterend:block/end_portal" - }, - "elements": [ - { - "from": [ 6, 0, 0 ], - "to": [ 10, 16, 16 ], - "faces": { - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/end_portal_grey.json b/src/main/resources/assets/betterend/models/block/end_portal_grey.json new file mode 100644 index 00000000..41f66eab --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/end_portal_grey.json @@ -0,0 +1,16 @@ +{ + "textures": { + "particle": "betterend:block/end_portal_grey", + "portal": "betterend:block/end_portal_grey" + }, + "elements": [ + { + "from": [ 0, 0, 6 ], + "to": [ 16, 16, 10 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/filalux_bottom.json b/src/main/resources/assets/betterend/models/block/filalux_bottom.json new file mode 100644 index 00000000..5e85afac --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/filalux_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/filalux_middle.json b/src/main/resources/assets/betterend/models/block/filalux_middle.json new file mode 100644 index 00000000..84ef100c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/filalux_middle" + } +} diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings.json b/src/main/resources/assets/betterend/models/block/filalux_wings.json new file mode 100644 index 00000000..3eedc4e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings.json @@ -0,0 +1,42 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings", + "texture": "betterend:block/filalux_wings", + "large": "betterend:block/filalux_wings_large" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 6, 0 ], + "to": [ 16, 6.001, 8 ], + "rotation": { "origin": [ 0, 6, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 10, 0 ], + "to": [ 16, 10.001, 16 ], + "rotation": { "origin": [ 0, 10, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#large" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#large" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json b/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json new file mode 100644 index 00000000..9d2b6fb3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings", + "texture": "betterend:block/filalux_wings" + }, + "elements": [ + { + "__comment": "PlaneY2", + "from": [ 9, 0, 0 ], + "to": [ 17, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY2", + "from": [ 13, 0, 0 ], + "to": [ 21, 0.001, 16 ], + "rotation": { "origin": [ 13, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY2", + "from": [ -1, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY2", + "from": [ -5, -0.001, 0 ], + "to": [ 3, 0, 16 ], + "rotation": { "origin": [ 3, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 17 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, 0, 13 ], + "to": [ 16, 0.001, 21 ], + "rotation": { "origin": [ 0, 0, 13 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, -0.001, -1 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, -0.001, -5 ], + "to": [ 16, 0, 3 ], + "rotation": { "origin": [ 0, 0, 3 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings_top.json b/src/main/resources/assets/betterend/models/block/filalux_wings_top.json new file mode 100644 index 00000000..829f573a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings_top.json @@ -0,0 +1,77 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings_large", + "texture": "betterend:block/filalux_wings_large", + "top": "betterend:block/filalux_wings_top", + "side": "betterend:block/filalux_wings_top_side" + }, + "elements": [ + { + "__comment": "PlaneY9", + "from": [ -8, 0.125, -8 ], + "to": [ 24, 0.126, 24 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneY10", + "from": [ 10, 0, 0 ], + "to": [ 26, 0.001, 16 ], + "rotation": { "origin": [ 10, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY10", + "from": [ -10, -0.001, 0 ], + "to": [ 6, 0, 16 ], + "rotation": { "origin": [ 6, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY12", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY12", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "Box14", + "from": [ -0.5, -16, -0.5 ], + "to": [ 16.5, 0, 16.5 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flamaea_1.json b/src/main/resources/assets/betterend/models/block/flamaea_1.json new file mode 100644 index 00000000..ca9b7abd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_2.json b/src/main/resources/assets/betterend/models/block/flamaea_2.json new file mode 100644 index 00000000..f004b7ed --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_3.json b/src/main/resources/assets/betterend/models/block/flamaea_3.json new file mode 100644 index 00000000..78752c4c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_4.json b/src/main/resources/assets/betterend/models/block/flamaea_4.json new file mode 100644 index 00000000..659574db --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_5.json b/src/main/resources/assets/betterend/models/block/flamaea_5.json new file mode 100644 index 00000000..8c7f8f65 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/fracturn_01.json b/src/main/resources/assets/betterend/models/block/fracturn_01.json new file mode 100644 index 00000000..f2fec641 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/fracturn" + } +} diff --git a/src/main/resources/assets/betterend/models/block/fracturn_02.json b/src/main/resources/assets/betterend/models/block/fracturn_02.json new file mode 100644 index 00000000..3ad3fb70 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_03.json b/src/main/resources/assets/betterend/models/block/fracturn_03.json new file mode 100644 index 00000000..0d401711 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_04.json b/src/main/resources/assets/betterend/models/block/fracturn_04.json new file mode 100644 index 00000000..f7727012 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/globulagus_01.json b/src/main/resources/assets/betterend/models/block/globulagus_01.json new file mode 100644 index 00000000..8b7eac5b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/globulagus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/globulagus_02.json b/src/main/resources/assets/betterend/models/block/globulagus_02.json new file mode 100644 index 00000000..cc5ff783 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/globulagus_03.json b/src/main/resources/assets/betterend/models/block/globulagus_03.json new file mode 100644 index 00000000..db3512a7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/globulagus_04.json b/src/main/resources/assets/betterend/models/block/globulagus_04.json new file mode 100644 index 00000000..65d297b6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_1.json b/src/main/resources/assets/betterend/models/block/jungle_fern_1.json new file mode 100644 index 00000000..5410c746 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_1.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_2.json b/src/main/resources/assets/betterend/models/block/jungle_fern_2.json new file mode 100644 index 00000000..ebba05a9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_2.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_3.json b/src/main/resources/assets/betterend/models/block/jungle_fern_3.json new file mode 100644 index 00000000..6af45852 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_3.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_4.json b/src/main/resources/assets/betterend/models/block/jungle_fern_4.json new file mode 100644 index 00000000..c2f88121 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_4.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_5.json b/src/main/resources/assets/betterend/models/block/jungle_fern_5.json new file mode 100644 index 00000000..bb2df430 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_5.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_6.json b/src/main/resources/assets/betterend/models/block/jungle_fern_6.json new file mode 100644 index 00000000..aa658bf8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_6.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_7.json b/src/main/resources/assets/betterend/models/block/jungle_fern_7.json new file mode 100644 index 00000000..c6c4c432 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_7.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_8.json b/src/main/resources/assets/betterend/models/block/jungle_fern_8.json new file mode 100644 index 00000000..40c88af8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_8.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_9.json b/src/main/resources/assets/betterend/models/block/jungle_fern_9.json new file mode 100644 index 00000000..26fe4832 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_9.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_01.json b/src/main/resources/assets/betterend/models/block/jungle_grass_01.json new file mode 100644 index 00000000..f3dd5f0e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/jungle_grass" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_02.json b/src/main/resources/assets/betterend/models/block/jungle_grass_02.json new file mode 100644 index 00000000..4d9754ee --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_03.json b/src/main/resources/assets/betterend/models/block/jungle_grass_03.json new file mode 100644 index 00000000..23e76255 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_04.json b/src/main/resources/assets/betterend/models/block/jungle_grass_04.json new file mode 100644 index 00000000..75bdec30 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_05.json b/src/main/resources/assets/betterend/models/block/jungle_grass_05.json new file mode 100644 index 00000000..b1a6657a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/jungle_grass_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_06.json b/src/main/resources/assets/betterend/models/block/jungle_grass_06.json new file mode 100644 index 00000000..26278b2a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_07.json b/src/main/resources/assets/betterend/models/block/jungle_grass_07.json new file mode 100644 index 00000000..cf71ab85 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_08.json b/src/main/resources/assets/betterend/models/block/jungle_grass_08.json new file mode 100644 index 00000000..df08990e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_09.json b/src/main/resources/assets/betterend/models/block/jungle_grass_09.json new file mode 100644 index 00000000..e1c9fb41 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/twisted_umbrella_moss_small" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_10.json b/src/main/resources/assets/betterend/models/block/jungle_grass_10.json new file mode 100644 index 00000000..ec90bfa3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_11.json b/src/main/resources/assets/betterend/models/block/jungle_grass_11.json new file mode 100644 index 00000000..4e3e45c4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_12.json b/src/main/resources/assets/betterend/models/block/jungle_grass_12.json new file mode 100644 index 00000000..4ca93a64 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom.json b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom.json new file mode 100644 index 00000000..d0a016af --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/jungle_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_middle.json b/src/main/resources/assets/betterend/models/block/jungle_vine_middle.json new file mode 100644 index 00000000..a6761519 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/jungle_vine" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_01.json b/src/main/resources/assets/betterend/models/block/lamellarium_01.json new file mode 100644 index 00000000..0e73b1fd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/lamellarium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_02.json b/src/main/resources/assets/betterend/models/block/lamellarium_02.json new file mode 100644 index 00000000..8549d1ae --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_03.json b/src/main/resources/assets/betterend/models/block/lamellarium_03.json new file mode 100644 index 00000000..82d784e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_04.json b/src/main/resources/assets/betterend/models/block/lamellarium_04.json new file mode 100644 index 00000000..94d36cef --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json new file mode 100644 index 00000000..e9211bee --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json @@ -0,0 +1,95 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/large_amaranita_cap_side", + "side": "betterend:block/large_amaranita_cap_side", + "top": "betterend:block/large_amaranita_cap_top", + "bottom": "betterend:block/large_amaranita_cap_bottom", + "stem": "betterend:block/amaranita_stem_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 7, 1 ], + "to": [ 15, 14, 15 ], + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#bottom" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "south": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "west": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "east": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 14, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 2, 3, 1 ], + "to": [ 2.001, 7, 15 ], + "faces": { + "west": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "east": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 14, 3, 1 ], + "to": [ 14.001, 7, 15 ], + "faces": { + "west": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "east": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ8", + "from": [ 1, 3, 2 ], + "to": [ 15, 7, 2.001 ], + "faces": { + "north": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "south": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ8", + "from": [ 1, 3, 14 ], + "to": [ 15, 7, 14.001 ], + "faces": { + "north": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "south": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json new file mode 100644 index 00000000..5702d0a3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_stem_roots", + "stem": "betterend:block/amaranita_stem_roots" + }, + "elements": [ + { + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json new file mode 100644 index 00000000..14929023 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_stem_middle", + "stem": "betterend:block/amaranita_stem_middle" + }, + "elements": [ + { + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks.json b/src/main/resources/assets/betterend/models/block/lucernia_bark.json similarity index 51% rename from src/main/resources/assets/betterend/models/block/violecite_bricks.json rename to src/main/resources/assets/betterend/models/block/lucernia_bark.json index a62dc365..d8d8534f 100644 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks.json +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "betterend:block/violecite_bricks" + "all": "betterend:block/lucernia_log_side" } } diff --git a/src/main/resources/assets/betterend/models/block/violecite.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_2.json similarity index 50% rename from src/main/resources/assets/betterend/models/block/violecite.json rename to src/main/resources/assets/betterend/models/block/lucernia_bark_2.json index 1ba3d23e..700cf84a 100644 --- a/src/main/resources/assets/betterend/models/block/violecite.json +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_2.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "betterend:block/violecite" + "all": "betterend:block/lucernia_log_side_2" } } diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json new file mode 100644 index 00000000..1c98b56f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_mirrored_all", + "textures": { + "all": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json new file mode 100644 index 00000000..f9a8a676 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_mirrored_all", + "textures": { + "all": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json new file mode 100644 index 00000000..ae34d194 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json new file mode 100644 index 00000000..db14b6cc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json new file mode 100644 index 00000000..b0add050 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json new file mode 100644 index 00000000..6d38ed9a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log.json b/src/main/resources/assets/betterend/models/block/lucernia_log.json new file mode 100644 index 00000000..c1db80eb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side", + "north": "betterend:block/lucernia_log_side", + "particle": "betterend:block/lucernia_log_side", + "south": "betterend:block/lucernia_log_side", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_2.json b/src/main/resources/assets/betterend/models/block/lucernia_log_2.json new file mode 100644 index 00000000..27176afb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_2.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side_2", + "north": "betterend:block/lucernia_log_side_2", + "particle": "betterend:block/lucernia_log_side_2", + "south": "betterend:block/lucernia_log_side_2", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_3.json b/src/main/resources/assets/betterend/models/block/lucernia_log_3.json new file mode 100644 index 00000000..e36e41b0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_3.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_mirrored", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side", + "north": "betterend:block/lucernia_log_side", + "particle": "betterend:block/lucernia_log_side", + "south": "betterend:block/lucernia_log_side", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_4.json b/src/main/resources/assets/betterend/models/block/lucernia_log_4.json new file mode 100644 index 00000000..2c32bf88 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_4.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_mirrored", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side_2", + "north": "betterend:block/lucernia_log_side_2", + "particle": "betterend:block/lucernia_log_side_2", + "south": "betterend:block/lucernia_log_side_2", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json new file mode 100644 index 00000000..28312355 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json new file mode 100644 index 00000000..593da44e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json new file mode 100644 index 00000000..30b89392 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json new file mode 100644 index 00000000..73575478 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json new file mode 100644 index 00000000..e3117b51 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json new file mode 100644 index 00000000..60fbeb92 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json new file mode 100644 index 00000000..c4690387 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json new file mode 100644 index 00000000..f52731c9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json new file mode 100644 index 00000000..ebe38a54 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json new file mode 100644 index 00000000..3ed17feb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json @@ -0,0 +1,120 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lucernia_outer_leaves_1", + "texture": "betterend:block/lucernia_outer_leaves_1", + "spore": "betterend:block/lucernia_outer_leaves_1" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 10, -0.001, 0 ], + "to": [ 26, 0, 16 ], + "rotation": { "origin": [ 10, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -10, 0, 2 ], + "to": [ 6, 0.001, 18 ], + "rotation": { "origin": [ 6, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 9, -0.001, 0 ], + "to": [ 25, 0, 16 ], + "rotation": { "origin": [ 9, 0, 16 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -9, 0, 2 ], + "to": [ 7, 0.001, 18 ], + "rotation": { "origin": [ 7, 0, 18 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json new file mode 100644 index 00000000..83b3dbe1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json @@ -0,0 +1,120 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lucernia_outer_leaves_2", + "texture": "betterend:block/lucernia_outer_leaves_2", + "spore": "betterend:block/lucernia_outer_leaves_2" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 10, -0.001, 0 ], + "to": [ 26, 0, 16 ], + "rotation": { "origin": [ 10, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -10, 0, 2 ], + "to": [ 6, 0.001, 18 ], + "rotation": { "origin": [ 6, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 9, -0.001, 0 ], + "to": [ 25, 0, 16 ], + "rotation": { "origin": [ 9, 0, 16 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -9, 0, 2 ], + "to": [ 7, 0.001, 18 ], + "rotation": { "origin": [ 7, 0, 18 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json b/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json new file mode 100644 index 00000000..b51bf2d0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json @@ -0,0 +1,156 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 14, 0 ], + "to": [ 27, 14.001, 16 ], + "rotation": { "origin": [ 11, 14, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 11, 15, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 13.999, 0 ], + "to": [ 5, 14, 16 ], + "rotation": { "origin": [ 5, 14, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 14.999, 0 ], + "to": [ 5, 15, 16 ], + "rotation": { "origin": [ 5, 15, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 14, 11 ], + "to": [ 16, 14.001, 27 ], + "rotation": { "origin": [ 0, 14, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 10.999 ], + "to": [ 16, 23, 11 ], + "rotation": { "origin": [ 0, 15, 11 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 13.999, -11 ], + "to": [ 16, 14, 5 ], + "rotation": { "origin": [ 0, 14, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 4.999 ], + "to": [ 16, 23, 5 ], + "rotation": { "origin": [ 0, 15, 5 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 13, 14, -2.5 ], + "to": [ 21, 14.001, 5.5 ], + "rotation": { "origin": [ 13, 14, -2.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 10.5, 14, 5 ], + "to": [ 18.5, 14.001, 13 ], + "rotation": { "origin": [ 18.5, 15, 13 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -5, 14, 10.5 ], + "to": [ 3, 14.001, 18.5 ], + "rotation": { "origin": [ 3, 15, 18.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -2.4999, 14, 3 ], + "to": [ 5.5001, 14.001, 11 ], + "rotation": { "origin": [ -2.5, 15, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json new file mode 100644 index 00000000..c751a83e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json @@ -0,0 +1,45 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 6, 14, 12 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json new file mode 100644 index 00000000..c2a96a29 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json @@ -0,0 +1,179 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 14, 0 ], + "to": [ 27, 14.001, 16 ], + "rotation": { "origin": [ 11, 14, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 11, 15, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 13.999, 0 ], + "to": [ 5, 14, 16 ], + "rotation": { "origin": [ 5, 14, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 14.999, 0 ], + "to": [ 5, 15, 16 ], + "rotation": { "origin": [ 5, 15, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 14, 11 ], + "to": [ 16, 14.001, 27 ], + "rotation": { "origin": [ 0, 14, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 10.999 ], + "to": [ 16, 23, 11 ], + "rotation": { "origin": [ 0, 15, 11 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 13.999, -11 ], + "to": [ 16, 14, 5 ], + "rotation": { "origin": [ 0, 14, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 4.999 ], + "to": [ 16, 23, 5 ], + "rotation": { "origin": [ 0, 15, 5 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 13, 14, -2.5 ], + "to": [ 21, 14.001, 5.5 ], + "rotation": { "origin": [ 13, 14, -2.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 10.5, 14, 5 ], + "to": [ 18.5, 14.001, 13 ], + "rotation": { "origin": [ 18.5, 15, 13 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -5, 14, 10.5 ], + "to": [ 3, 14.001, 18.5 ], + "rotation": { "origin": [ 3, 15, 18.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -2.4999, 14, 3 ], + "to": [ 5.5001, 14.001, 11 ], + "rotation": { "origin": [ -2.5, 15, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneX14", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX14", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json new file mode 100644 index 00000000..c46d9653 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_bottom", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json new file mode 100644 index 00000000..5bdf6223 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_middle", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json new file mode 100644 index 00000000..bde1ef2a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_top", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json new file mode 100644 index 00000000..f9639ab8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_top_middle", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_middle.json new file mode 100644 index 00000000..e44c70df --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_middle.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_stem", + "texture": "betterend:block/lumecorn_stem", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "big_petal": "betterend:block/lumecorn_big_petal" + }, + "elements": [ + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 27, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 19, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 27 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 19 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -11 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -3 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY14", + "from": [ 8, 16, -7.5 ], + "to": [ 30, 16.001, 14.5 ], + "rotation": { "origin": [ 8, 16, -7.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" }, + "up": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json b/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json new file mode 100644 index 00000000..376d26f1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json @@ -0,0 +1,32 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_roots", + "texture": "betterend:block/lumecorn_roots", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json b/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json new file mode 100644 index 00000000..2e152863 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_roots", + "texture": "betterend:block/lumecorn_roots", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "big_petal": "betterend:block/lumecorn_big_petal" + }, + "elements": [ + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 27, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 19, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 27 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 19 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -11 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -3 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY14", + "from": [ 8, 16, -7.5 ], + "to": [ 30, 16.001, 14.5 ], + "rotation": { "origin": [ 8, 16, -7.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" }, + "up": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json new file mode 100644 index 00000000..b368c4dd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json new file mode 100644 index 00000000..a86effd6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json new file mode 100644 index 00000000..b73ac4a8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json new file mode 100644 index 00000000..3223318b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lutebus_01.json b/src/main/resources/assets/betterend/models/block/lutebus_01.json new file mode 100644 index 00000000..c30688e8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lutebus_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lutebus_02.json b/src/main/resources/assets/betterend/models/block/lutebus_02.json new file mode 100644 index 00000000..0df1ef26 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lutebus_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/magnula_bottom.json b/src/main/resources/assets/betterend/models/block/magnula_bottom.json new file mode 100644 index 00000000..7845801a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/magnula_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/magnula_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/magnula_middle.json b/src/main/resources/assets/betterend/models/block/magnula_middle.json new file mode 100644 index 00000000..75c4a5f8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/magnula_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/magnula" + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json new file mode 100644 index 00000000..fd85f978 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/dragon_bone_block_side", + "east": "betterend:block/mossy_dragon_bone_side_ver", + "north": "betterend:block/mossy_dragon_bone_cut", + "particle": "betterend:block/mossy_dragon_bone_side_ver", + "south": "betterend:block/mossy_dragon_bone_cut", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_dragon_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json new file mode 100644 index 00000000..8200c597 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/dragon_bone_block_top", + "east": "betterend:block/mossy_dragon_bone_side_ver", + "north": "betterend:block/mossy_dragon_bone_side_ver", + "particle": "betterend:block/mossy_dragon_bone_side_ver", + "south": "betterend:block/mossy_dragon_bone_side_ver", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_dragon_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_obsidian.json b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json new file mode 100644 index 00000000..082f4bca --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/obsidian", + "east": "betterend:block/mossy_obsidian_side", + "north": "betterend:block/mossy_obsidian_side", + "particle": "betterend:block/mossy_obsidian_side", + "south": "betterend:block/mossy_obsidian_side", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_obsidian_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json new file mode 100644 index 00000000..9125516b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json @@ -0,0 +1,46 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "side": "betterend:block/neon_cactus_big_side", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json new file mode 100644 index 00000000..9141f6b1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "overlay": "betterend:block/neon_cactus_big_side_moss_overlay", + "side": "betterend:block/neon_cactus_big_side_moss", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json new file mode 100644 index 00000000..af667304 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "overlay": "betterend:block/neon_cactus_big_side_dust_overlay", + "side": "betterend:block/neon_cactus_big_side_dust", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json new file mode 100644 index 00000000..b8f84530 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json @@ -0,0 +1,46 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "side": "betterend:block/neon_cactus_medium_side", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json new file mode 100644 index 00000000..d1400921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_medium_side", + "overlay": "betterend:block/neon_cactus_medium_side_moss_overlay", + "side": "betterend:block/neon_cactus_medium_side_moss", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "faces": { + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json new file mode 100644 index 00000000..8120468b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_medium_side", + "overlay": "betterend:block/neon_cactus_medium_side_dust_overlay", + "side": "betterend:block/neon_cactus_medium_side_dust", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "faces": { + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json new file mode 100644 index 00000000..22fb196b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json new file mode 100644 index 00000000..6d0ec8ae --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json @@ -0,0 +1,47 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "side": "betterend:block/neon_cactus_small_side", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json new file mode 100644 index 00000000..65825cc0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_small_side_moss_overlay", + "side": "betterend:block/neon_cactus_small_side_moss", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "faces": { + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json new file mode 100644 index 00000000..24ed9f5f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_small_side_dust_overlay", + "side": "betterend:block/neon_cactus_small_side_dust", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "faces": { + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json new file mode 100644 index 00000000..0a0df2b2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json new file mode 100644 index 00000000..78d80cc5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json new file mode 100644 index 00000000..01f12961 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json new file mode 100644 index 00000000..7eba80b6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json new file mode 100644 index 00000000..3cf1ec95 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json new file mode 100644 index 00000000..4f2147e3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/orango_01.json b/src/main/resources/assets/betterend/models/block/orango_01.json new file mode 100644 index 00000000..9b12c38d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/orango" + } +} diff --git a/src/main/resources/assets/betterend/models/block/orango_02.json b/src/main/resources/assets/betterend/models/block/orango_02.json new file mode 100644 index 00000000..f1f7ee15 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/orango_03.json b/src/main/resources/assets/betterend/models/block/orango_03.json new file mode 100644 index 00000000..cb4a6076 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/orango_04.json b/src/main/resources/assets/betterend/models/block/orango_04.json new file mode 100644 index 00000000..2625775c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/pink_moss.json b/src/main/resources/assets/betterend/models/block/pink_moss.json deleted file mode 100644 index 237cb110..00000000 --- a/src/main/resources/assets/betterend/models/block/pink_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/pink_moss_side", - "north": "betterend:block/pink_moss_side", - "particle": "betterend:block/pink_moss_side", - "south": "betterend:block/pink_moss_side", - "up": "betterend:block/pink_moss_top", - "west": "betterend:block/pink_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/pink_moss_path.json b/src/main/resources/assets/betterend/models/block/pink_moss_path.json deleted file mode 100644 index 9f46434e..00000000 --- a/src/main/resources/assets/betterend/models/block/pink_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/pink_moss_path_top", - "side": "betterend:block/pink_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/pond_anemone.json b/src/main/resources/assets/betterend/models/block/pond_anemone.json new file mode 100644 index 00000000..92cbdbc7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pond_anemone.json @@ -0,0 +1,111 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/pond_anemone", + "texture": "betterend:block/pond_anemone" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 7, 10, 7 ], + "faces": { + "up": { "uv": [ 10, 9, 16, 15 ], "texture": "#texture" }, + "north": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -1, 7, -1 ], + "to": [ -0.999, 15, 13 ], + "rotation": { "origin": [ -1, 7, -1 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 9, 7, -1 ], + "to": [ 9.001, 15, 13 ], + "rotation": { "origin": [ 9, 7, -1 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 0, 5 ], + "to": [ 15, 8, 11 ], + "faces": { + "up": { "uv": [ 10, 9, 16, 15 ], "texture": "#texture" }, + "north": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "south": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "west": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "east": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 7, 5, 3 ], + "to": [ 7.001, 13, 17 ], + "rotation": { "origin": [ 7, 5, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 17, 5, 3 ], + "to": [ 17.001, 13, 17 ], + "rotation": { "origin": [ 17, 5, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 10 ], + "to": [ 6, 7, 14 ], + "faces": { + "up": { "uv": [ 11, 10, 15, 14 ], "texture": "#texture" }, + "north": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "south": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "west": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "east": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -1, 4, 7 ], + "to": [ -0.999, 12, 21 ], + "rotation": { "origin": [ -1, 4, 7 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 9, 4, 7 ], + "to": [ 9.001, 12, 21 ], + "rotation": { "origin": [ 9, 4, 7 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/rubinea_bottom.json b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json new file mode 100644 index 00000000..7a860b43 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/rubinea_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/rubinea_middle.json b/src/main/resources/assets/betterend/models/block/rubinea_middle.json new file mode 100644 index 00000000..9f15fd91 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rubinea_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/rubinea" + } +} diff --git a/src/main/resources/assets/betterend/models/block/ruscus_1.json b/src/main/resources/assets/betterend/models/block/ruscus_1.json new file mode 100644 index 00000000..1945a450 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_1.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/ruscus_2.json b/src/main/resources/assets/betterend/models/block/ruscus_2.json new file mode 100644 index 00000000..1ecd5869 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_2.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/ruscus_3.json b/src/main/resources/assets/betterend/models/block/ruscus_3.json new file mode 100644 index 00000000..730d9820 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_3.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_1.json b/src/main/resources/assets/betterend/models/block/rutiscus_1.json new file mode 100644 index 00000000..c49ecd73 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_1.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_1", + "north": "betterend:block/rutiscus_side_1", + "particle": "betterend:block/rutiscus_side_1", + "south": "betterend:block/rutiscus_side_1", + "up": "betterend:block/rutiscus_top_1", + "west": "betterend:block/rutiscus_side_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_2.json b/src/main/resources/assets/betterend/models/block/rutiscus_2.json new file mode 100644 index 00000000..c649a3c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_2.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_2", + "north": "betterend:block/rutiscus_side_2", + "particle": "betterend:block/rutiscus_side_2", + "south": "betterend:block/rutiscus_side_2", + "up": "betterend:block/rutiscus_top_2", + "west": "betterend:block/rutiscus_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/salteago_01.json b/src/main/resources/assets/betterend/models/block/salteago_01.json new file mode 100644 index 00000000..d7efc8e0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/salteago" + } +} diff --git a/src/main/resources/assets/betterend/models/block/salteago_02.json b/src/main/resources/assets/betterend/models/block/salteago_02.json new file mode 100644 index 00000000..1f3cd308 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/salteago_03.json b/src/main/resources/assets/betterend/models/block/salteago_03.json new file mode 100644 index 00000000..3e56d4ed --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/salteago_04.json b/src/main/resources/assets/betterend/models/block/salteago_04.json new file mode 100644 index 00000000..abc5b3fc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass.json b/src/main/resources/assets/betterend/models/block/shadow_grass.json deleted file mode 100644 index fff020c9..00000000 --- a/src/main/resources/assets/betterend/models/block/shadow_grass.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/shadow_grass_side", - "north": "betterend:block/shadow_grass_side", - "particle": "betterend:block/shadow_grass_side", - "south": "betterend:block/shadow_grass_side", - "up": "betterend:block/shadow_grass_top", - "west": "betterend:block/shadow_grass_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass_path.json b/src/main/resources/assets/betterend/models/block/shadow_grass_path.json deleted file mode 100644 index 23a7a0ac..00000000 --- a/src/main/resources/assets/betterend/models/block/shadow_grass_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/shadow_grass_path_top", - "side": "betterend:block/shadow_grass_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_hive.json b/src/main/resources/assets/betterend/models/block/silk_moth_hive.json new file mode 100644 index 00000000..884ce086 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_hive.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/moth_hive_side", + "east": "betterend:block/moth_hive_side", + "north": "betterend:block/moth_hive_front", + "particle": "betterend:block/moth_hive_side", + "south": "betterend:block/moth_hive_side", + "up": "betterend:block/moth_hive_side", + "west": "betterend:block/moth_hive_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json b/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json new file mode 100644 index 00000000..3ca4a0d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/moth_hive_side", + "east": "betterend:block/moth_hive_side", + "north": "betterend:block/moth_hive_front_silk", + "particle": "betterend:block/moth_hive_side", + "south": "betterend:block/moth_hive_side", + "up": "betterend:block/moth_hive_side", + "west": "betterend:block/moth_hive_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json new file mode 100644 index 00000000..7635ef7e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json @@ -0,0 +1,37 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/silk_moth_nest_side", + "texture": "betterend:block/silk_moth_nest_side", + "top": "betterend:block/silk_moth_nest_top", + "front": "betterend:block/silk_moth_nest_front_silk" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 13, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 3, 16, 16 ], "texture": "#front", "cullface": "north" }, + "south": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 12, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "east": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json new file mode 100644 index 00000000..41e0257c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/small_amaranita_mushroom", + "texture": "betterend:block/small_amaranita_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 4, 4 ], + "to": [ 12, 8, 12 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "south": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "west": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "east": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 4, 9 ], + "faces": { + "north": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "south": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "west": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "east": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 8, 5 ], + "to": [ 11, 10, 11 ], + "faces": { + "up": { "uv": [ 1, 1, 7, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "south": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "west": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "east": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 4.5, 2, 4 ], + "to": [ 4.501, 4, 12 ], + "faces": { + "west": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "east": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 11.5, 2, 4 ], + "to": [ 11.501, 4, 12 ], + "faces": { + "west": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "east": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ6", + "from": [ 4, 2, 4.5 ], + "to": [ 12, 4, 4.501 ], + "faces": { + "north": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "south": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ6", + "from": [ 4, 2, 11.5 ], + "to": [ 12, 4, 11.501 ], + "faces": { + "north": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "south": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json new file mode 100644 index 00000000..e2e4e011 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json @@ -0,0 +1,84 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_ceiling_stem", + "texture": "betterend:block/jellyshroom_ceiling_stem", + "cap": "betterend:block/jellyshroom_cap_small" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.375 ], + "to": [ 2.376, 16, 18.375 ], + "rotation": { "origin": [ 2.375, 0, 2.375 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 2.5, 4.5, 2.5 ], + "to": [ 7.5, 7.5, 7.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9, 12, 4 ], + "to": [ 12, 14, 7 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9.5, 12, 9.5 ], + "to": [ 11.5, 13, 11.5 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3.5, 5, 9.5 ], + "to": [ 6.5, 7, 12.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json new file mode 100644 index 00000000..11df2715 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json @@ -0,0 +1,149 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/small_jellyshroom_stem", + "texture": "betterend:block/small_jellyshroom_stem", + "cap": "betterend:block/jellyshroom_cap_small" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.375 ], + "to": [ 2.376, 16, 18.375 ], + "rotation": { "origin": [ 2.375, 0, 2.375 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 5.5, 11, 5.5 ], + "to": [ 10.5, 14, 10.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 2.5, 5, 9.5 ], + "to": [ 6.5, 8, 13.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3, 4, 3 ], + "to": [ 6, 6, 6 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9.5, 10, 9.5 ], + "to": [ 12.5, 12, 12.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3.5, 10.5, 3.5 ], + "to": [ 6.5, 12.5, 6.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10.5, 11, 4 ], + "to": [ 12.5, 12, 6 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10, 5, 2.5 ], + "to": [ 14, 7, 6.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 4, 10, 10 ], + "to": [ 6, 11, 12 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10, 4, 10 ], + "to": [ 13, 6, 13 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json new file mode 100644 index 00000000..72c363d9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json @@ -0,0 +1,96 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_wall_stem_1", + "branch_1": "betterend:block/jellyshroom_wall_stem_1", + "branch_2": "betterend:block/jellyshroom_wall_stem_2", + "branch_3": "betterend:block/jellyshroom_wall_stem_3", + "cap": "betterend:block/jellyshroom_cap_small" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 8, 0, 0 ], + "to": [ 8.001, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_1" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_1" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 0, 0 ], + "to": [ 11.001, 16, 16 ], + "rotation": { "origin": [ 11, 0, 0 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 5, 0, 0 ], + "to": [ 5.001, 16, 16 ], + "rotation": { "origin": [ 5, 0, 0 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "Box4", + "from": [ 5.5, 10, 5.5 ], + "to": [ 10.5, 13, 10.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 11.5, 7, 4 ], + "to": [ 15.5, 10, 8 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 1, 7, 4.5 ], + "to": [ 4, 9, 7.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 6.5, 9, 2 ], + "to": [ 9.5, 11, 5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json new file mode 100644 index 00000000..fc7319f7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json @@ -0,0 +1,109 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_wall_stem_1", + "branch_1": "betterend:block/jellyshroom_wall_stem_1", + "branch_2": "betterend:block/jellyshroom_wall_stem_2", + "branch_3": "betterend:block/jellyshroom_wall_stem_3", + "cap": "betterend:block/jellyshroom_cap_small" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 8, 0, 0 ], + "to": [ 8.001, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 0, 0 ], + "to": [ 11.001, 16, 16 ], + "rotation": { "origin": [ 11, 0, 0 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_1" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_1" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 5, 0, 0 ], + "to": [ 5.001, 16, 16 ], + "rotation": { "origin": [ 5, 0, 0 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_2" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_2" } + } + }, + { + "__comment": "Box4", + "from": [ 11, 10, 5 ], + "to": [ 16, 13, 10 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 10, 9, 1.5 ], + "to": [ 14, 12, 5.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 0.5, 8, 6.5 ], + "to": [ 3.5, 10, 9.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 1.5, 10, 2.5 ], + "to": [ 5.5, 13, 6.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 6.5, 8, 5 ], + "to": [ 9.5, 10, 8 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json new file mode 100644 index 00000000..8e5c23a0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/smaragdant_crystal_top", + "east": "betterend:block/smaragdant_crystal_side", + "north": "betterend:block/smaragdant_crystal_side", + "particle": "betterend:block/smaragdant_crystal_side", + "south": "betterend:block/smaragdant_crystal_side", + "up": "betterend:block/smaragdant_crystal_top", + "west": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json new file mode 100644 index 00000000..ed5c42d9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/smaragdant_crystal_shard" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/tenanea_leaves.json b/src/main/resources/assets/betterend/models/block/tenanea_leaves.json new file mode 100644 index 00000000..c8fd5d5e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/tenanea_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/tenanea_leaves" + } +} diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json new file mode 100644 index 00000000..b9e009da --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier", + "texture": "betterend:block/thallasium_chandelier" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 1, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 1, 2 ], + "to": [ 2.001, 10, 19 ], + "rotation": { "origin": [ 2, 1, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 1, 2 ], + "to": [ 14.001, 10, 19 ], + "rotation": { "origin": [ 14, 1, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 2 ], + "to": [ 2.001, 16, 7.5 ], + "rotation": { "origin": [ 2, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 2 ], + "to": [ 6.001, 16, 7.5 ], + "rotation": { "origin": [ 6, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 2 ], + "to": [ 10.001, 16, 7.5 ], + "rotation": { "origin": [ 10, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 2 ], + "to": [ 14.001, 16, 7.5 ], + "rotation": { "origin": [ 14, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 10 ], + "to": [ 2.001, 16, 15.5 ], + "rotation": { "origin": [ 2, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 10 ], + "to": [ 6.001, 16, 15.5 ], + "rotation": { "origin": [ 6, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 10 ], + "to": [ 10.001, 16, 15.5 ], + "rotation": { "origin": [ 10, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 10 ], + "to": [ 14.001, 16, 15.5 ], + "rotation": { "origin": [ 14, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json new file mode 100644 index 00000000..91576939 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json @@ -0,0 +1,134 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier_ceil", + "texture": "betterend:block/thallasium_chandelier_ceil", + "rod": "betterend:block/thallasium_chandelier" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 2, 2 ], + "to": [ 2.001, 15, 19 ], + "rotation": { "origin": [ 2, 2, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 2, 2 ], + "to": [ 14.001, 15, 19 ], + "rotation": { "origin": [ 14, 2, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 2 ], + "to": [ 2.001, 9, 7.5 ], + "rotation": { "origin": [ 2, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 2 ], + "to": [ 6.001, 9, 7.5 ], + "rotation": { "origin": [ 6, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 2 ], + "to": [ 14.001, 9, 7.5 ], + "rotation": { "origin": [ 14, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 2 ], + "to": [ 10.001, 9, 7.5 ], + "rotation": { "origin": [ 10, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 10 ], + "to": [ 2.001, 9, 15.5 ], + "rotation": { "origin": [ 2, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 10 ], + "to": [ 6.001, 9, 15.5 ], + "rotation": { "origin": [ 6, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 10 ], + "to": [ 14.001, 9, 15.5 ], + "rotation": { "origin": [ 14, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 10 ], + "to": [ 10.001, 9, 15.5 ], + "rotation": { "origin": [ 10, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json new file mode 100644 index 00000000..9fb3d09b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json @@ -0,0 +1,105 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier_wall", + "texture": "betterend:block/thallasium_chandelier_wall" + }, + "elements": [ + { + "__comment": "PlaneZ2", + "from": [ 4, 2, 2 ], + "to": [ 12, 8, 2.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" }, + "south": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 7, 3, 0 ], + "to": [ 9, 5, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "up": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture" }, + "north": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "south": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "west": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture", "rotation": 270 }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "Box4", + "from": [ 3, 6, 1 ], + "to": [ 5, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box4", + "from": [ 11, 6, 1 ], + "to": [ 13, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 2, 9, 0 ], + "to": [ 2.001, 15, 5.5 ], + "rotation": { "origin": [ 2, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 6, 9, 0 ], + "to": [ 6.001, 15, 5.5 ], + "rotation": { "origin": [ 6, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 10, 9, 0 ], + "to": [ 10.001, 15, 5.5 ], + "rotation": { "origin": [ 10, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 14, 9, 0 ], + "to": [ 14.001, 15, 5.5 ], + "rotation": { "origin": [ 14, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json new file mode 100644 index 00000000..ebc647b5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json @@ -0,0 +1,75 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_bottom", + "texture": "betterend:block/twisted_umbrella_moss_bottom" + }, + "elements": [ + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 16, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 16, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 16, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 16, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 16, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 16, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json new file mode 100644 index 00000000..99a84b70 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json @@ -0,0 +1,238 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json new file mode 100644 index 00000000..d38d3200 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json @@ -0,0 +1,200 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json new file mode 100644 index 00000000..33abf9d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json @@ -0,0 +1,161 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json new file mode 100644 index 00000000..40b41112 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json @@ -0,0 +1,122 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json new file mode 100644 index 00000000..273a61bd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json @@ -0,0 +1,193 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json new file mode 100644 index 00000000..cac3ff94 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json @@ -0,0 +1,155 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json new file mode 100644 index 00000000..f99c6d8b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json @@ -0,0 +1,116 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json new file mode 100644 index 00000000..c97a7fd7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json new file mode 100644 index 00000000..d2bf8c26 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json new file mode 100644 index 00000000..e0ef2166 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json new file mode 100644 index 00000000..a2e17b5f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json new file mode 100644 index 00000000..27bb5dbd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json new file mode 100644 index 00000000..93e86f87 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json new file mode 100644 index 00000000..02690946 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_6" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json new file mode 100644 index 00000000..25254adf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_7" + } +} diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json new file mode 100644 index 00000000..a77378fd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/vaiolush_fern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json new file mode 100644 index 00000000..d65a3ecd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json new file mode 100644 index 00000000..0e7d06d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json new file mode 100644 index 00000000..4e1eaf13 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json deleted file mode 100644 index 05899619..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json deleted file mode 100644 index 09caacad..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json deleted file mode 100644 index 02928f43..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json deleted file mode 100644 index 38aa1ad7..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json deleted file mode 100644 index 8f597f59..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json index 31041706..8a75fa2b 100644 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json +++ b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json @@ -7,7 +7,7 @@ }, "elements": [ { - "from": [ 4, 0, 4 ], + "from": [ 4, -0.01, 4 ], "to": [ 12, 16, 12 ], "faces": { "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "down" }, diff --git a/src/main/resources/assets/betterend/models/block/violecite_button.json b/src/main/resources/assets/betterend/models/block/violecite_button.json deleted file mode 100644 index 5af846c9..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json deleted file mode 100644 index 34e2c997..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button_inventory", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json b/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json deleted file mode 100644 index 2c5dc88a..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button_pressed", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_half_slab.json b/src/main/resources/assets/betterend/models/block/violecite_half_slab.json deleted file mode 100644 index ed487bae..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_half_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json deleted file mode 100644 index 199e7654..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json deleted file mode 100644 index d6ba85b4..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pillar.json b/src/main/resources/assets/betterend/models/block/violecite_pillar.json deleted file mode 100644 index f5e4b854..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pillar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "betterend:block/violecite_pillar_top", - "side": "betterend:block/violecite_pillar_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json b/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json deleted file mode 100644 index 36b648a7..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/pressure_plate_down", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json b/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json deleted file mode 100644 index 7b85fef6..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/pressure_plate_up", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json b/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json deleted file mode 100644 index a92dc366..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite_small_tiles" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_stairs.json deleted file mode 100644 index da47eb95..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_tile.json b/src/main/resources/assets/betterend/models/block/violecite_tile.json deleted file mode 100644 index 148ec8d8..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_tile.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite_tile" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json deleted file mode 100644 index 94cd6db8..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_post.json b/src/main/resources/assets/betterend/models/block/violecite_wall_post.json deleted file mode 100644 index 2f1ba471..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_post.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_post", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_side.json b/src/main/resources/assets/betterend/models/block/violecite_wall_side.json deleted file mode 100644 index 60a7b1f9..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_side.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_side", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json deleted file mode 100644 index 19069a9c..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_side_tall", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/item/terminite_ingot.json b/src/main/resources/assets/betterend/models/item/aeridium.json similarity index 50% rename from src/main/resources/assets/betterend/models/item/terminite_ingot.json rename to src/main/resources/assets/betterend/models/item/aeridium.json index 219b282f..4ae73819 100644 --- a/src/main/resources/assets/betterend/models/item/terminite_ingot.json +++ b/src/main/resources/assets/betterend/models/item/aeridium.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "betterend:item/terminite_ingot" + "layer0": "betterend:block/aeridium" } } diff --git a/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json b/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json deleted file mode 100644 index 6f9a2c71..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_hammer.json b/src/main/resources/assets/betterend/models/item/aeternium_hammer.json deleted file mode 100644 index 97f80b2e..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_helmet.json b/src/main/resources/assets/betterend/models/item/aeternium_helmet.json deleted file mode 100644 index 791cb597..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_helmet" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_shovel.json b/src/main/resources/assets/betterend/models/item/aeternium_shovel.json deleted file mode 100644 index 8592a817..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_shovel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_shovel" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_sword.json b/src/main/resources/assets/betterend/models/item/aeternium_sword.json deleted file mode 100644 index c526a1d1..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_sword.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_sword" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_ingot.json b/src/main/resources/assets/betterend/models/item/amaranita_fur.json similarity index 50% rename from src/main/resources/assets/betterend/models/item/aeternium_ingot.json rename to src/main/resources/assets/betterend/models/item/amaranita_fur.json index 6f365de5..67e96e5e 100644 --- a/src/main/resources/assets/betterend/models/item/aeternium_ingot.json +++ b/src/main/resources/assets/betterend/models/item/amaranita_fur.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "betterend:item/aeternium_ingot" + "layer0": "betterend:block/amaranita_fur" } } diff --git a/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json new file mode 100644 index 00000000..0277110e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_hyphae" +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_lantern.json b/src/main/resources/assets/betterend/models/item/amaranita_lantern.json new file mode 100644 index 00000000..b7d6254e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_lantern" +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_stem.json b/src/main/resources/assets/betterend/models/item/amaranita_stem.json new file mode 100644 index 00000000..8c1f62b3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_stem" +} diff --git a/src/main/resources/assets/betterend/models/item/amber_root_seed.json b/src/main/resources/assets/betterend/models/item/amber_root_seed.json new file mode 100644 index 00000000..85d4164d --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amber_root_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/amber_root_seed" + } +} diff --git a/src/main/resources/assets/betterend/models/item/aurant_polypore.json b/src/main/resources/assets/betterend/models/item/aurant_polypore.json new file mode 100644 index 00000000..75840642 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/aurant_polypore.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/aurant_polypore" + } +} diff --git a/src/main/resources/assets/betterend/models/item/aeternium_leggings.json b/src/main/resources/assets/betterend/models/item/blooming_cooksonia.json similarity index 52% rename from src/main/resources/assets/betterend/models/item/aeternium_leggings.json rename to src/main/resources/assets/betterend/models/item/blooming_cooksonia.json index b21c3b7b..a93ec2e2 100644 --- a/src/main/resources/assets/betterend/models/item/aeternium_leggings.json +++ b/src/main/resources/assets/betterend/models/item/blooming_cooksonia.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "betterend:item/aeternium_leggings" + "layer0": "betterend:block/blooming_cooksonia" } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/blossom_berry.json b/src/main/resources/assets/betterend/models/item/blossom_berry.json new file mode 100644 index 00000000..2363da03 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/blossom_berry.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/blossom_berry" + } +} diff --git a/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json b/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json new file mode 100644 index 00000000..decd9891 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/blossom_berry_seed" + } +} diff --git a/src/main/resources/assets/betterend/models/item/bolux_mushroom.json b/src/main/resources/assets/betterend/models/item/bolux_mushroom.json new file mode 100644 index 00000000..dd398963 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/bolux_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/bolux_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/cave_moss.json b/src/main/resources/assets/betterend/models/item/cave_moss.json deleted file mode 100644 index 56fbfe9f..00000000 --- a/src/main/resources/assets/betterend/models/item/cave_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/cave_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/cave_moss_path.json b/src/main/resources/assets/betterend/models/item/cave_moss_path.json deleted file mode 100644 index 8f2a130f..00000000 --- a/src/main/resources/assets/betterend/models/item/cave_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/cave_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/cave_pumpkin.json b/src/main/resources/assets/betterend/models/item/cave_pumpkin.json new file mode 100644 index 00000000..30275dee --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/cave_pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/cave_pumpkin" +} diff --git a/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json b/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json new file mode 100644 index 00000000..c285f463 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/cave_pumpkin_seed" + } +} diff --git a/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json b/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json new file mode 100644 index 00000000..8f724c6b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/chorus_mushroom_seed" + } +} diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium.json b/src/main/resources/assets/betterend/models/item/chorus_nylium.json deleted file mode 100644 index c3e7084c..00000000 --- a/src/main/resources/assets/betterend/models/item/chorus_nylium.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/chorus_nylium" -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json deleted file mode 100644 index da096761..00000000 --- a/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/chorus_nylium_path" -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/clawfern.json b/src/main/resources/assets/betterend/models/item/clawfern.json new file mode 100644 index 00000000..973dafb8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/clawfern.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/item/crystal_moss.json b/src/main/resources/assets/betterend/models/item/crystal_moss.json deleted file mode 100644 index 187ee92c..00000000 --- a/src/main/resources/assets/betterend/models/item/crystal_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/crystal_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/crystal_moss_path.json b/src/main/resources/assets/betterend/models/item/crystal_moss_path.json deleted file mode 100644 index fbfcbe61..00000000 --- a/src/main/resources/assets/betterend/models/item/crystal_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/crystal_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json b/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json deleted file mode 100644 index 8fcf0ae2..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_hammer.json b/src/main/resources/assets/betterend/models/item/crystalite_hammer.json deleted file mode 100644 index b1428237..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/crystalite_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/diamond_hammer.json b/src/main/resources/assets/betterend/models/item/diamond_hammer.json index 767d96df..77d71587 100644 --- a/src/main/resources/assets/betterend/models/item/diamond_hammer.json +++ b/src/main/resources/assets/betterend/models/item/diamond_hammer.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/diamond_hammer" - } +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/diamond_hammer" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/end_moss.json b/src/main/resources/assets/betterend/models/item/end_moss.json deleted file mode 100644 index 2b859c25..00000000 --- a/src/main/resources/assets/betterend/models/item/end_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/end_moss_path.json b/src/main/resources/assets/betterend/models/item/end_moss_path.json deleted file mode 100644 index 7d7de48a..00000000 --- a/src/main/resources/assets/betterend/models/item/end_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/end_mycelium.json b/src/main/resources/assets/betterend/models/item/end_mycelium.json deleted file mode 100644 index 2dac73a6..00000000 --- a/src/main/resources/assets/betterend/models/item/end_mycelium.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_mycelium" -} diff --git a/src/main/resources/assets/betterend/models/item/end_mycelium_path.json b/src/main/resources/assets/betterend/models/item/end_mycelium_path.json deleted file mode 100644 index 44e814c3..00000000 --- a/src/main/resources/assets/betterend/models/item/end_mycelium_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_mycelium_path" -} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json new file mode 100644 index 00000000..0ea40081 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite" + } +} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json new file mode 100644 index 00000000..642d4c00 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite_cavemoss" + } +} diff --git a/src/main/resources/assets/betterend/models/item/filalux.json b/src/main/resources/assets/betterend/models/item/filalux.json new file mode 100644 index 00000000..7df95c23 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/filalux.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/filalux_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/filalux_wings.json b/src/main/resources/assets/betterend/models/item/filalux_wings.json new file mode 100644 index 00000000..a0fa8b85 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/filalux_wings.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/filalux_wings" + } +} diff --git a/src/main/resources/assets/betterend/models/item/flamaea.json b/src/main/resources/assets/betterend/models/item/flamaea.json new file mode 100644 index 00000000..c3752866 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/flamaea.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/flamaea_1" + } +} diff --git a/src/main/resources/assets/betterend/models/item/crystalite_boots.json b/src/main/resources/assets/betterend/models/item/fracturn.json similarity index 56% rename from src/main/resources/assets/betterend/models/item/crystalite_boots.json rename to src/main/resources/assets/betterend/models/item/fracturn.json index 1a96c392..d233c677 100644 --- a/src/main/resources/assets/betterend/models/item/crystalite_boots.json +++ b/src/main/resources/assets/betterend/models/item/fracturn.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_boots" - } +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/fracturn" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/globulagus.json b/src/main/resources/assets/betterend/models/item/globulagus.json new file mode 100644 index 00000000..0fd492a6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/globulagus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/globulagus" + } +} diff --git a/src/main/resources/assets/betterend/models/item/golden_hammer.json b/src/main/resources/assets/betterend/models/item/golden_hammer.json index 91d0fbde..3928ba3a 100644 --- a/src/main/resources/assets/betterend/models/item/golden_hammer.json +++ b/src/main/resources/assets/betterend/models/item/golden_hammer.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/golden_hammer" - } +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/golden_hammer" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/iron_hammer.json b/src/main/resources/assets/betterend/models/item/iron_hammer.json index 37c4f957..f738e323 100644 --- a/src/main/resources/assets/betterend/models/item/iron_hammer.json +++ b/src/main/resources/assets/betterend/models/item/iron_hammer.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/iron_hammer" - } +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/iron_hammer" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/jungle_fern.json b/src/main/resources/assets/betterend/models/item/jungle_fern.json new file mode 100644 index 00000000..fd4d4a6d --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_fern.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/jungle_fern" + } +} diff --git a/src/main/resources/assets/betterend/models/item/jungle_grass.json b/src/main/resources/assets/betterend/models/item/jungle_grass.json new file mode 100644 index 00000000..0ea9f6c3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/jungle_grass" + } +} diff --git a/src/main/resources/assets/betterend/models/item/jungle_vine.json b/src/main/resources/assets/betterend/models/item/jungle_vine.json new file mode 100644 index 00000000..24123820 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_vine.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/jungle_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/lamellarium.json b/src/main/resources/assets/betterend/models/item/lamellarium.json new file mode 100644 index 00000000..34cbcff7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lamellarium.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lamellarium" + } +} diff --git a/src/main/resources/assets/betterend/models/item/lucernia_leaves.json b/src/main/resources/assets/betterend/models/item/lucernia_leaves.json new file mode 100644 index 00000000..7690b3aa --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lucernia_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/lucernia_leaves_1" +} diff --git a/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json new file mode 100644 index 00000000..091108b2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lucernia_outer_leaves_2" + } +} diff --git a/src/main/resources/assets/betterend/models/item/crystalite_leggings.json b/src/main/resources/assets/betterend/models/item/lumecorn_seed.json similarity index 55% rename from src/main/resources/assets/betterend/models/item/crystalite_leggings.json rename to src/main/resources/assets/betterend/models/item/lumecorn_seed.json index 4457aef3..b00d70f6 100644 --- a/src/main/resources/assets/betterend/models/item/crystalite_leggings.json +++ b/src/main/resources/assets/betterend/models/item/lumecorn_seed.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_leggings" - } +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/lumecorn_seed" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/lutebus.json b/src/main/resources/assets/betterend/models/item/lutebus.json new file mode 100644 index 00000000..335739a8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lutebus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/item/magnula.json b/src/main/resources/assets/betterend/models/item/magnula.json new file mode 100644 index 00000000..f5c0f11c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/magnula.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/magnula_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json b/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json new file mode 100644 index 00000000..591f10e5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_dragon_bone_ver" +} diff --git a/src/main/resources/assets/betterend/models/item/mossy_obsidian.json b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json new file mode 100644 index 00000000..199c8c29 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_obsidian" +} diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus.json b/src/main/resources/assets/betterend/models/item/neon_cactus.json new file mode 100644 index 00000000..3a3f1ba8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_small" +} diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json new file mode 100644 index 00000000..7bfe894c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_slab" +} diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json new file mode 100644 index 00000000..22cab921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_stairs" +} diff --git a/src/main/resources/assets/betterend/models/item/netherite_hammer.json b/src/main/resources/assets/betterend/models/item/netherite_hammer.json index 0040a0f7..bdf1b7e6 100644 --- a/src/main/resources/assets/betterend/models/item/netherite_hammer.json +++ b/src/main/resources/assets/betterend/models/item/netherite_hammer.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/netherite_hammer" - } +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/netherite_hammer" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/nightshade_moss.json b/src/main/resources/assets/betterend/models/item/nightshade_moss.json new file mode 100644 index 00000000..a6d07bee --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/nightshade_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/nightshade_moss" + } +} diff --git a/src/main/resources/assets/betterend/models/item/orango.json b/src/main/resources/assets/betterend/models/item/orango.json new file mode 100644 index 00000000..b0b842a6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/orango.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/orango" + } +} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss.json b/src/main/resources/assets/betterend/models/item/pink_moss.json deleted file mode 100644 index 275797f5..00000000 --- a/src/main/resources/assets/betterend/models/item/pink_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/pink_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss_path.json b/src/main/resources/assets/betterend/models/item/pink_moss_path.json deleted file mode 100644 index de77462e..00000000 --- a/src/main/resources/assets/betterend/models/item/pink_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/pink_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/pond_anemone.json b/src/main/resources/assets/betterend/models/item/pond_anemone.json new file mode 100644 index 00000000..97a6674a --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pond_anemone.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/pond_anemone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/rubinea.json b/src/main/resources/assets/betterend/models/item/rubinea.json new file mode 100644 index 00000000..d510c6ef --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/rubinea.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/rubinea_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/ruscus.json b/src/main/resources/assets/betterend/models/item/ruscus.json new file mode 100644 index 00000000..5fc191c9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/ruscus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/ruscus" + } +} diff --git a/src/main/resources/assets/betterend/models/item/rutiscus.json b/src/main/resources/assets/betterend/models/item/rutiscus.json new file mode 100644 index 00000000..3a6c5939 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/rutiscus.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/rutiscus_1" +} diff --git a/src/main/resources/assets/betterend/models/item/crystalite_helmet.json b/src/main/resources/assets/betterend/models/item/salteago.json similarity index 56% rename from src/main/resources/assets/betterend/models/item/crystalite_helmet.json rename to src/main/resources/assets/betterend/models/item/salteago.json index c6377a56..720dd34b 100644 --- a/src/main/resources/assets/betterend/models/item/crystalite_helmet.json +++ b/src/main/resources/assets/betterend/models/item/salteago.json @@ -1,6 +1,6 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_helmet" - } +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/salteago" + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass.json b/src/main/resources/assets/betterend/models/item/shadow_grass.json deleted file mode 100644 index 2ae401d8..00000000 --- a/src/main/resources/assets/betterend/models/item/shadow_grass.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/shadow_grass" -} diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass_path.json b/src/main/resources/assets/betterend/models/item/shadow_grass_path.json deleted file mode 100644 index 899af266..00000000 --- a/src/main/resources/assets/betterend/models/item/shadow_grass_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/shadow_grass_path" -} diff --git a/src/main/resources/assets/betterend/models/item/silk_moth_hive.json b/src/main/resources/assets/betterend/models/item/silk_moth_hive.json new file mode 100644 index 00000000..64cd5bc7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/silk_moth_hive.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/silk_moth_hive" +} diff --git a/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json new file mode 100644 index 00000000..a6088d8f --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/small_amaranita_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/small_jellyshroom.json b/src/main/resources/assets/betterend/models/item/small_jellyshroom.json new file mode 100644 index 00000000..fb8aa2a9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/small_jellyshroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/small_jellyshroom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json new file mode 100644 index 00000000..b8e5fa55 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_crystal" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json new file mode 100644 index 00000000..e8dbb27e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/smaragdant_crystal_shard" + } +} diff --git a/src/main/resources/assets/betterend/models/item/terminite_block.json b/src/main/resources/assets/betterend/models/item/terminite_block.json deleted file mode 100644 index 43510386..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/terminite_block" -} diff --git a/src/main/resources/assets/betterend/models/item/terminite_boots.json b/src/main/resources/assets/betterend/models/item/terminite_boots.json deleted file mode 100644 index 8e7f7ffe..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_boots" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_chestplate.json b/src/main/resources/assets/betterend/models/item/terminite_chestplate.json deleted file mode 100644 index 1b0e7442..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_hammer.json b/src/main/resources/assets/betterend/models/item/terminite_hammer.json deleted file mode 100644 index f579c92d..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_helmet.json b/src/main/resources/assets/betterend/models/item/terminite_helmet.json deleted file mode 100644 index 7fbdb8a6..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_helmet" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_leggings.json b/src/main/resources/assets/betterend/models/item/terminite_leggings.json deleted file mode 100644 index 191cd4d8..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_leggings" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_shovel.json b/src/main/resources/assets/betterend/models/item/terminite_shovel.json deleted file mode 100644 index 2f34062b..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_shovel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_shovel" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_sword.json b/src/main/resources/assets/betterend/models/item/terminite_sword.json deleted file mode 100644 index 00cf03e3..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_sword.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_sword" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json new file mode 100644 index 00000000..2661165f --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/twisted_umbrella_moss_small" + } +} diff --git a/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..2ec22a77 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/twisted_umbrella_moss_large" + } +} diff --git a/src/main/resources/assets/betterend/models/item/aeternium_boots.json b/src/main/resources/assets/betterend/models/item/vaiolush_fern.json similarity index 54% rename from src/main/resources/assets/betterend/models/item/aeternium_boots.json rename to src/main/resources/assets/betterend/models/item/vaiolush_fern.json index f6caae83..ff63ab3c 100644 --- a/src/main/resources/assets/betterend/models/item/aeternium_boots.json +++ b/src/main/resources/assets/betterend/models/item/vaiolush_fern.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "betterend:item/aeternium_boots" + "layer0": "betterend:block/vaiolush_fern" } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/violecite.json b/src/main/resources/assets/betterend/models/item/violecite.json deleted file mode 100644 index c8139128..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks.json b/src/main/resources/assets/betterend/models/item/violecite_bricks.json deleted file mode 100644 index c998c0c4..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json deleted file mode 100644 index a1b35d09..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_half_slab" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json deleted file mode 100644 index 5a145605..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_stairs" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json deleted file mode 100644 index 4e894bdd..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_wall_inventory" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_button.json b/src/main/resources/assets/betterend/models/item/violecite_button.json deleted file mode 100644 index b8ed9ab9..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_button.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_button_inventory" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_pillar.json b/src/main/resources/assets/betterend/models/item/violecite_pillar.json deleted file mode 100644 index c278b52f..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_pillar.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_pillar" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_plate.json b/src/main/resources/assets/betterend/models/item/violecite_plate.json deleted file mode 100644 index cdca92aa..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_plate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_pressure_plate_up" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_slab.json b/src/main/resources/assets/betterend/models/item/violecite_slab.json deleted file mode 100644 index e8909031..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_slab.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_half_slab" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json b/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json deleted file mode 100644 index 34b0be36..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_small_tiles" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_stairs.json b/src/main/resources/assets/betterend/models/item/violecite_stairs.json deleted file mode 100644 index c7af3f8c..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_stairs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_stairs" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_tile.json b/src/main/resources/assets/betterend/models/item/violecite_tile.json deleted file mode 100644 index 8de1a119..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_tile.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_tile" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_wall.json b/src/main/resources/assets/betterend/models/item/violecite_wall.json deleted file mode 100644 index 32556ef6..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_wall.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_wall_inventory" -} diff --git a/src/main/resources/assets/betterend/particles/firefly.json b/src/main/resources/assets/betterend/particles/firefly.json new file mode 100644 index 00000000..059552aa --- /dev/null +++ b/src/main/resources/assets/betterend/particles/firefly.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "betterend:firefly" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/particles/jungle_spore.json b/src/main/resources/assets/betterend/particles/jungle_spore.json new file mode 100644 index 00000000..00b88f5f --- /dev/null +++ b/src/main/resources/assets/betterend/particles/jungle_spore.json @@ -0,0 +1,22 @@ +{ + "textures": [ + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/particles/smaragdant_particle.json b/src/main/resources/assets/betterend/particles/smaragdant_particle.json new file mode 100644 index 00000000..774ebb76 --- /dev/null +++ b/src/main/resources/assets/betterend/particles/smaragdant_particle.json @@ -0,0 +1,13 @@ +{ + "textures": [ + "betterend:smaragdant_particle_1", + "betterend:smaragdant_particle_2", + "betterend:smaragdant_particle_3", + "betterend:smaragdant_particle_4", + "betterend:smaragdant_particle_5", + "betterend:smaragdant_particle_6", + "betterend:smaragdant_particle_7", + "betterend:smaragdant_particle_8", + "betterend:smaragdant_particle_9" + ] +} diff --git a/src/main/resources/assets/betterend/patterns/block/anvil.json b/src/main/resources/assets/betterend/patterns/block/anvil.json new file mode 100644 index 00000000..8d6658d3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/anvil.json @@ -0,0 +1,68 @@ +{ + "parent": "block/block", + "textures": { + "particle": "betterend:block/%anvil%_front", + "front": "betterend:block/%anvil%_front", + "back": "betterend:block/%anvil%_back", + "top": "betterend:block/%top%", + "panel": "betterend:block/%anvil%_panel", + "bottom": "betterend:block/%anvil%_bottom" + }, + "elements": [ + { + "__comment": "Bottom", + "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#panel" }, + "north": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "south": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "west": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" }, + "east": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" } + } + }, + { + "__comment": "Plate", + "from": [ 4, 4, 3 ], + "to": [ 12, 5, 13 ], + "faces": { + "up": { "uv": [ 4, 3, 12, 13 ], "texture": "#panel" }, + "north": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "south": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "west": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" }, + "east": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" } + } + }, + { + "__comment": "Support", + "from": [ 6, 5, 4 ], + "to": [ 10, 10, 12 ], + "faces": { + "north": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "south": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "west": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" }, + "east": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" } + } + }, + { + "__comment": "Top", + "from": [ 3, 10, 0 ], + "to": [ 13, 16, 16 ], + "faces": { + "down": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "up": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "south": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "west": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" }, + "east": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" } + } + } + ], + "display": { + "fixed": { + "rotation": [ 0, 90, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/bars_post.json b/src/main/resources/assets/betterend/patterns/block/bars_post.json new file mode 100644 index 00000000..eb195425 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/bars_post.json @@ -0,0 +1,22 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "top": "betterend:block/%block%_top", + "particle": "#top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/bars_side.json b/src/main/resources/assets/betterend/patterns/block/bars_side.json new file mode 100644 index 00000000..5d1f5198 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/bars_side.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "side": "betterend:block/%block%", + "top": "betterend:block/%block%_top", + "particle": "#side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 0 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 16 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 7, 0, 9, 9 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#side" }, + "west": { "uv": [ 0, 0, 9, 16 ], "texture": "#side" }, + "east": { "uv": [ 7, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/block_colored.json b/src/main/resources/assets/betterend/patterns/block/block_colored.json new file mode 100644 index 00000000..b7569292 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/block_colored.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/tint_cube", + "textures": { + "texture": "betterend:block/%texture%" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json similarity index 95% rename from src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json rename to src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json index 7bb4eab5..2fbd730d 100644 --- a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json +++ b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json @@ -2,8 +2,8 @@ "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "parent": "block/block", "textures": { - "overlay": "betterend:block/bulb_vine_lantern_overlay", - "metal": "betterend:block/bulb_vine_lantern_metal", + "overlay": "betterend:block/%glow%", + "metal": "betterend:block/%metal%", "particle": "#overlay" }, "elements": [ diff --git a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json similarity index 95% rename from src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json rename to src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json index a2ff75fe..eff565eb 100644 --- a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json +++ b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json @@ -2,8 +2,8 @@ "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "parent": "block/block", "textures": { - "overlay": "betterend:block/bulb_vine_lantern_overlay", - "metal": "betterend:block/bulb_vine_lantern_metal", + "overlay": "betterend:block/%glow%", + "metal": "betterend:block/%metal%", "particle": "#overlay" }, "elements": [ diff --git a/src/main/resources/assets/betterend/patterns/block/chain.json b/src/main/resources/assets/betterend/patterns/block/chain.json new file mode 100644 index 00000000..8638b8b3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chain.json @@ -0,0 +1,7 @@ +{ + "parent": "block/chain", + "textures": { + "particle": "betterend:block/%block%", + "all": "betterend:block/%block%" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json b/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json new file mode 100644 index 00000000..d39683f3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json @@ -0,0 +1,134 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_ceil", + "texture": "betterend:block/%texture%_ceil", + "rod": "betterend:block/%texture%_floor" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 2, 2 ], + "to": [ 2.001, 15, 19 ], + "rotation": { "origin": [ 2, 2, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 2, 2 ], + "to": [ 14.001, 15, 19 ], + "rotation": { "origin": [ 14, 2, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 2 ], + "to": [ 2.001, 9, 7.5 ], + "rotation": { "origin": [ 2, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 2 ], + "to": [ 6.001, 9, 7.5 ], + "rotation": { "origin": [ 6, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 2 ], + "to": [ 14.001, 9, 7.5 ], + "rotation": { "origin": [ 14, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 2 ], + "to": [ 10.001, 9, 7.5 ], + "rotation": { "origin": [ 10, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 10 ], + "to": [ 2.001, 9, 15.5 ], + "rotation": { "origin": [ 2, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 10 ], + "to": [ 6.001, 9, 15.5 ], + "rotation": { "origin": [ 6, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 10 ], + "to": [ 14.001, 9, 15.5 ], + "rotation": { "origin": [ 14, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 10 ], + "to": [ 10.001, 9, 15.5 ], + "rotation": { "origin": [ 10, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json b/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json new file mode 100644 index 00000000..54123380 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_floor", + "texture": "betterend:block/%texture%_floor" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 1, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 1, 2 ], + "to": [ 2.001, 10, 19 ], + "rotation": { "origin": [ 2, 1, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 1, 2 ], + "to": [ 14.001, 10, 19 ], + "rotation": { "origin": [ 14, 1, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 2 ], + "to": [ 2.001, 16, 7.5 ], + "rotation": { "origin": [ 2, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 2 ], + "to": [ 6.001, 16, 7.5 ], + "rotation": { "origin": [ 6, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 2 ], + "to": [ 10.001, 16, 7.5 ], + "rotation": { "origin": [ 10, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 2 ], + "to": [ 14.001, 16, 7.5 ], + "rotation": { "origin": [ 14, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 10 ], + "to": [ 2.001, 16, 15.5 ], + "rotation": { "origin": [ 2, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 10 ], + "to": [ 6.001, 16, 15.5 ], + "rotation": { "origin": [ 6, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 10 ], + "to": [ 10.001, 16, 15.5 ], + "rotation": { "origin": [ 10, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 10 ], + "to": [ 14.001, 16, 15.5 ], + "rotation": { "origin": [ 14, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json b/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json new file mode 100644 index 00000000..e469fb1f --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json @@ -0,0 +1,105 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_wall", + "texture": "betterend:block/%texture%_wall" + }, + "elements": [ + { + "__comment": "PlaneZ2", + "from": [ 4, 2, 2 ], + "to": [ 12, 8, 2.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" }, + "south": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 7, 3, 0 ], + "to": [ 9, 5, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "up": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture" }, + "north": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "south": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "west": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture", "rotation": 270 }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "Box4", + "from": [ 3, 6, 1 ], + "to": [ 5, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box4", + "from": [ 11, 6, 1 ], + "to": [ 13, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 2, 9, 0 ], + "to": [ 2.001, 15, 5.5 ], + "rotation": { "origin": [ 2, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 6, 9, 0 ], + "to": [ 6.001, 15, 5.5 ], + "rotation": { "origin": [ 6, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 10, 9, 0 ], + "to": [ 10.001, 15, 5.5 ], + "rotation": { "origin": [ 10, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 14, 9, 0 ], + "to": [ 14.001, 15, 5.5 ], + "rotation": { "origin": [ 14, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/sapling.json b/src/main/resources/assets/betterend/patterns/block/cross.json similarity index 100% rename from src/main/resources/assets/betterend/patterns/block/sapling.json rename to src/main/resources/assets/betterend/patterns/block/cross.json diff --git a/src/main/resources/assets/betterend/patterns/block/cross_shaded.json b/src/main/resources/assets/betterend/patterns/block/cross_shaded.json new file mode 100644 index 00000000..7ff90f6b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/cross_shaded.json @@ -0,0 +1,25 @@ +{ + "ambientocclusion": false, + "textures": { + "cross": "betterend:block/%texture%", + "particle": "#cross" + }, + "elements": [ + { "from": [ 0.8, 0, 8 ], + "to": [ 15.2, 16, 8 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" } + } + }, + { "from": [ 8, 0, 0.8 ], + "to": [ 8, 16, 15.2 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/patterns/block/furnace.json b/src/main/resources/assets/betterend/patterns/block/furnace.json new file mode 100644 index 00000000..be5bece7 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/furnace.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "top": "betterend:block/%top%", + "front": "betterend:block/%front%", + "side": "betterend:block/%side%", + "bottom": "betterend:block/%top%" + } +} diff --git a/src/main/resources/assets/betterend/patterns/block/furnace_glow.json b/src/main/resources/assets/betterend/patterns/block/furnace_glow.json new file mode 100644 index 00000000..db2bd401 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/furnace_glow.json @@ -0,0 +1,38 @@ +{ + "parent": "block/block", + "textures": { + "top": "betterend:block/%top%", + "front": "betterend:block/%front%", + "side": "betterend:block/%side%", + "glow": "betterend:block/%glow%" + }, + "display": { + "firstperson_righthand": { + "rotation": [ 0, 135, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#front", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "north": { "texture": "#glow", "cullface": "north" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/patterns/block/path.json b/src/main/resources/assets/betterend/patterns/block/path.json new file mode 100644 index 00000000..747d9c1b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/%top%", + "side": "betterend:block/%side%", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_0.json b/src/main/resources/assets/betterend/patterns/block/stalactite_0.json new file mode 100644 index 00000000..7ab88f13 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_0.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_1.json b/src/main/resources/assets/betterend/patterns/block/stalactite_1.json new file mode 100644 index 00000000..4dee3472 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_1.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_2.json b/src/main/resources/assets/betterend/patterns/block/stalactite_2.json new file mode 100644 index 00000000..f2ba501e --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_2.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_3.json b/src/main/resources/assets/betterend/patterns/block/stalactite_3.json new file mode 100644 index 00000000..39bf5888 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_3.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_4.json b/src/main/resources/assets/betterend/patterns/block/stalactite_4.json new file mode 100644 index 00000000..0e4b94ff --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_4.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 0, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_5.json b/src/main/resources/assets/betterend/patterns/block/stalactite_5.json new file mode 100644 index 00000000..ffad125b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_5.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, 0, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_6.json b/src/main/resources/assets/betterend/patterns/block/stalactite_6.json new file mode 100644 index 00000000..75f30db0 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_6.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 15, 16, 15 ], + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_7.json b/src/main/resources/assets/betterend/patterns/block/stalactite_7.json new file mode 100644 index 00000000..9fc0cdd5 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_7.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json new file mode 100644 index 00000000..c2ed967d --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture" }, + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture" }, + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json new file mode 100644 index 00000000..f33e1e64 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture" }, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json new file mode 100644 index 00000000..145acf77 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json b/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json new file mode 100644 index 00000000..d0727650 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "%bottom%", + "side": "%side%", + "top": "%top%" + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/anvil.json b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json new file mode 100644 index 00000000..253ff406 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json @@ -0,0 +1,16 @@ +{ + "variants": { + "destruction=0,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=0,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=0,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=0,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + "destruction=1,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=1,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=1,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=1,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + "destruction=2,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=2,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=2,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=2,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json b/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json new file mode 100644 index 00000000..485d07d2 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json @@ -0,0 +1,48 @@ +{ + "variants": { + "destruction=0,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=0,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=0,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=0,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=1,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=1,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=1,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=1,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=2,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=2,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=2,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=2,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=3,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=3,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=3,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=3,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=4,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=4,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=4,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=4,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=5,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=5,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=5,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=5,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=6,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=6,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=6,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=6,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 }, + + "destruction=7,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=7,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=7,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=7,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 }, + + "destruction=8,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=8,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=8,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=8,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/bars.json b/src/main/resources/assets/betterend/patterns/blockstate/bars.json new file mode 100644 index 00000000..592671d3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/bars.json @@ -0,0 +1,53 @@ +{ + "multipart": [ + { + "when": { + "west": "false", + "east": "false", + "south": "false", + "north": "false" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_post" + } + }, + { + "when": { + "north": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side" + } + }, + { + "when": { + "east": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 90 + } + }, + { + "when": { + "south": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 180 + } + }, + { + "when": { + "west": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 270 + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json b/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json index 5948df50..f8917353 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json @@ -1,6 +1,6 @@ { "variants": { - "is_floor=false": { "model": "%block%_ceil" }, - "is_floor=true": { "model": "%block%_floor" } + "is_floor=false": { "model": "betterend:pattern/%block%/%block%_ceil" }, + "is_floor=true": { "model": "betterend:pattern/%block%/%block%_floor" } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/chain.json b/src/main/resources/assets/betterend/patterns/blockstate/chain.json new file mode 100644 index 00000000..76071638 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/chain.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "betterend:pattern/%block%", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "betterend:pattern/%block%" + }, + "axis=z": { + "model": "betterend:pattern/%block%", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json b/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json new file mode 100644 index 00000000..c8b5b577 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:pattern/%block%/%block%_floor" }, + "facing=down": { "model": "betterend:pattern/%block%/%block%_ceil" }, + "facing=north": { "model": "betterend:pattern/%block%/%block%_wall", "y": 180 }, + "facing=south": { "model": "betterend:pattern/%block%/%block%_wall" }, + "facing=east": { "model": "betterend:pattern/%block%/%block%_wall", "y": 270 }, + "facing=west": { "model": "betterend:pattern/%block%/%block%_wall", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/furnace.json b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json new file mode 100644 index 00000000..84d508df --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 90 + }, + "facing=east,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "betterend:pattern/%block%/%block%" + }, + "facing=north,lit=true": { + "model": "betterend:pattern/%block%/%block%_on" + }, + "facing=south,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 180 + }, + "facing=south,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 270 + }, + "facing=west,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 270 + } + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json b/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json new file mode 100644 index 00000000..87927d74 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json @@ -0,0 +1,21 @@ +{ + "variants": { + "facing=up,powered=false": { "model": "betterend:pattern/%block%/%block%_up" }, + "facing=up,powered=true": { "model": "betterend:pattern/%block%/%block%_down" }, + + "facing=down,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 180 }, + "facing=down,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 180 }, + + "facing=north,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90 }, + "facing=north,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90 }, + + "facing=south,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 180 }, + "facing=south,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 180 }, + + "facing=east,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 90 }, + "facing=east,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 90 }, + + "facing=west,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 270 }, + "facing=west,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 270 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json new file mode 100644 index 00000000..f97c20c9 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:pattern/%block%" }, + { "model": "betterend:pattern/%block%", "y": 90 }, + { "model": "betterend:pattern/%block%", "y": 180 }, + { "model": "betterend:pattern/%block%", "y": 270 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json new file mode 100644 index 00000000..d9e41bcc --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json @@ -0,0 +1,21 @@ +{ + "variants": + { + "size=0,is_floor=true": { "model": "betterend:pattern/%block%/%block%_0" }, + "size=1,is_floor=true": { "model": "betterend:pattern/%block%/%block%_1" }, + "size=2,is_floor=true": { "model": "betterend:pattern/%block%/%block%_2" }, + "size=3,is_floor=true": { "model": "betterend:pattern/%block%/%block%_3" }, + "size=4,is_floor=true": { "model": "betterend:pattern/%block%/%block%_4" }, + "size=5,is_floor=true": { "model": "betterend:pattern/%block%/%block%_5" }, + "size=6,is_floor=true": { "model": "betterend:pattern/%block%/%block%_6" }, + "size=7,is_floor=true": { "model": "betterend:pattern/%block%/%block%_7" }, + "size=0,is_floor=false": { "model": "betterend:pattern/%block%/%block%_0", "x": 180 }, + "size=1,is_floor=false": { "model": "betterend:pattern/%block%/%block%_1", "x": 180 }, + "size=2,is_floor=false": { "model": "betterend:pattern/%block%/%block%_2", "x": 180 }, + "size=3,is_floor=false": { "model": "betterend:pattern/%block%/%block%_3", "x": 180 }, + "size=4,is_floor=false": { "model": "betterend:pattern/%block%/%block%_4", "x": 180 }, + "size=5,is_floor=false": { "model": "betterend:pattern/%block%/%block%_5", "x": 180 }, + "size=6,is_floor=false": { "model": "betterend:pattern/%block%/%block%_6", "x": 180 }, + "size=7,is_floor=false": { "model": "betterend:pattern/%block%/%block%_7", "x": 180 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json new file mode 100644 index 00000000..377caff4 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json @@ -0,0 +1,22 @@ +{ + "variants": { + "shape=bottom": [ + { "model": "betterend:pattern/%block%/%block%" }, + { "model": "betterend:pattern/%block%/%block%", "y": 90 }, + { "model": "betterend:pattern/%block%/%block%", "y": 180 }, + { "model": "betterend:pattern/%block%/%block%", "y": 270 } + ], + "shape=middle": [ + { "model": "betterend:pattern/%block%/%block%_middle" }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 90 }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 180 }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 270 } + ], + "shape=top": [ + { "model": "betterend:pattern/%block%/%block%", "x": 180 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 90 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 180 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 270 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag b/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag new file mode 100644 index 00000000..a40e0424 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag @@ -0,0 +1,8 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.b - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.b - fragData.spriteColor.g); + fragData.emissivity = (a > 0.1 && b > 0.1 && fragData.spriteColor.b > 0.1) ? 0.5 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_65.frag b/src/main/resources/assets/betterend/shaders/material/glow_65.frag new file mode 100644 index 00000000..6e1480fd --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_65.frag @@ -0,0 +1,6 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + fragData.emissivity = frx_luminance(fragData.spriteColor.rgb) > 0.65 ? 1 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag new file mode 100644 index 00000000..70450f40 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag @@ -0,0 +1,8 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.b - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.b - fragData.spriteColor.g); + fragData.emissivity = (a > 0.1 && b > 0.1 && fragData.spriteColor.b > 0.8) ? 1.0 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag b/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag new file mode 100644 index 00000000..3726e165 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag @@ -0,0 +1,6 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + fragData.emissivity = (fragData.spriteColor.r < 0.6 && (fragData.spriteColor.b > 0.3 || fragData.spriteColor.g > 0.3)) ? 1.0 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_green.frag b/src/main/resources/assets/betterend/shaders/material/glow_green.frag new file mode 100644 index 00000000..67bfbc03 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_green.frag @@ -0,0 +1,9 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.g - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.g - fragData.spriteColor.b); + float l = frx_luminance(fragData.spriteColor.rgb); + fragData.emissivity = ((l > 0.9) || (a > 0.1 && b > 0.1 && fragData.spriteColor.g > 0.5)) ? 1 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag new file mode 100644 index 00000000..3733aa0d --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag @@ -0,0 +1,8 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.g - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.g - fragData.spriteColor.b); + fragData.emissivity = (fragData.spriteColor.g > 0.3) ? 0.6 : 0; +} diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 9c0ccf60..03913530 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -1,5 +1,5 @@ { - "betterend.music.foggy_mushroomland": { + "betterend.music.forest": { "category": "music", "sounds": [ { @@ -11,102 +11,7 @@ "name": "betterend:music/dan_henig-nebular_focus", "volume": 0.2, "stream": false - } - ] - }, - "betterend.music.chorus_forest": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/emmit_fenn-creep", - "volume": 0.2, - "stream": false }, - { - "name": "betterend:music/jesse_gallagher-the_anunnaki_return", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.crystal_mountains": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/jesse_gallagher-spenta_mainyu", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-obelisks", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.megalake": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/jesse_gallagher-the_blue_pearl", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-venkatesananda", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.dust_wastelands": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/the-tides-ammil", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/vyen-amber", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.shadow_forest": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/i_think_i_can_help_you-the_six_realms", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-maestro_tlakaelel", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.blossoming_spires": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/benjamin_martins-verve", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/the_tides-somnolent", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.amber_land": { - "category": "music", - "sounds": [ { "name": "betterend:music/bobby_richards-two_moons", "volume": 0.2, @@ -119,7 +24,57 @@ } ] }, - "betterend.music.sulphur_springs": { + "betterend.music.water": { + "category": "music", + "sounds": [ + { + "name": "betterend:music/jesse_gallagher-the_blue_pearl", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-venkatesananda", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/the_tides-somnolent", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/benjamin_martins-verve", + "volume": 0.2, + "stream": false + } + ] + }, + "betterend.music.dark": { + "category": "music", + "sounds": [ + { + "name": "betterend:music/emmit_fenn-creep", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-the_anunnaki_return", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/i_think_i_can_help_you-the_six_realms", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-maestro_tlakaelel", + "volume": 0.2, + "stream": false + } + ] + }, + "betterend.music.openspace": { "category": "music", "sounds": [ { @@ -131,6 +86,16 @@ "name": "betterend:music/asher_fulero-elegy", "volume": 0.2, "stream": false + }, + { + "name": "betterend:music/the-tides-ammil", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/vyen-amber", + "volume": 0.2, + "stream": false } ] }, @@ -199,6 +164,26 @@ } ] }, + "betterend.ambient.umbrella_jungle": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/umbrella_jungle", + "volume": 1.0, + "stream": false + } + ] + }, + "betterend.ambient.glowing_grasslands": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/glowing_grasslands", + "volume": 1.0, + "stream": false + } + ] + }, "betterend.entity.dragonfly": { "category": "entity", @@ -247,5 +232,15 @@ "stream": false } ] + }, + + "betterend.record.strange_and_alien": { + "category": "record", + "sounds": [ + { + "name": "betterend:records/firel-strange_and_alien", + "stream": false + } + ] } } diff --git a/src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg b/src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg new file mode 100644 index 00000000..f2c886fe Binary files /dev/null and b/src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg differ diff --git a/src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg b/src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg new file mode 100644 index 00000000..5529381a Binary files /dev/null and b/src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg differ diff --git a/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg b/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg deleted file mode 100644 index 13a48c1c..00000000 Binary files a/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg and /dev/null differ diff --git a/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-spenta_mainyu.ogg b/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-spenta_mainyu.ogg deleted file mode 100644 index 4469ac22..00000000 Binary files a/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-spenta_mainyu.ogg and /dev/null differ diff --git a/src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg b/src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg new file mode 100644 index 00000000..55898878 Binary files /dev/null and b/src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg differ diff --git a/src/main/resources/assets/betterend/textures/block/aeridium.png b/src/main/resources/assets/betterend/textures/block/aeridium.png new file mode 100644 index 00000000..ad97e778 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeridium.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeridium_e.png b/src/main/resources/assets/betterend/textures/block/aeridium_e.png new file mode 100644 index 00000000..e3a7da6f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeridium_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png new file mode 100644 index 00000000..42d59708 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png new file mode 100644 index 00000000..fbf5143b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png new file mode 100644 index 00000000..9b2d22b6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png new file mode 100644 index 00000000..afdcd731 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png new file mode 100644 index 00000000..b206f373 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png new file mode 100644 index 00000000..84380c58 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png new file mode 100644 index 00000000..3e8e4f66 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_block.png b/src/main/resources/assets/betterend/textures/block/aeternium_block.png index 413d1659..eae91fe3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_block.png and b/src/main/resources/assets/betterend/textures/block/aeternium_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_cap.png b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png new file mode 100644 index 00000000..6b7fddd1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png new file mode 100644 index 00000000..e735e76d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png new file mode 100644 index 00000000..c25e3b08 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png new file mode 100644 index 00000000..8148cff5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png new file mode 100644 index 00000000..2f4f4f63 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png new file mode 100644 index 00000000..e236e4d2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png b/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png new file mode 100644 index 00000000..dc669adb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png new file mode 100644 index 00000000..69ad1cad Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png new file mode 100644 index 00000000..f7317e51 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png new file mode 100644 index 00000000..cb26d739 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_grass.png b/src/main/resources/assets/betterend/textures/block/amber_grass.png index aa86babf..c78817cf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_grass.png and b/src/main/resources/assets/betterend/textures/block/amber_grass.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_0.png b/src/main/resources/assets/betterend/textures/block/amber_root_0.png new file mode 100644 index 00000000..bccbce93 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_root_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_1.png b/src/main/resources/assets/betterend/textures/block/amber_root_1.png new file mode 100644 index 00000000..7ca89b63 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_root_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_2.png b/src/main/resources/assets/betterend/textures/block/amber_root_2.png new file mode 100644 index 00000000..1a05d5f9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_root_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_3.png b/src/main/resources/assets/betterend/textures/block/amber_root_3.png new file mode 100644 index 00000000..e9e6b445 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_root_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png b/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png index 13152ff3..611ad6c0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png and b/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore.png new file mode 100644 index 00000000..f3f94190 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aurant_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png new file mode 100644 index 00000000..7d19a8a3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png new file mode 100644 index 00000000..b77aa314 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png new file mode 100644 index 00000000..7dd9d794 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png new file mode 100644 index 00000000..85243b6b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png new file mode 100644 index 00000000..8be6d6db Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png new file mode 100644 index 00000000..d6f4c239 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png new file mode 100644 index 00000000..097f9402 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png new file mode 100644 index 00000000..690edaf9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png new file mode 100644 index 00000000..4e406618 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png new file mode 100644 index 00000000..68aec9bd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png new file mode 100644 index 00000000..6905d1b7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png new file mode 100644 index 00000000..5d8cb503 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_polished.png new file mode 100644 index 00000000..113e1e8e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png new file mode 100644 index 00000000..52ba752a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png new file mode 100644 index 00000000..4cc6d5d8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png new file mode 100644 index 00000000..dbb75d68 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png new file mode 100644 index 00000000..ba9f2ee4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png new file mode 100644 index 00000000..4e45aec2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png new file mode 100644 index 00000000..7bd6704e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png new file mode 100644 index 00000000..fe5bdee0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png new file mode 100644 index 00000000..6b4242aa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png new file mode 100644 index 00000000..de1ecd70 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png index c269849a..4b7ca65f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png and b/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png new file mode 100644 index 00000000..8b869fa1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png new file mode 100644 index 00000000..d90e929b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png new file mode 100644 index 00000000..55896402 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png new file mode 100644 index 00000000..430080fa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png.mcmeta similarity index 100% rename from src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png.mcmeta rename to src/main/resources/assets/betterend/textures/block/bulb_vine_e.png.mcmeta diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png deleted file mode 100644 index ac1adf8d..00000000 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png new file mode 100644 index 00000000..ea2f464a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png.mcmeta new file mode 100644 index 00000000..f0c66dc9 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 32 + } +} diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png new file mode 100644 index 00000000..ea2f464a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta new file mode 100644 index 00000000..f0c66dc9 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 32 + } +} diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png new file mode 100644 index 00000000..8a3c1a3a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta new file mode 100644 index 00000000..f0c66dc9 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 32 + } +} diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png new file mode 100644 index 00000000..aa5bef81 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png new file mode 100644 index 00000000..6430c866 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png new file mode 100644 index 00000000..511e9552 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png new file mode 100644 index 00000000..651708a1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png index b0dfeefd..0270aade 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png index 6d47e982..232ab77d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png new file mode 100644 index 00000000..e2ebfeaa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png index b35de946..2261d204 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png new file mode 100644 index 00000000..f61e82a1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png index cae9bdfe..99bb6a69 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png new file mode 100644 index 00000000..5cd9b25f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_1.png b/src/main/resources/assets/betterend/textures/block/cave_grass_1.png index c5b44c18..fba927d7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_grass_1.png and b/src/main/resources/assets/betterend/textures/block/cave_grass_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png index fa6e0ab9..dde241fe 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png and b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png index 2d67b177..efdecb02 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png and b/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_side.png b/src/main/resources/assets/betterend/textures/block/cave_moss_side.png index b4e4b63a..97aabc14 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_moss_side.png and b/src/main/resources/assets/betterend/textures/block/cave_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png index 1d3698b2..14eb1bae 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png and b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png new file mode 100644 index 00000000..6c35ab7d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png new file mode 100644 index 00000000..96e2e1f4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png new file mode 100644 index 00000000..1a75960f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png new file mode 100644 index 00000000..01b6a719 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png new file mode 100644 index 00000000..71f6391c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png new file mode 100644 index 00000000..7944679b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png new file mode 100644 index 00000000..9b3607bd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png new file mode 100644 index 00000000..821029c3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charcoal_block.png b/src/main/resources/assets/betterend/textures/block/charcoal_block.png new file mode 100644 index 00000000..8b3696b5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/charcoal_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png new file mode 100644 index 00000000..8162484c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_1.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_1.png new file mode 100644 index 00000000..126807c7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png new file mode 100644 index 00000000..dcd8ddd9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png new file mode 100644 index 00000000..5cfacd08 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 756dae1e..828b15af 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_plant.png and b/src/main/resources/assets/betterend/textures/block/chorus_plant.png differ diff --git a/src/main/resources/assets/betterend/textures/block/clawfern.png b/src/main/resources/assets/betterend/textures/block/clawfern.png new file mode 100644 index 00000000..80214371 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/clawfern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png b/src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png new file mode 100644 index 00000000..fa335d7a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_grass_1.png b/src/main/resources/assets/betterend/textures/block/crystal_grass_1.png deleted file mode 100644 index 7e47df58..00000000 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_grass_1.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png b/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png index 38821abf..5aca7d4d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png and b/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png b/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png index a3defda5..2e7a9262 100644 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png and b/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png b/src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png new file mode 100644 index 00000000..8cb58d09 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png new file mode 100644 index 00000000..f238dda9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png new file mode 100644 index 00000000..564ba177 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png new file mode 100644 index 00000000..3b204813 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png b/src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png new file mode 100644 index 00000000..2dc6da0d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_flower_small_e.png b/src/main/resources/assets/betterend/textures/block/end_lily_flower_small_e.png new file mode 100644 index 00000000..dbb9d518 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lily_flower_small_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png new file mode 100644 index 00000000..0bb66e45 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png new file mode 100644 index 00000000..f8c7e2e8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png index 20536244..e30d7b3b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png new file mode 100644 index 00000000..7f688b67 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png new file mode 100644 index 00000000..5834c996 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_side.png b/src/main/resources/assets/betterend/textures/block/end_moss_side.png index 6a328812..cc0449f7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_moss_side.png and b/src/main/resources/assets/betterend/textures/block/end_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_top.png b/src/main/resources/assets/betterend/textures/block/end_moss_top.png index 0f537882..de6139a4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_moss_top.png and b/src/main/resources/assets/betterend/textures/block/end_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_portal.png b/src/main/resources/assets/betterend/textures/block/end_portal.png index 2e168bd1..4c79d3e2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_portal.png and b/src/main/resources/assets/betterend/textures/block/end_portal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_portal_grey.png b/src/main/resources/assets/betterend/textures/block/end_portal_grey.png new file mode 100644 index 00000000..c04fe031 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_portal_grey.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png new file mode 100644 index 00000000..65e87503 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png new file mode 100644 index 00000000..ba052c0d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png new file mode 100644 index 00000000..58dcd4a1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png new file mode 100644 index 00000000..58dcd4a1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png new file mode 100644 index 00000000..bd8a0e59 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png new file mode 100644 index 00000000..5b79a56e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png index 65e87503..1ee9ea3c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png index 629e8dac..47c3f431 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png index bd8a0e59..3abdc94f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png index 5b79a56e..71f47f4f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png new file mode 100644 index 00000000..21690cf5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png new file mode 100644 index 00000000..ef790765 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png new file mode 100644 index 00000000..03cc818c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png new file mode 100644 index 00000000..06558e52 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png new file mode 100644 index 00000000..141e59ee Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png new file mode 100644 index 00000000..6b3820e6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png new file mode 100644 index 00000000..0a73d8fa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png new file mode 100644 index 00000000..e92f5a5a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png new file mode 100644 index 00000000..24de0bb9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png new file mode 100644 index 00000000..e025e06f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png new file mode 100644 index 00000000..9ea8fc49 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png new file mode 100644 index 00000000..8c01d85c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png new file mode 100644 index 00000000..807efa04 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png new file mode 100644 index 00000000..1e387a9f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png new file mode 100644 index 00000000..6484f928 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png new file mode 100644 index 00000000..563537ca Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ender_block.png b/src/main/resources/assets/betterend/textures/block/ender_block.png index 4658d5a1..929bdec1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ender_block.png and b/src/main/resources/assets/betterend/textures/block/ender_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png new file mode 100644 index 00000000..73f9e380 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png new file mode 100644 index 00000000..dc94f6b6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png new file mode 100644 index 00000000..d217989c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png new file mode 100644 index 00000000..02fe0302 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_middle.png b/src/main/resources/assets/betterend/textures/block/filalux_middle.png new file mode 100644 index 00000000..2a7dddbb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings.png b/src/main/resources/assets/betterend/textures/block/filalux_wings.png new file mode 100644 index 00000000..081170d4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_wings.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png new file mode 100644 index 00000000..06ba9fd1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png new file mode 100644 index 00000000..00f90595 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png new file mode 100644 index 00000000..bc399f47 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png new file mode 100644 index 00000000..62661b9a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1.png b/src/main/resources/assets/betterend/textures/block/flamaea_1.png new file mode 100644 index 00000000..d7fb8cef Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png new file mode 100644 index 00000000..e246a96e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_2.png b/src/main/resources/assets/betterend/textures/block/flamaea_2.png new file mode 100644 index 00000000..0b3486f9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png new file mode 100644 index 00000000..d6b109e7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_3.png b/src/main/resources/assets/betterend/textures/block/flamaea_3.png new file mode 100644 index 00000000..4404b30e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png new file mode 100644 index 00000000..c2071744 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_4.png b/src/main/resources/assets/betterend/textures/block/flamaea_4.png new file mode 100644 index 00000000..098f1fd3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png new file mode 100644 index 00000000..46c461bf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5.png b/src/main/resources/assets/betterend/textures/block/flamaea_5.png new file mode 100644 index 00000000..52458b41 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png new file mode 100644 index 00000000..3d1d907e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite.png b/src/main/resources/assets/betterend/textures/block/flavolite.png index 07fb6d59..25e7f824 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite.png and b/src/main/resources/assets/betterend/textures/block/flavolite.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png b/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png index 51106a7d..9446fb39 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png and b/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png new file mode 100644 index 00000000..dfb223f4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png new file mode 100644 index 00000000..0a186122 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png new file mode 100644 index 00000000..1d51de8a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png new file mode 100644 index 00000000..b4c4cf32 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png index 3d4de1a1..51971a4c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png index eec16dfe..ed2b6472 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png index 07df994d..a244b4c7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png index b550c4db..28ec0820 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png index ec8b9461..1c4024c9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png and b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png index a98bc902..8f239b70 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png and b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png index 34db5889..2aed9bca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png index 6e6ccb14..59bc7f79 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png index 5e27f929..c3c624c5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png index b8f2debe..a6d93c16 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png index e97c2d77..a4b35d2f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png index 44c9f33d..40bdc614 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png index 8dc86dc9..b7cbe8a5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png index b94ec295..60792f55 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png index 35acb538..849732b6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index 62d6cbad..bfb72505 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png new file mode 100644 index 00000000..f243c1b3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png index 76a658a4..ed85bea7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png new file mode 100644 index 00000000..1e613a90 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png index ab3cc637..1370b369 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png new file mode 100644 index 00000000..e7e499f5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png index bed5ac19..1735bdd3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png new file mode 100644 index 00000000..1320a86a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png index 4453d8f9..d945f546 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png new file mode 100644 index 00000000..43650b68 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png index aa293b4b..32ed4e93 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png new file mode 100644 index 00000000..e8dc3118 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png index e82b693a..437974a9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png new file mode 100644 index 00000000..4c12cc22 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png index 4deb90b6..85e2fe33 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png new file mode 100644 index 00000000..8925d70b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png index 0b859997..48c287d3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png new file mode 100644 index 00000000..46ed7538 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png b/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png index 7b757acc..e9880db0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png and b/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn.png b/src/main/resources/assets/betterend/textures/block/fracturn.png new file mode 100644 index 00000000..8159716a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/fracturn.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_e.png b/src/main/resources/assets/betterend/textures/block/fracturn_e.png new file mode 100644 index 00000000..3e739d5b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/fracturn_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/globulagus.png b/src/main/resources/assets/betterend/textures/block/globulagus.png new file mode 100644 index 00000000..b2782275 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/globulagus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png index 37a98b9e..3f70581f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png new file mode 100644 index 00000000..b1495472 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_1_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_1_e.png new file mode 100644 index 00000000..fc277f7a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_2_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_2_e.png new file mode 100644 index 00000000..7360921b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png new file mode 100644 index 00000000..a3943870 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png new file mode 100644 index 00000000..bf3c870e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png new file mode 100644 index 00000000..05e83ea4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png new file mode 100644 index 00000000..e747def3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png new file mode 100644 index 00000000..27182e7a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall_e.png new file mode 100644 index 00000000..203f90e0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png index 32df32a1..93245192 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png new file mode 100644 index 00000000..b15af0e5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png new file mode 100644 index 00000000..96544df9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png new file mode 100644 index 00000000..d9492fc0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png new file mode 100644 index 00000000..f625b709 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png new file mode 100644 index 00000000..892bfa06 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_1_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_1_e.png new file mode 100644 index 00000000..ff97f748 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png new file mode 100644 index 00000000..e9258f7c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png new file mode 100644 index 00000000..fd52c709 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png new file mode 100644 index 00000000..4ca5bde7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_metal.png rename to src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png new file mode 100644 index 00000000..41913eb2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png new file mode 100644 index 00000000..692adedf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png new file mode 100644 index 00000000..e747def3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png new file mode 100644 index 00000000..b6a04527 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall_e.png new file mode 100644 index 00000000..2d2bef75 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_moss.png b/src/main/resources/assets/betterend/textures/block/ivis_moss.png index 6c243bd1..0e5a2142 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_moss.png and b/src/main/resources/assets/betterend/textures/block/ivis_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine.png b/src/main/resources/assets/betterend/textures/block/ivis_vine.png index 08aae3d9..541854b1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_vine.png and b/src/main/resources/assets/betterend/textures/block/ivis_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png index 3592a306..6d6d883a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png b/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png index 0859bb4f..133a1387 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png and b/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png new file mode 100644 index 00000000..8e0f5752 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png new file mode 100644 index 00000000..5d75f930 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png new file mode 100644 index 00000000..e6a78b79 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png new file mode 100644 index 00000000..33d8361c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png new file mode 100644 index 00000000..8a368a4b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png new file mode 100644 index 00000000..a8e7203f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png new file mode 100644 index 00000000..5a2850bb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png new file mode 100644 index 00000000..6cbf057b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png new file mode 100644 index 00000000..521619ea Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png new file mode 100644 index 00000000..3ee7f1fb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png new file mode 100644 index 00000000..4a41b359 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png new file mode 100644 index 00000000..0c419f55 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png new file mode 100644 index 00000000..3dc62afd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png new file mode 100644 index 00000000..43aee59e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png new file mode 100644 index 00000000..e0548c49 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png new file mode 100644 index 00000000..dbdb1f5e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png new file mode 100644 index 00000000..281e5b9b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png new file mode 100644 index 00000000..e583dfe8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png new file mode 100644 index 00000000..279a6f01 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png new file mode 100644 index 00000000..13c21ebb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png new file mode 100644 index 00000000..5f466430 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png new file mode 100644 index 00000000..6f3e85db Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png new file mode 100644 index 00000000..5b2b228f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png new file mode 100644 index 00000000..71c8f8c6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png new file mode 100644 index 00000000..0961e9b1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png new file mode 100644 index 00000000..39b651bc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png new file mode 100644 index 00000000..c188da6f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png new file mode 100644 index 00000000..5bc0ccf2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png new file mode 100644 index 00000000..dc7e77e1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png new file mode 100644 index 00000000..43e53ca6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png new file mode 100644 index 00000000..a106d397 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png new file mode 100644 index 00000000..216632c2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png new file mode 100644 index 00000000..a327269d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png new file mode 100644 index 00000000..fe41f344 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png new file mode 100644 index 00000000..3b4dd02d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png new file mode 100644 index 00000000..37d96747 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png new file mode 100644 index 00000000..a82c8429 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass.png b/src/main/resources/assets/betterend/textures/block/jungle_grass.png new file mode 100644 index 00000000..93e9235e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_grass.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png b/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png new file mode 100644 index 00000000..7a22e3f4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png new file mode 100644 index 00000000..a56eb030 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png new file mode 100644 index 00000000..0dbd254a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png new file mode 100644 index 00000000..37505929 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine.png b/src/main/resources/assets/betterend/textures/block/jungle_vine.png new file mode 100644 index 00000000..7bdcee97 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png new file mode 100644 index 00000000..23ed5823 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lamellarium.png b/src/main/resources/assets/betterend/textures/block/lamellarium.png new file mode 100644 index 00000000..e4d035b0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lamellarium.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png new file mode 100644 index 00000000..99902f43 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png new file mode 100644 index 00000000..602d4c78 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png new file mode 100644 index 00000000..8d3d3f74 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png new file mode 100644 index 00000000..906c92ed Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png new file mode 100644 index 00000000..d007b97f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png new file mode 100644 index 00000000..f2a902f8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png new file mode 100644 index 00000000..bc512b06 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png b/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png new file mode 100644 index 00000000..c63e9680 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png new file mode 100644 index 00000000..3069334e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png new file mode 100644 index 00000000..df4985fd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png new file mode 100644 index 00000000..a4d670ac Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png new file mode 100644 index 00000000..df64f9ef Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png new file mode 100644 index 00000000..66534540 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png new file mode 100644 index 00000000..96b85558 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png new file mode 100644 index 00000000..bdd32bf6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png new file mode 100644 index 00000000..1709535e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png new file mode 100644 index 00000000..0a528f06 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png new file mode 100644 index 00000000..6ca50c75 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png b/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png new file mode 100644 index 00000000..839ba808 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png new file mode 100644 index 00000000..7dc39a1c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png new file mode 100644 index 00000000..b1f5cf69 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png new file mode 100644 index 00000000..09467dde Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png new file mode 100644 index 00000000..c2aa8894 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png new file mode 100644 index 00000000..f4866cd5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png new file mode 100644 index 00000000..8a0b513e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png new file mode 100644 index 00000000..e263dddb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png new file mode 100644 index 00000000..3603713e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png new file mode 100644 index 00000000..7a2b1aad Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png new file mode 100644 index 00000000..be12c9aa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png new file mode 100644 index 00000000..48296cb3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png new file mode 100644 index 00000000..8f068b78 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png new file mode 100644 index 00000000..7d734474 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png b/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png new file mode 100644 index 00000000..6b8ec8ee Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png new file mode 100644 index 00000000..cb55b61a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png new file mode 100644 index 00000000..f16b22c2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png new file mode 100644 index 00000000..a484e86f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_0.png b/src/main/resources/assets/betterend/textures/block/lumecorn_0.png new file mode 100644 index 00000000..524e49b9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png new file mode 100644 index 00000000..081fe739 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_1.png new file mode 100644 index 00000000..72bd2b58 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png new file mode 100644 index 00000000..8f92d674 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_2.png new file mode 100644 index 00000000..a0e8a291 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png new file mode 100644 index 00000000..e8f41537 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png new file mode 100644 index 00000000..c9c7b969 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png new file mode 100644 index 00000000..8c8f1ebf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png b/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png new file mode 100644 index 00000000..d50e5264 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png new file mode 100644 index 00000000..725ed557 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png new file mode 100644 index 00000000..1c93b511 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png new file mode 100644 index 00000000..f192caf1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png new file mode 100644 index 00000000..af9e5ea1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png new file mode 100644 index 00000000..af9e5ea1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png new file mode 100644 index 00000000..f592a2fa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png new file mode 100644 index 00000000..f592a2fa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png new file mode 100644 index 00000000..fbe0ee35 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png new file mode 100644 index 00000000..fbe0ee35 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png new file mode 100644 index 00000000..33769136 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png new file mode 100644 index 00000000..33769136 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png b/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png new file mode 100644 index 00000000..73990ff8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png b/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png new file mode 100644 index 00000000..17081516 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lutebus.png b/src/main/resources/assets/betterend/textures/block/lutebus.png new file mode 100644 index 00000000..1f5a2686 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lutebus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/magnula.png b/src/main/resources/assets/betterend/textures/block/magnula.png new file mode 100644 index 00000000..7fe91460 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/magnula.png differ diff --git a/src/main/resources/assets/betterend/textures/block/magnula_bottom.png b/src/main/resources/assets/betterend/textures/block/magnula_bottom.png new file mode 100644 index 00000000..eda6b963 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/magnula_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/missing_tile.png b/src/main/resources/assets/betterend/textures/block/missing_tile.png new file mode 100644 index 00000000..5b31bfae Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/missing_tile.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png new file mode 100644 index 00000000..d26fcb91 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png new file mode 100644 index 00000000..f75dc0fe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png new file mode 100644 index 00000000..9173717b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png index 8df3c438..7e09714b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png index 3e384e4f..37b40dd5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png index 0fdaa8bc..381f7183 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png index 376789fd..6051bf88 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png index d641e703..d85b55ca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png index bf700a50..7c9fe59e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png index da1f616d..bdbe83a4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png new file mode 100644 index 00000000..2da2775c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png index f3fc5d84..8af2a9a1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png index 5809e4e4..683ed129 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png new file mode 100644 index 00000000..0b4b3c7d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/moth_hive_front.png b/src/main/resources/assets/betterend/textures/block/moth_hive_front.png new file mode 100644 index 00000000..78faf2cb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/moth_hive_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/moth_hive_front_silk.png b/src/main/resources/assets/betterend/textures/block/moth_hive_front_silk.png new file mode 100644 index 00000000..c3e015c4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/moth_hive_front_silk.png differ diff --git a/src/main/resources/assets/betterend/textures/block/moth_hive_side.png b/src/main/resources/assets/betterend/textures/block/moth_hive_side.png new file mode 100644 index 00000000..0c7a9df1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/moth_hive_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png new file mode 100644 index 00000000..1323e564 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png new file mode 100644 index 00000000..0aba31b5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png new file mode 100644 index 00000000..264be428 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png new file mode 100644 index 00000000..e22c2e9a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png new file mode 100644 index 00000000..e6ac60a1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png new file mode 100644 index 00000000..2c681c7d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png new file mode 100644 index 00000000..f3c4c0a8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png new file mode 100644 index 00000000..7fd0f467 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png new file mode 100644 index 00000000..a36b2e48 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png new file mode 100644 index 00000000..e00a6131 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png new file mode 100644 index 00000000..2887aae9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png new file mode 100644 index 00000000..1a10d5eb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png new file mode 100644 index 00000000..74f13b76 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png new file mode 100644 index 00000000..cfdd7a22 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png new file mode 100644 index 00000000..e664cfe6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png new file mode 100644 index 00000000..9a47ee11 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png new file mode 100644 index 00000000..5b2b0586 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png new file mode 100644 index 00000000..a296b22f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png new file mode 100644 index 00000000..23414dfe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/nightshade_moss.png b/src/main/resources/assets/betterend/textures/block/nightshade_moss.png new file mode 100644 index 00000000..40100bcf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/nightshade_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/orango.png b/src/main/resources/assets/betterend/textures/block/orango.png new file mode 100644 index 00000000..b4f74bc1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/orango.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pond_anemone.png b/src/main/resources/assets/betterend/textures/block/pond_anemone.png new file mode 100644 index 00000000..48fef70e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pond_anemone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png b/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png new file mode 100644 index 00000000..0b21d42b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rubinea.png b/src/main/resources/assets/betterend/textures/block/rubinea.png new file mode 100644 index 00000000..b590bfe8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rubinea.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png new file mode 100644 index 00000000..5601c268 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ruscus.png b/src/main/resources/assets/betterend/textures/block/ruscus.png new file mode 100644 index 00000000..68589632 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/ruscus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png b/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png new file mode 100644 index 00000000..e01bc130 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side.png new file mode 100644 index 00000000..d052be19 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png new file mode 100644 index 00000000..b92237a7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png new file mode 100644 index 00000000..b3f35918 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png new file mode 100644 index 00000000..17aba4aa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png new file mode 100644 index 00000000..cb14baa0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/salteago.png b/src/main/resources/assets/betterend/textures/block/salteago.png new file mode 100644 index 00000000..dd0df547 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/salteago.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png new file mode 100644 index 00000000..f00ff0c2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png new file mode 100644 index 00000000..667f447f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png new file mode 100644 index 00000000..b248b45d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png new file mode 100644 index 00000000..7e6d7e3c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png new file mode 100644 index 00000000..1efbd34b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png new file mode 100644 index 00000000..cf5b31c5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png new file mode 100644 index 00000000..0807c5bc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png new file mode 100644 index 00000000..ada8266e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png new file mode 100644 index 00000000..f6044f04 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png new file mode 100644 index 00000000..94298f09 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png new file mode 100644 index 00000000..d961081b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png new file mode 100644 index 00000000..4ab1013d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png new file mode 100644 index 00000000..cbfcfa8a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png b/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png new file mode 100644 index 00000000..ad80292c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_side.png b/src/main/resources/assets/betterend/textures/block/sangnum_side.png new file mode 100644 index 00000000..62bb58df Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sangnum_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_top.png b/src/main/resources/assets/betterend/textures/block/sangnum_top.png new file mode 100644 index 00000000..e321cbb1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sangnum_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png new file mode 100644 index 00000000..f7ab7e63 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png b/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png new file mode 100644 index 00000000..c73056f1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png new file mode 100644 index 00000000..e2981961 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png new file mode 100644 index 00000000..b6b4336b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png new file mode 100644 index 00000000..6edbb4a2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png new file mode 100644 index 00000000..04973162 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png new file mode 100644 index 00000000..9b0a4fab Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png new file mode 100644 index 00000000..aa1a21fe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png new file mode 100644 index 00000000..e2981961 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png new file mode 100644 index 00000000..ad66fdd4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png new file mode 100644 index 00000000..ada5b494 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png new file mode 100644 index 00000000..dffaa6b8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png new file mode 100644 index 00000000..989c5650 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png new file mode 100644 index 00000000..c5b2f091 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png new file mode 100644 index 00000000..5314ff63 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png new file mode 100644 index 00000000..ab1960cb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png new file mode 100644 index 00000000..aeb9567d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png new file mode 100644 index 00000000..837326c8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png new file mode 100644 index 00000000..c017633d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png new file mode 100644 index 00000000..7aa548fa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png new file mode 100644 index 00000000..b590f604 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png new file mode 100644 index 00000000..cf463857 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars.png b/src/main/resources/assets/betterend/textures/block/terminite_bars.png new file mode 100644 index 00000000..e9be368c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_bars.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png b/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png new file mode 100644 index 00000000..351d8fe5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_block.png b/src/main/resources/assets/betterend/textures/block/terminite_block.png index ff56e729..26c25d6c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_block.png and b/src/main/resources/assets/betterend/textures/block/terminite_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png new file mode 100644 index 00000000..e8177af7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chain.png b/src/main/resources/assets/betterend/textures/block/terminite_chain.png new file mode 100644 index 00000000..2557891b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chain.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png new file mode 100644 index 00000000..0578cba3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png new file mode 100644 index 00000000..a44c68b6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png new file mode 100644 index 00000000..04981e38 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png new file mode 100644 index 00000000..689e5c9e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png new file mode 100644 index 00000000..eab36ddc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png new file mode 100644 index 00000000..3491b811 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_side.png b/src/main/resources/assets/betterend/textures/block/terminite_door_side.png new file mode 100644 index 00000000..e7eeefcc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_top.png b/src/main/resources/assets/betterend/textures/block/terminite_door_top.png new file mode 100644 index 00000000..66e886cc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_tile.png b/src/main/resources/assets/betterend/textures/block/terminite_tile.png new file mode 100644 index 00000000..3b31396d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_tile.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png b/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png new file mode 100644 index 00000000..e904fb28 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png new file mode 100644 index 00000000..c9146eff Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png new file mode 100644 index 00000000..14d41562 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png new file mode 100644 index 00000000..83a1ac99 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png new file mode 100644 index 00000000..78d46224 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png new file mode 100644 index 00000000..7bb2fb9c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png new file mode 100644 index 00000000..a7189969 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png new file mode 100644 index 00000000..6d41d028 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars.png new file mode 100644 index 00000000..465a4a6c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_bars.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png new file mode 100644 index 00000000..6195a42f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_block.png b/src/main/resources/assets/betterend/textures/block/thallasium_block.png new file mode 100644 index 00000000..50d0d93c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png new file mode 100644 index 00000000..ca39eac9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chain.png b/src/main/resources/assets/betterend/textures/block/thallasium_chain.png new file mode 100644 index 00000000..02a0fd43 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chain.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png new file mode 100644 index 00000000..942ba9ce Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png new file mode 100644 index 00000000..50972281 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png new file mode 100644 index 00000000..90b9a25b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png new file mode 100644 index 00000000..e747def3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png new file mode 100644 index 00000000..59cb4f63 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png new file mode 100644 index 00000000..2d2bef75 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png new file mode 100644 index 00000000..23832cdd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png new file mode 100644 index 00000000..597023e8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png new file mode 100644 index 00000000..d0787596 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_ore.png b/src/main/resources/assets/betterend/textures/block/thallasium_ore.png new file mode 100644 index 00000000..13bf31a4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_ore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_tile.png b/src/main/resources/assets/betterend/textures/block/thallasium_tile.png new file mode 100644 index 00000000..9bd7aea2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_tile.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png new file mode 100644 index 00000000..30b1170e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png new file mode 100644 index 00000000..53d299c7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png new file mode 100644 index 00000000..b9464747 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png new file mode 100644 index 00000000..3ef19a06 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png new file mode 100644 index 00000000..2fc30812 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png new file mode 100644 index 00000000..703a1e39 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png new file mode 100644 index 00000000..7266a4c2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte_e.png b/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte_e.png new file mode 100644 index 00000000..1792218e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png index 3014c9e1..9cf78b97 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png index 2179e95e..e2c387dc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top.png index 3e59de79..9af24073 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png index 995b4113..b29ae148 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png index 959f84b1..0c0167a2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png new file mode 100644 index 00000000..8686d887 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png new file mode 100644 index 00000000..04d2ef5a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png index 6104403f..859d7e13 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png index 122ad18e..ce3be5bc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png index 4b0c5a7c..7ca47be8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_bottom.png index d42e79ca..dede541e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png index 9c0ce615..56f6e074 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png index 49f00248..8b6dc906 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png index 4bdf384e..2b5e02af 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png index 7d82ea55..3ca75a7b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png index f648b9a6..4962a1e6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png index feb81849..a8e2472f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_ladder.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_ladder.png index 87bd1c54..8513067f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_ladder.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_ladder.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png index d58aaffe..74ab18a6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png index 7b381839..1aed4f68 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png index fa673aaa..6aed0419 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png new file mode 100644 index 00000000..668b3236 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png new file mode 100644 index 00000000..91caf5c7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png new file mode 100644 index 00000000..293c6b16 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png new file mode 100644 index 00000000..da56a9b9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png new file mode 100644 index 00000000..3ff72f88 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png new file mode 100644 index 00000000..001dadc9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png new file mode 100644 index 00000000..f431af32 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png new file mode 100644 index 00000000..5e3d4f8a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png index c5e1b551..fa89c7e5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png new file mode 100644 index 00000000..5a269b70 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png index a4564bf6..c0109808 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png index 124910a5..5a9c4c75 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png index e2acdbdb..20c4233c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png b/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png new file mode 100644 index 00000000..81631cec Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png new file mode 100644 index 00000000..a00b7eb5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png new file mode 100644 index 00000000..cad70bb1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png new file mode 100644 index 00000000..311fda8c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png new file mode 100644 index 00000000..dffd5b35 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_tiles.png b/src/main/resources/assets/betterend/textures/block/violecite_tiles.png index 70aa5f30..ef69ee4c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_tiles.png and b/src/main/resources/assets/betterend/textures/block/violecite_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png new file mode 100644 index 00000000..9e756998 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png new file mode 100644 index 00000000..ebb6a9ab Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png new file mode 100644 index 00000000..d71ecb81 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png new file mode 100644 index 00000000..899e1c14 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png new file mode 100644 index 00000000..ecf9569c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png new file mode 100644 index 00000000..c81182e2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png new file mode 100644 index 00000000..3e78f2dc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png new file mode 100644 index 00000000..9e3e91e5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png new file mode 100644 index 00000000..2ceefd0d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png new file mode 100644 index 00000000..502ffa0e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png new file mode 100644 index 00000000..7879b95f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png new file mode 100644 index 00000000..38460f73 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png new file mode 100644 index 00000000..4d7db656 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png new file mode 100644 index 00000000..97fb2ebf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png new file mode 100644 index 00000000..983c273a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_right.png new file mode 100644 index 00000000..65456411 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png new file mode 100644 index 00000000..5c736a98 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png new file mode 100644 index 00000000..2538d299 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png new file mode 100644 index 00000000..ae64b382 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest.png index c8d1edd2..87a40715 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest.png and b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_left.png index 3f2e4ebf..113c80c2 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_left.png and b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_left.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_right.png index c6f31d1c..72e63770 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_right.png and b/src/main/resources/assets/betterend/textures/entity/chest/umbrella_tree_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png index 5b757d69..5f5dbb93 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png index 255bb972..1ff0bcf7 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png index ef7c10fb..4cf67740 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png index e9ebcdbf..d302c5a7 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/elytra_armored.png b/src/main/resources/assets/betterend/textures/entity/elytra_armored.png new file mode 100644 index 00000000..c5540b5d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/elytra_armored.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png index e4a78d4d..9f77504f 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png index 4fdeaf39..c7ac74e0 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png index 470fcd5c..4d73ab13 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png index 5556a47f..f3c96e46 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png index 75cc0d2e..f2f2e224 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png index 185806b6..1689a3a5 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png index 12f99dbd..dc1137da 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png index 461cc9c8..1bc4dfee 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png index 1b436dec..2db3f17e 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png index cbced0ee..25fc9931 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png index 94b41e53..6120cb0a 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png index 381f6613..03d527ab 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png index 475ef5a2..606fbca6 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png index 2a0c9ca5..43118e03 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png index b836a558..6648a828 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png index a0d27eb3..1577d4a0 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime.png b/src/main/resources/assets/betterend/textures/entity/end_slime.png deleted file mode 100644 index d40f1a10..00000000 Binary files a/src/main/resources/assets/betterend/textures/entity/end_slime.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png new file mode 100644 index 00000000..f896529e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png new file mode 100644 index 00000000..2f44e329 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber_glow.png new file mode 100644 index 00000000..ab8288de Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime_glow.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png new file mode 100644 index 00000000..b76f4058 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png new file mode 100644 index 00000000..711d1497 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime_mossy.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_mossy.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime_mossy.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_mossy.png diff --git a/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png b/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png index 878c3156..9b63ccf3 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png and b/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png new file mode 100644 index 00000000..f16e9528 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png new file mode 100644 index 00000000..0836dd40 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png index 11e458ae..23e39bb4 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png new file mode 100644 index 00000000..c66fb192 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/silk_moth.png differ diff --git a/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png b/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png new file mode 100644 index 00000000..020f8daa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png differ diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png index c038989e..64af920a 100644 Binary files a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png and b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png differ diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png index 47006fac..6d460027 100644 Binary files a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png and b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png differ diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png index 76d83324..ef52fda7 100644 Binary files a/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png and b/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png index b8ee16a1..88e04018 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png index f5abb072..2361f777 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png index 1816fe7d..1bfb82df 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png index 5306fdc9..42a5459e 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png index f50a318c..b3f5898f 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png index b154a1bd..b06d537f 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_axe.png b/src/main/resources/assets/betterend/textures/item/aeternium_axe.png index d7101869..e13f53f3 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_axe.png and b/src/main/resources/assets/betterend/textures/item/aeternium_axe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_axe_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_axe_head.png new file mode 100644 index 00000000..3624587c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_axe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png index ef7ff4f1..8b98f4fb 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png and b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer_head.png new file mode 100644 index 00000000..84c5379a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_hammer_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png b/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png index a3a81145..97ae0617 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png and b/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hoe_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_hoe_head.png new file mode 100644 index 00000000..8280a110 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_hoe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png index cb15952b..8f059795 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png and b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png new file mode 100644 index 00000000..abe90b60 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_shovel.png b/src/main/resources/assets/betterend/textures/item/aeternium_shovel.png index 70bb79a9..0d17ecaf 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_shovel.png and b/src/main/resources/assets/betterend/textures/item/aeternium_shovel.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png new file mode 100644 index 00000000..49176892 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword.png index af121d60..f697c0d0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_sword.png and b/src/main/resources/assets/betterend/textures/item/aeternium_sword.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword_blade.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword_blade.png new file mode 100644 index 00000000..7d008cfc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_sword_blade.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png new file mode 100644 index 00000000..294314f1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_raw.png b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png new file mode 100644 index 00000000..adae9d37 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_seed.png b/src/main/resources/assets/betterend/textures/item/amber_root_seed.png new file mode 100644 index 00000000..bf1a7b90 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/amber_root_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aurant_polypore.png b/src/main/resources/assets/betterend/textures/item/aurant_polypore.png new file mode 100644 index 00000000..bfdde532 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/aurant_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry.png b/src/main/resources/assets/betterend/textures/item/blossom_berry.png new file mode 100644 index 00000000..d0a89188 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/blossom_berry.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png b/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png new file mode 100644 index 00000000..6a34f91a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png new file mode 100644 index 00000000..350ed56b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png new file mode 100644 index 00000000..4541a243 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png new file mode 100644 index 00000000..6b1e88c4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png new file mode 100644 index 00000000..d24ce153 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png differ diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png new file mode 100644 index 00000000..f49ede5b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png new file mode 100644 index 00000000..ebed2b9b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png new file mode 100644 index 00000000..a40c514a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png new file mode 100644 index 00000000..996f396e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/diamond_hammer.png b/src/main/resources/assets/betterend/textures/item/diamond_hammer.png index d89f5c0c..ea668c2b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/diamond_hammer.png and b/src/main/resources/assets/betterend/textures/item/diamond_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/elytra_armored.png b/src/main/resources/assets/betterend/textures/item/elytra_armored.png new file mode 100644 index 00000000..3d13a928 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/elytra_armored.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png new file mode 100644 index 00000000..9372b7cf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png new file mode 100644 index 00000000..478e770d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png differ diff --git a/src/main/resources/assets/betterend/textures/item/filalux_wings.png b/src/main/resources/assets/betterend/textures/item/filalux_wings.png new file mode 100644 index 00000000..e76070b4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/filalux_wings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/gold_chandelier.png b/src/main/resources/assets/betterend/textures/item/gold_chandelier.png new file mode 100644 index 00000000..9203e12e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/gold_chandelier.png differ diff --git a/src/main/resources/assets/betterend/textures/item/iron_chandelier.png b/src/main/resources/assets/betterend/textures/item/iron_chandelier.png new file mode 100644 index 00000000..0408a76b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/iron_chandelier.png differ diff --git a/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png b/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png new file mode 100644 index 00000000..d4d1f414 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png new file mode 100644 index 00000000..8b05048c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/item/jungle_fern.png b/src/main/resources/assets/betterend/textures/item/jungle_fern.png new file mode 100644 index 00000000..862e19e1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/jungle_fern.png differ diff --git a/src/main/resources/assets/betterend/textures/item/leather_stripe.png b/src/main/resources/assets/betterend/textures/item/leather_stripe.png new file mode 100644 index 00000000..ac46074d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/leather_stripe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png b/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png new file mode 100644 index 00000000..472767a2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_door.png b/src/main/resources/assets/betterend/textures/item/lucernia_door.png new file mode 100644 index 00000000..5b172d76 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/lucernia_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_sign.png b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png new file mode 100644 index 00000000..5cb550d8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png b/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png new file mode 100644 index 00000000..5b1d1226 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lumecorn_seed.png b/src/main/resources/assets/betterend/textures/item/lumecorn_seed.png new file mode 100644 index 00000000..5e892127 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/lumecorn_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png b/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png new file mode 100644 index 00000000..a6c84ad4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png differ diff --git a/src/main/resources/assets/betterend/textures/item/pond_anemone.png b/src/main/resources/assets/betterend/textures/item/pond_anemone.png new file mode 100644 index 00000000..32414526 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/pond_anemone.png differ diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png b/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png index 89c2a68b..20afce5b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png and b/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png differ diff --git a/src/main/resources/assets/betterend/textures/item/silk_fiber.png b/src/main/resources/assets/betterend/textures/item/silk_fiber.png new file mode 100644 index 00000000..e8e0dfee Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/silk_fiber.png differ diff --git a/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png b/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png new file mode 100644 index 00000000..c87a1436 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png differ diff --git a/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png new file mode 100644 index 00000000..d4e8c69d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png new file mode 100644 index 00000000..4a149bf9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_axe.png b/src/main/resources/assets/betterend/textures/item/terminite_axe.png index 3c565da5..2140d04f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_axe.png and b/src/main/resources/assets/betterend/textures/item/terminite_axe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png new file mode 100644 index 00000000..5f65902a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_boots.png b/src/main/resources/assets/betterend/textures/item/terminite_boots.png index b81d1cfc..bfc2254a 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_boots.png and b/src/main/resources/assets/betterend/textures/item/terminite_boots.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chain.png b/src/main/resources/assets/betterend/textures/item/terminite_chain.png new file mode 100644 index 00000000..3489d080 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_chain.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png b/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png new file mode 100644 index 00000000..78c6d14a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png b/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png index 3d896a05..90f9efd8 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png and b/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_door.png b/src/main/resources/assets/betterend/textures/item/terminite_door.png new file mode 100644 index 00000000..c5a64524 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hammer.png b/src/main/resources/assets/betterend/textures/item/terminite_hammer.png index 06738ec9..2bd48312 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_hammer.png and b/src/main/resources/assets/betterend/textures/item/terminite_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_helmet.png b/src/main/resources/assets/betterend/textures/item/terminite_helmet.png index 575354dd..3bc9fa08 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_helmet.png and b/src/main/resources/assets/betterend/textures/item/terminite_helmet.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png index 7b153324..778f244e 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png and b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png new file mode 100644 index 00000000..9a4863c2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_ingot.png b/src/main/resources/assets/betterend/textures/item/terminite_ingot.png index 388e17dd..4c0bcfdc 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_ingot.png and b/src/main/resources/assets/betterend/textures/item/terminite_ingot.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png index 59971974..18503e47 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png and b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_nugget.png b/src/main/resources/assets/betterend/textures/item/terminite_nugget.png new file mode 100644 index 00000000..7d7fdeb3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_nugget.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png index 75500c23..42a0bbed 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png and b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe_head.png new file mode 100644 index 00000000..88ab3a36 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_shovel.png b/src/main/resources/assets/betterend/textures/item/terminite_shovel.png index 10ff0540..37785342 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_shovel.png and b/src/main/resources/assets/betterend/textures/item/terminite_shovel.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_shovel_head.png b/src/main/resources/assets/betterend/textures/item/terminite_shovel_head.png new file mode 100644 index 00000000..603bceef Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_shovel_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword.png b/src/main/resources/assets/betterend/textures/item/terminite_sword.png index 2bd0192c..ac4a40df 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_sword.png and b/src/main/resources/assets/betterend/textures/item/terminite_sword.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword_blade.png b/src/main/resources/assets/betterend/textures/item/terminite_sword_blade.png new file mode 100644 index 00000000..719e8002 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_sword_blade.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png new file mode 100644 index 00000000..c4e35d66 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_axe.png b/src/main/resources/assets/betterend/textures/item/thallasium_axe.png new file mode 100644 index 00000000..9ede4dce Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_axe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png new file mode 100644 index 00000000..c82b065d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_boots.png b/src/main/resources/assets/betterend/textures/item/thallasium_boots.png new file mode 100644 index 00000000..40abaac4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_boots.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chain.png b/src/main/resources/assets/betterend/textures/item/thallasium_chain.png new file mode 100644 index 00000000..1382b5f1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_chain.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png new file mode 100644 index 00000000..9f89bee0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png new file mode 100644 index 00000000..562bf4bd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_door.png b/src/main/resources/assets/betterend/textures/item/thallasium_door.png new file mode 100644 index 00000000..a0f3d6ae Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hammer.png b/src/main/resources/assets/betterend/textures/item/thallasium_hammer.png new file mode 100644 index 00000000..aa8a26dd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png b/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png new file mode 100644 index 00000000..bef4d557 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png new file mode 100644 index 00000000..d32687f0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png new file mode 100644 index 00000000..0c235fb5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png new file mode 100644 index 00000000..95c0dcea Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png b/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png new file mode 100644 index 00000000..f816d603 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png b/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png new file mode 100644 index 00000000..a4359228 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png new file mode 100644 index 00000000..c02927e7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png new file mode 100644 index 00000000..dcee9d06 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png new file mode 100644 index 00000000..cc09eb41 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png new file mode 100644 index 00000000..fe00931e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png new file mode 100644 index 00000000..9a13f796 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword_blade.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword_blade.png new file mode 100644 index 00000000..9a58aea7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_sword_blade.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword_handle.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword_handle.png new file mode 100644 index 00000000..9d3e085e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_sword_handle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thermal fungus.png b/src/main/resources/assets/betterend/textures/item/thermal fungus.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/thermal fungus.png rename to src/main/resources/assets/betterend/textures/item/thermal fungus.png diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png new file mode 100644 index 00000000..7bcb1773 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png differ diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png new file mode 100644 index 00000000..67383d2d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png new file mode 100644 index 00000000..0a0287e8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png b/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png index b502d970..3d877603 100644 Binary files a/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png and b/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png b/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png index 08aaedef..e6500e03 100644 Binary files a/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png and b/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png new file mode 100644 index 00000000..ac048eec Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png new file mode 100644 index 00000000..f3a11e2c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png new file mode 100644 index 00000000..bb9e8cb1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png new file mode 100644 index 00000000..4fdb6367 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png b/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png new file mode 100644 index 00000000..ab8fdf5f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png new file mode 100644 index 00000000..fb1a6fb9 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png differ diff --git a/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png b/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png index c3c79c99..39e14cdf 100644 Binary files a/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png and b/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png differ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png deleted file mode 100644 index 5718461c..00000000 Binary files a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png deleted file mode 100644 index 58523c40..00000000 Binary files a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png deleted file mode 100644 index 10059fd6..00000000 Binary files a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png deleted file mode 100644 index ccba0618..00000000 Binary files a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/particle/amber_sphere_7.png b/src/main/resources/assets/betterend/textures/particle/amber_sphere_7.png index 684f8de6..0cf0671d 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/amber_sphere_7.png and b/src/main/resources/assets/betterend/textures/particle/amber_sphere_7.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/firefly.png b/src/main/resources/assets/betterend/textures/particle/firefly.png new file mode 100644 index 00000000..2e305b9a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/firefly.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png new file mode 100644 index 00000000..5360abcc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png new file mode 100644 index 00000000..fd77dd5a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png new file mode 100644 index 00000000..74751846 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png new file mode 100644 index 00000000..1bba4714 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png new file mode 100644 index 00000000..24c8cac1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png new file mode 100644 index 00000000..bbcc0ea7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png new file mode 100644 index 00000000..dcd27226 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png new file mode 100644 index 00000000..4e2c8f6a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png new file mode 100644 index 00000000..4da3d9f4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png new file mode 100644 index 00000000..5dbe73a5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png new file mode 100644 index 00000000..a0906550 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png new file mode 100644 index 00000000..86e14dd1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/stars.png b/src/main/resources/assets/betterend/textures/sky/stars.png new file mode 100644 index 00000000..642cc0e3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/sky/stars.png differ diff --git a/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png b/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png new file mode 100644 index 00000000..b029caee Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_bricks.png b/src/main/resources/assets/blockus/textures/block/purpur_bricks.png new file mode 100644 index 00000000..60334c11 Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/purpur_bricks.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_lines.png b/src/main/resources/assets/blockus/textures/block/purpur_lines.png new file mode 100644 index 00000000..73b75927 Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/purpur_lines.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png b/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png new file mode 100644 index 00000000..f734885f Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_squares.png b/src/main/resources/assets/blockus/textures/block/purpur_squares.png new file mode 100644 index 00000000..0a34716d Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/purpur_squares.png differ diff --git a/src/main/resources/assets/blockus/textures/block/smooth_purpur.png b/src/main/resources/assets/blockus/textures/block/smooth_purpur.png new file mode 100644 index 00000000..53601e57 Binary files /dev/null and b/src/main/resources/assets/blockus/textures/block/smooth_purpur.png differ diff --git a/src/main/resources/assets/minecraft/blockstates/chorus_flower.json b/src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json similarity index 100% rename from src/main/resources/assets/minecraft/blockstates/chorus_flower.json rename to src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json diff --git a/src/main/resources/assets/minecraft/blockstates/chorus_plant.json b/src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json similarity index 100% rename from src/main/resources/assets/minecraft/blockstates/chorus_plant.json rename to src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json diff --git a/src/main/resources/assets/minecraft/models/item/chorus_flower.json b/src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json similarity index 100% rename from src/main/resources/assets/minecraft/models/item/chorus_flower.json rename to src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json diff --git a/src/main/resources/assets/minecraft/models/item/chorus_plant.json b/src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json similarity index 100% rename from src/main/resources/assets/minecraft/models/item/chorus_plant.json rename to src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png new file mode 100644 index 00000000..1b08edf3 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png new file mode 100644 index 00000000..87d5d00d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png new file mode 100644 index 00000000..135782d0 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png new file mode 100644 index 00000000..f757688d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png new file mode 100644 index 00000000..8903c2dd Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png new file mode 100644 index 00000000..6439f421 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png new file mode 100644 index 00000000..6ebfa407 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png new file mode 100644 index 00000000..dc7d4bc3 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png new file mode 100644 index 00000000..f3abcfc0 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png new file mode 100644 index 00000000..972d93e4 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png new file mode 100644 index 00000000..7087d639 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png new file mode 100644 index 00000000..5ecf596c Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png new file mode 100644 index 00000000..a596289d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png new file mode 100644 index 00000000..ef8eb740 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png new file mode 100644 index 00000000..59ebd87b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png new file mode 100644 index 00000000..2c6a6ab9 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png new file mode 100644 index 00000000..f4b2e314 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties new file mode 100644 index 00000000..77f44365 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:endstone_dust byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:cave_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png new file mode 100644 index 00000000..66489430 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png new file mode 100644 index 00000000..afad59e1 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png new file mode 100644 index 00000000..17f87ab2 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png new file mode 100644 index 00000000..ff076b69 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png new file mode 100644 index 00000000..66afd0b7 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png new file mode 100644 index 00000000..4bc3438d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png new file mode 100644 index 00000000..d07298d1 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png new file mode 100644 index 00000000..bb838314 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png new file mode 100644 index 00000000..3a2e30bd Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png new file mode 100644 index 00000000..1e27b8bd Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png new file mode 100644 index 00000000..b3e34e3e Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png new file mode 100644 index 00000000..c342d455 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png new file mode 100644 index 00000000..fee7f640 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png new file mode 100644 index 00000000..a6642af1 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png new file mode 100644 index 00000000..f06882d1 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png new file mode 100644 index 00000000..1f7a4c21 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png new file mode 100644 index 00000000..fa92f732 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties new file mode 100644 index 00000000..d4138f3a --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:endstone_dust betterend:cave_moss betterend:shadow_grass byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:end_mycelium +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png new file mode 100644 index 00000000..cf819bb8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png new file mode 100644 index 00000000..bc01affc Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png new file mode 100644 index 00000000..effc7384 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png new file mode 100644 index 00000000..30af3a9d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png new file mode 100644 index 00000000..0b74ea00 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png new file mode 100644 index 00000000..bb1198e4 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png new file mode 100644 index 00000000..eab2989c Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png new file mode 100644 index 00000000..e888cb2d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png new file mode 100644 index 00000000..d621f44d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png new file mode 100644 index 00000000..fe25e341 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png new file mode 100644 index 00000000..5eef4cad Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png new file mode 100644 index 00000000..b1d24587 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png new file mode 100644 index 00000000..dd439534 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png new file mode 100644 index 00000000..aff99fbb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png new file mode 100644 index 00000000..decc1df6 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png new file mode 100644 index 00000000..3539ffee Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png new file mode 100644 index 00000000..19456c06 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties new file mode 100644 index 00000000..a519ff8a --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:shadow_grass +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png new file mode 100644 index 00000000..0e8a30b8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png new file mode 100644 index 00000000..a279ef34 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png new file mode 100644 index 00000000..8f213540 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png new file mode 100644 index 00000000..3e2f8e4f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png new file mode 100644 index 00000000..7ac8e31f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png new file mode 100644 index 00000000..7e146564 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png new file mode 100644 index 00000000..db2cbf58 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png new file mode 100644 index 00000000..a9c0943b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png new file mode 100644 index 00000000..03fb198b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png new file mode 100644 index 00000000..c298da04 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png new file mode 100644 index 00000000..b3aab034 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png new file mode 100644 index 00000000..3d319553 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png new file mode 100644 index 00000000..8a49840f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png new file mode 100644 index 00000000..a338a2e9 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png new file mode 100644 index 00000000..faf95c26 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png new file mode 100644 index 00000000..80bc0611 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png new file mode 100644 index 00000000..87bb5c50 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties new file mode 100644 index 00000000..092dc56e --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss betterend:shadow_grass byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:pink_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png new file mode 100644 index 00000000..057d32f9 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png new file mode 100644 index 00000000..9594e510 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png new file mode 100644 index 00000000..732e8e8a Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png new file mode 100644 index 00000000..ddc6c4e9 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png new file mode 100644 index 00000000..7373cf41 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png new file mode 100644 index 00000000..65761543 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png new file mode 100644 index 00000000..4d49254f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png new file mode 100644 index 00000000..dba78f68 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png new file mode 100644 index 00000000..112d9b5c Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png new file mode 100644 index 00000000..9279002d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png new file mode 100644 index 00000000..f50499f0 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png new file mode 100644 index 00000000..9f8bed30 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png new file mode 100644 index 00000000..a4365c8a Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png new file mode 100644 index 00000000..9ebf8e71 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png new file mode 100644 index 00000000..cc2d5b7a Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png new file mode 100644 index 00000000..af2b1b2f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png new file mode 100644 index 00000000..fa238e33 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties new file mode 100644 index 00000000..02961bfd --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:crystal_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png new file mode 100644 index 00000000..8e3d4cf1 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png new file mode 100644 index 00000000..83823914 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png new file mode 100644 index 00000000..f623c7bd Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png new file mode 100644 index 00000000..bef6508c Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png new file mode 100644 index 00000000..6e9b01bb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png new file mode 100644 index 00000000..82fc46bb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png new file mode 100644 index 00000000..42c137e2 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png new file mode 100644 index 00000000..b9dcf33b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png new file mode 100644 index 00000000..c0393d14 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png new file mode 100644 index 00000000..f392e546 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png new file mode 100644 index 00000000..c9ba7fc2 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png new file mode 100644 index 00000000..ea9eec42 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png new file mode 100644 index 00000000..e310bbba Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png new file mode 100644 index 00000000..489a5a54 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png new file mode 100644 index 00000000..9bc9721c Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png new file mode 100644 index 00000000..49794325 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png new file mode 100644 index 00000000..434b7583 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties new file mode 100644 index 00000000..773c7b74 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:chorus_nylium +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png new file mode 100644 index 00000000..2a25ff4e Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png new file mode 100644 index 00000000..b2a070a8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png new file mode 100644 index 00000000..f0ae41cd Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png new file mode 100644 index 00000000..bd38bc7a Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png new file mode 100644 index 00000000..09de79e7 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png new file mode 100644 index 00000000..1d506846 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png new file mode 100644 index 00000000..032f429d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png new file mode 100644 index 00000000..a31f1211 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png new file mode 100644 index 00000000..574f4558 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png new file mode 100644 index 00000000..7d5bcb39 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png new file mode 100644 index 00000000..19214a1b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png new file mode 100644 index 00000000..cde72ff0 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png new file mode 100644 index 00000000..28aa99ee Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png new file mode 100644 index 00000000..9d190d75 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png new file mode 100644 index 00000000..19041ceb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png new file mode 100644 index 00000000..9fbfc238 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png new file mode 100644 index 00000000..14fdd580 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties new file mode 100644 index 00000000..18c68b3d --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:endstone_dust betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:end_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png new file mode 100644 index 00000000..8db7ca1f Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png new file mode 100644 index 00000000..54eeb8c0 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png new file mode 100644 index 00000000..a3218431 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png new file mode 100644 index 00000000..b3a93ac7 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png new file mode 100644 index 00000000..1b2d4715 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png new file mode 100644 index 00000000..3998baf8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png new file mode 100644 index 00000000..21a2a1d9 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png new file mode 100644 index 00000000..1aa8e0be Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png new file mode 100644 index 00000000..51651b61 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png new file mode 100644 index 00000000..fd9ca0bb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png new file mode 100644 index 00000000..a62a37e5 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png new file mode 100644 index 00000000..236fc41e Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png new file mode 100644 index 00000000..78df1b23 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png new file mode 100644 index 00000000..13177059 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png new file mode 100644 index 00000000..0828a363 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png new file mode 100644 index 00000000..84c01406 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png new file mode 100644 index 00000000..36a53fdb Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties new file mode 100644 index 00000000..68671e67 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:end_moss betterend:endstone_dust betterend:amber_moss betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:jungle_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png new file mode 100644 index 00000000..825c5a61 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png new file mode 100644 index 00000000..ffcddb8b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png new file mode 100644 index 00000000..95ae3e9b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png new file mode 100644 index 00000000..61a75bc8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png new file mode 100644 index 00000000..d6a962bf Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png new file mode 100644 index 00000000..bf7e550d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png new file mode 100644 index 00000000..17ddf5d3 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png new file mode 100644 index 00000000..bae0ee46 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png new file mode 100644 index 00000000..cc1dfd7d Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png new file mode 100644 index 00000000..15620fc3 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png new file mode 100644 index 00000000..becaaa5b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png new file mode 100644 index 00000000..abe4f264 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png new file mode 100644 index 00000000..f556156b Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png new file mode 100644 index 00000000..987fbde5 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png new file mode 100644 index 00000000..be6227d8 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png new file mode 100644 index 00000000..8f0a7609 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png new file mode 100644 index 00000000..e8b707d4 Binary files /dev/null and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties new file mode 100644 index 00000000..b229a7cf --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:end_moss byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:amber_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/desktop.ini b/src/main/resources/assets/minecraft/optifine/ctm/desktop.ini new file mode 100644 index 00000000..80d5a563 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/desktop.ini @@ -0,0 +1,3 @@ +[.ShellClassInfo] +OriginalIcon=C:\Windows\system32\imageres.dll|-3 +IconResource=2351049125744197437644232185141105109420.ico,0 diff --git a/src/main/resources/assets/minecraft/optifine/emissive.properties b/src/main/resources/assets/minecraft/optifine/emissive.properties new file mode 100644 index 00000000..3ce7dca0 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/emissive.properties @@ -0,0 +1 @@ +suffix.emissive=_e \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png new file mode 100644 index 00000000..5019c1ce Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png new file mode 100644 index 00000000..26bda1e9 Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png new file mode 100644 index 00000000..42b159fe Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png new file mode 100644 index 00000000..692a470d Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png new file mode 100644 index 00000000..228612cf Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png new file mode 100644 index 00000000..9d1f79b1 Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png differ diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 9fd178f7..de7b097c 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -7,16 +7,20 @@ "AbstractSoundInstanceAccessor", "ClientPlayNetworkHandlerMixin", "NamespaceResourceManagerMixin", - "DeserializationContextMixin", "EnchantingTableBlockMixin", "BackgroundRendererMixin", "ClientRecipeBookMixin", "ModelVariantMapMixin", "MinecraftClientMixin", + "ContextGsonAccessor", + "PlayerRendererMixin", "WorldRendererMixin", "MusicTrackerMixin", + "AnvilScreenMixin", + "BiomeColorsMixin", "ModelLoaderMixin", - "BiomeColorsMixin" + "LocalPlayerMixin", + "CapeLayerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index d8587888..1225e6e1 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,31 +4,39 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_8", "mixins": [ - "ServerPlayNetworkHandlerMixin", - "EnchantmentScreenHandlerMixin", - "CraftingScreenHandlerMixin", - "GenerationSettingsAccessor", - "AnvilScreenHandlerMixin", - "ServerPlayerEntityMixin", + "BiomeGenerationSettingsAccessor", + "NoiseBasedChunkGeneratorMixin", + "ChunkBiomeContainerMixin", + "WeightedBiomePickerMixin", "ChorusPlantFeatureMixin", - "ComposterBlockAccessor", + "PlayerAdvancementsMixin", "ChorusFlowerBlockMixin", - "LandPathNodeMakerMixin", + "ComposterBlockAccessor", "ChorusPlantBlockMixin", + "EndPodiumFeatureMixin", + "PotionBrewingAccessor", "RecipeManagerAccessor", + "EnchantmentMenuMixin", "MinecraftServerMixin", - "TagGroupLoaderMixin", - "EndermanEntityMixin", + "BlockBehaviourMixin", "DimensionTypeMixin", "RecipeManagerMixin", - "AbstractBlockMixin", - "HostileEntityMixin", - "LivingEntityMixin", + "ArmorItemAccessor", "BoneMealItemMixin", - "PlayerEntityMixin", - "SlimeEntityMixin", - "BrewingAccessor", - "EntityMixin" + "CraftingMenuMixin", + "LivingEntityMixin", + "ServerPlayerMixin", + "SpikeFeatureMixin", + "ServerLevelMixin", + "AnvilBlockMixin", + "PlayerListMixin", + "AnvilMenuMixin", + "TagLoaderMixin", + "EnderManMixin", + "MonsterMixin", + "EntityMixin", + "PlayerMixin", + "SlimeMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json index df008a72..dc587602 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json @@ -10,7 +10,7 @@ }, { "type": "image", - "text": "There is a destroyed (or not) frame of $(bold)Runed Flavolite$() and eight pedestals around it.", + "text": "There is a destroyed (or not) frame of $(bold)Runed Flavolite$() and six pedestals around it.", "border": false, "images": [ "betterend:textures/images/eternal_ritual/portal_structure.png" @@ -22,7 +22,7 @@ }, { "type": "image", - "text": "And place 8 $(bold)Eternal Crystals$() to pedestals.", + "text": "And place 6 $(bold)Eternal Crystals$() to pedestals.", "border": false, "images": [ "betterend:textures/images/eternal_ritual/portal_frame_full.png" @@ -41,4 +41,4 @@ "text": "$(bold)Runed Flavolite$() (to recover the frame) and $(bold)Eternal Crystals$() can be obtained by $(l:rituals/infusion_ritual)Infusion Rilual$(/l)." } ] -} \ No newline at end of file +} diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json new file mode 100644 index 00000000..40e3c944 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json @@ -0,0 +1,5 @@ +{ + "name": "생물 군계", + "description": "작업 중...", + "icon": "betterend:end_mycelium" +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json new file mode 100644 index 00000000..24252b73 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json @@ -0,0 +1,6 @@ +{ + "name": "제작", + "description": "", + "icon": "betterend:iron_hammer", + "sortnum": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json new file mode 100644 index 00000000..81cd0798 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json @@ -0,0 +1,6 @@ +{ + "name": "엔드 베일", + "description": "엔더맨의 눈을 봐도 공격하지 않습니다.", + "icon": "betterend:textures/mob_effect/end_veil.png", + "sortnum": 3 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json new file mode 100644 index 00000000..e53476c0 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json @@ -0,0 +1,6 @@ +{ + "name": "의식", + "description": "엔드의 신비로운 예술, 새로운 길과 기회를 여는 비밀 의식.", + "icon": "betterend:infusion_pedestal", + "sortnum": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json new file mode 100644 index 00000000..526fdde4 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json @@ -0,0 +1,44 @@ +{ + "name": "영원한 의식", + "icon": "betterend:eternal_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "\"오버월드로 돌아가는 일은 쉽지 않습니다.\"$(br2)엔드를 여행하는 동안 고대 유적을 발견할 수 있습니다." + }, + { + "type": "image", + "text": "파괴된 (혹은 멀쩡한) $(bold)룬을 새긴 플라보라이트$() 포탈 틀과 주변에 6개의 받침대가 있습니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_structure.png" + ] + }, + { + "type": "text", + "text": "이것은 한때 엔드와 오버월드를 연결했던 웅장한 포탈의 잔해입니다.$(br2)포탈을 활성화하려면 포탈 틀을 복구해야 합니다 (파괴된 경우)." + }, + { + "type": "image", + "text": "그리고 6개의 $(bold)영원한 수정$()을 받침대에 놓습니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_frame_full.png" + ] + }, + { + "type": "image", + "text": "마지막 수정을 놓으면 포탈이 활성화됩니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/ritual_finished.png" + ] + }, + { + "type": "text", + "text": "$(bold)룬을 새긴 플라보라이트$() (포탈 틀 복구용) 및 $(bold)영원한 수정$()은 $(l:rituals/infusion_ritual)주입 의식$(/l)을 통해 얻을 수 있습니다." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json new file mode 100644 index 00000000..9fd621e1 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json @@ -0,0 +1,64 @@ +{ + "name": "주입 의식", + "icon": "betterend:infusion_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "원소의 힘을 아이템에 주입합니다." + }, + { + "type": "crafting", + "title": "재료 준비", + "text": "먼저 $(bold)주입 받침대$()와 8개의 $(bold)아무$() 받침대를 제작해야합니다.", + "recipe": "betterend:infusion_pedestal" + }, + { + "type": "image", + "text": "그 다음 중앙에 주입 받침대를 설치한 후 주위에 다른 받침대를 설치합니다.", + "border": true, + "images": [ + "betterend:textures/images/infusion_ritual/infusion_ritual_start.png", + "betterend:textures/images/infusion_ritual/infusion_ritual_full.png" + ] + }, + { + "type": "image", + "title": "주입", + "text": "구조물이 완성되면 주입을 할 수 있습니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_structure.png" + ] + }, + { + "type": "image", + "text": "주 재료는 $(bold)주입 받침대$()에 촉매는 다른 받침대에 놓습니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_ready.png" + ] + }, + { + "type": "text", + "text": "$(l:https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items)REI$(/l)를 통해 제작법을 볼 수 있습니다.$(br2)주입을 시작하려면 주 재료를 마지막에 놓거나 $(bold)주입 받침대$()를 우클릭 하세요." + }, + { + "type": "image", + "text": "완료될 때까지 기다려야 합니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_started.png" + ] + }, + { + "type": "image", + "text": "결과물을 가져가세요.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_finished.png" + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt new file mode 100644 index 00000000..e642b0e1 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_1.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_1.nbt new file mode 100644 index 00000000..1f257730 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_2.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_2.nbt new file mode 100644 index 00000000..59b2cf45 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt new file mode 100644 index 00000000..8d3477e7 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_4.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_4.nbt new file mode 100644 index 00000000..bfd411ce Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_4.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt new file mode 100644 index 00000000..ee206fbf Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt new file mode 100644 index 00000000..69904743 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt new file mode 100644 index 00000000..1f9fd3c2 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_8.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_8.nbt new file mode 100644 index 00000000..d8ca604d Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_8.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json b/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json new file mode 100644 index 00000000..d2397a7f --- /dev/null +++ b/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json @@ -0,0 +1,12 @@ +{ + "structures": [ + { "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_3", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_4", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_5", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_6", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_7", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_8", "offsetY": 0, "terrainMerge": "surface" } + ] +} diff --git a/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt b/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt index 21e443aa..d77c15f8 100644 Binary files a/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt and b/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/foggy_mushroomland/tree_house.nbt b/src/main/resources/data/betterend/structures/biome/foggy_mushroomland/tree_house.nbt index fc2eb3d2..e4551fcb 100644 Binary files a/src/main/resources/data/betterend/structures/biome/foggy_mushroomland/tree_house.nbt and b/src/main/resources/data/betterend/structures/biome/foggy_mushroomland/tree_house.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt new file mode 100644 index 00000000..a2e1da2b Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt new file mode 100644 index 00000000..7b69a0d7 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt new file mode 100644 index 00000000..92de71c0 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt new file mode 100644 index 00000000..1e8e9339 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt new file mode 100644 index 00000000..37500bb3 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_2.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_2.nbt new file mode 100644 index 00000000..057bc2b3 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json b/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json new file mode 100644 index 00000000..d33c7b73 --- /dev/null +++ b/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json @@ -0,0 +1,13 @@ +{ + "structures": [ + { "nbt": "cabin", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "light_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "log_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "log_2", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "stump_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "stump_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "stump_3", "offsetY": 0, "terrainMerge": "surface" } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt new file mode 100644 index 00000000..655057ab Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_2.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_2.nbt new file mode 100644 index 00000000..f919cedb Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt new file mode 100644 index 00000000..38f59eac Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt b/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt index 0af440e5..74c6bb53 100644 Binary files a/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt and b/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt new file mode 100644 index 00000000..a1a3869d Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt new file mode 100644 index 00000000..7f8da56f Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_3.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_3.nbt new file mode 100644 index 00000000..9d428124 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_base_3.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt new file mode 100644 index 00000000..9a1091fb Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt new file mode 100644 index 00000000..05805e9c Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt new file mode 100644 index 00000000..eb5a52de Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_2.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_2.nbt new file mode 100644 index 00000000..2a168470 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt new file mode 100644 index 00000000..97d401e6 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt new file mode 100644 index 00000000..81ffb032 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt new file mode 100644 index 00000000..aca9c04f Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt new file mode 100644 index 00000000..8a6c0a05 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt differ diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt new file mode 100644 index 00000000..fffce784 Binary files /dev/null and b/src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt differ diff --git a/src/main/resources/data/betterend/structures/portal/end_portal_active.nbt b/src/main/resources/data/betterend/structures/portal/end_portal_active.nbt new file mode 100644 index 00000000..27ef1e47 Binary files /dev/null and b/src/main/resources/data/betterend/structures/portal/end_portal_active.nbt differ diff --git a/src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt b/src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt new file mode 100644 index 00000000..30047c92 Binary files /dev/null and b/src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 91334346..315cf94c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -4,13 +4,18 @@ "version": "${version}", "name": "Better End", - "description": "More content for The End.", + "description": "More content for The End dimension, including new biomes, plants, mobs, mechanics, terrain generation and more.\nMade by:\n- paulevs (code & art)\n- Bulldog83 (code & art)\n- Edos (building)\n- Yuki (art)\n- Seaward (art)\n- Firel (music)\n", "authors": [ - "paulevs", - "Bulldog83" + "paulevs (code & art)", + "Bulldog83 (code & art)", + "Edos (building)", + "Yuki (art)", + "Seaward (art)", + "Firel (music)" ], "contact": { "homepage": "https://www.curseforge.com/minecraft/mc-mods/betterend", + "issues": "https://github.com/paulevsGitch/BetterEnd/issues", "sources": "https://github.com/paulevsGitch/BetterEnd" }, @@ -26,10 +31,10 @@ "ru.betterend.client.BetterEndClient" ], "rei_plugins": [ - "ru.betterend.compat.rei.REIPlugin" + "ru.betterend.integration.rei.REIPlugin" ], "rei_containers": [ - "ru.betterend.compat.rei.REIContainer" + "ru.betterend.integration.rei.REIContainer" ] }, "mixins": [ @@ -39,7 +44,12 @@ "depends": { "fabricloader": ">=0.10.0", - "fabric": ">=0.26.0", + "fabric": ">=0.29.0", "minecraft": ">=1.16.3" + }, + "suggests": { + "byg": ">=1.1.3", + "blockus": ">=2.0.2", + "nourish": ">=1.2.0" } }