diff --git a/build.gradle b/build.gradle index c531424..296d4b9 100755 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,7 @@ repositories { maven { url = "https://api.modrinth.com/maven" } + maven { url 'https://maven.nucleoid.xyz' } } dependencies { @@ -46,8 +47,14 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "maven.modrinth:midnightlib:${midnightlib_version}" - include "maven.modrinth:midnightlib:${midnightlib_version}" + modImplementation include("maven.modrinth:midnightlib:${midnightlib_version}") + + modImplementation ("eu.pb4:polymer-core:${polymer_version}") + modImplementation ("eu.pb4:polymer-blocks:${polymer_version}") + modImplementation ("eu.pb4:polymer-resource-pack:${polymer_version}") + modImplementation ("eu.pb4:polymer-virtual-entity:${polymer_version}") + modImplementation ("eu.pb4:polymer-autohost:${polymer_version}") + modImplementation ("eu.pb4:factorytools:${factorytools_version}") } processResources { diff --git a/gradle.properties b/gradle.properties index 871f425..ebd6f52 100755 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx2G loader_version=0.15.11 # Mod Properties - mod_version = 1.8.2 + mod_version = 1.9.0 maven_group = eu.midnightdust.motschen archives_base_name = rocks release_type=release @@ -18,4 +18,6 @@ org.gradle.jvmargs=-Xmx2G # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api fabric_version=0.100.1+1.21 - midnightlib_version=1.5.7-fabric + midnightlib_version=1.6.3-fabric + polymer_version=0.9.14+1.21.1 + factorytools_version=0.3.2+1.21 diff --git a/src/main/java/eu/midnightdust/motschen/rocks/RocksClient.java b/src/main/java/eu/midnightdust/motschen/rocks/RocksClient.java index d4f78de..0b4fb53 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/RocksClient.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/RocksClient.java @@ -1,7 +1,9 @@ package eu.midnightdust.motschen.rocks; import eu.midnightdust.motschen.rocks.blockstates.StarfishVariation; +import eu.midnightdust.motschen.rocks.networking.HelloPayload; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; @@ -14,6 +16,8 @@ import static eu.midnightdust.motschen.rocks.RocksMain.STARFISH_VARIATION; public class RocksClient implements ClientModInitializer { @Override public void onInitializeClient() { + ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> sender.sendPacket(new HelloPayload())); + ModelPredicateProviderRegistry.register(RocksMain.Starfish.asItem(), Identifier.of("red"), (stack, world, entity, seed) -> matchesVariation(stack, StarfishVariation.RED)); ModelPredicateProviderRegistry.register(RocksMain.Starfish.asItem(), Identifier.of("pink"), (stack, world, entity, seed) -> matchesVariation(stack, StarfishVariation.PINK)); ModelPredicateProviderRegistry.register(RocksMain.Starfish.asItem(), Identifier.of("orange"), (stack, world, entity, seed) -> matchesVariation(stack, StarfishVariation.ORANGE)); diff --git a/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java b/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java index f89d9fc..643945c 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java @@ -1,5 +1,6 @@ package eu.midnightdust.motschen.rocks; +import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.motschen.rocks.block.*; import eu.midnightdust.motschen.rocks.block.blockentity.BlockEntityInit; import eu.midnightdust.motschen.rocks.blockstates.RockVariation; @@ -7,10 +8,17 @@ import eu.midnightdust.motschen.rocks.blockstates.SeashellVariation; import eu.midnightdust.motschen.rocks.blockstates.StarfishVariation; import eu.midnightdust.motschen.rocks.blockstates.StickVariation; import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.midnightdust.motschen.rocks.networking.HelloPayload; +import eu.midnightdust.motschen.rocks.util.RockType; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; import eu.midnightdust.motschen.rocks.world.*; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.block.Block; +import net.minecraft.block.WoodType; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -18,62 +26,40 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.state.property.EnumProperty; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static eu.midnightdust.motschen.rocks.util.RegistryUtil.registerBlockWithItem; import static eu.midnightdust.motschen.rocks.util.RegistryUtil.registerItem; +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.*; public class RocksMain implements ModInitializer { public static final String MOD_ID = "rocks"; + public static boolean polymerMode = hasRequiredPolymerModules(); + public static List playersWithMod = new ArrayList<>(); public static final EnumProperty ROCK_VARIATION = EnumProperty.of("variation", RockVariation.class); public static final EnumProperty STICK_VARIATION = EnumProperty.of("variation", StickVariation.class); public static final EnumProperty SEASHELL_VARIATION = EnumProperty.of("variation", SeashellVariation.class); public static final EnumProperty STARFISH_VARIATION = EnumProperty.of("variation", StarfishVariation.class); - public static Block Rock = new Rock(); - public static Block GraniteRock = new Rock(); - public static Block DioriteRock = new Rock(); - public static Block AndesiteRock = new Rock(); - public static Block SandRock = new Rock(); - public static Block RedSandRock = new Rock(); - public static Block GravelRock = new Rock(); - public static Block EndstoneRock = new Rock(); - public static Block NetherrackRock = new Rock(); - public static Block SoulSoilRock = new Rock(); + public static Map rocksByType = new HashMap<>(); + public static Map sticksByType = new HashMap<>(); + public static Map splittersByType = new HashMap<>(); - public static Block OakStick = new Stick(); - public static Block SpruceStick = new Stick(); - public static Block BirchStick = new Stick(); - public static Block AcaciaStick = new Stick(); - public static Block JungleStick = new Stick(); - public static Block DarkOakStick = new Stick(); - public static Block MangroveStick = new Stick(); - public static Block CherryStick = new Stick(); - public static Block BambooStick = new Stick(); - public static Block CrimsonStick = new Stick(); - public static Block WarpedStick = new Stick(); + public static Block Pinecone; + public static Block Seashell; + public static Block Starfish; + public static Block Geyser; + public static Block NetherGeyser; - public static Block Pinecone = new Pinecone(); - public static Block Seashell = new Seashell(); - public static Block Starfish = new Starfish(); - public static Block Geyser = new OverworldGeyser(); - public static Block NetherGeyser = new NetherGeyser(); - - public static Item CobblestoneSplitter; - public static Item GraniteSplitter; - public static Item DioriteSplitter; - public static Item AndesiteSplitter; - public static Item SandStoneSplitter; - public static Item RedSandStoneSplitter; - public static Item EndStoneSplitter; - public static Item NetherrackSplitter; - public static Item SoulSoilSplitter; public static List groupItems = new ArrayList<>(); public static ItemGroup RocksGroup; public static final RegistryKey ROCKS_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, Identifier.of(MOD_ID, "rocks")); @@ -81,71 +67,66 @@ public class RocksMain implements ModInitializer { @Override public void onInitialize() { RocksConfig.init("rocks", RocksConfig.class); + if (polymerMode) polymerMode = RocksConfig.enablePolymerMode && !PlatformFunctions.isClientEnv(); - registerBlockWithItem(Identifier.of(MOD_ID,"rock"), Rock); - registerBlockWithItem(Identifier.of(MOD_ID,"granite_rock"), GraniteRock); - registerBlockWithItem(Identifier.of(MOD_ID,"diorite_rock"), DioriteRock); - registerBlockWithItem(Identifier.of(MOD_ID,"andesite_rock"), AndesiteRock); - registerBlockWithItem(Identifier.of(MOD_ID,"sand_rock"), SandRock); - registerBlockWithItem(Identifier.of(MOD_ID,"red_sand_rock"), RedSandRock); - registerBlockWithItem(Identifier.of(MOD_ID,"gravel_rock"), GravelRock); - registerBlockWithItem(Identifier.of(MOD_ID,"end_stone_rock"), EndstoneRock); - registerBlockWithItem(Identifier.of(MOD_ID,"netherrack_rock"), NetherrackRock); - registerBlockWithItem(Identifier.of(MOD_ID,"soul_soil_rock"), SoulSoilRock); + PayloadTypeRegistry.playC2S().register(HelloPayload.PACKET_ID, HelloPayload.codec); + ServerPlayNetworking.registerGlobalReceiver(HelloPayload.PACKET_ID, (payload, context) -> { + playersWithMod.add(context.player()); + if (polymerMode) PolyUtil.hideElementHolders(context.player()); + }); + ServerPlayConnectionEvents.DISCONNECT.register((playNetworkHandler, server) -> { + playersWithMod.remove(playNetworkHandler.player); + }); - registerBlockWithItem(Identifier.of(MOD_ID,"oak_stick"), OakStick); - registerBlockWithItem(Identifier.of(MOD_ID,"spruce_stick"), SpruceStick); - registerBlockWithItem(Identifier.of(MOD_ID,"birch_stick"), BirchStick); - registerBlockWithItem(Identifier.of(MOD_ID,"acacia_stick"), AcaciaStick); - registerBlockWithItem(Identifier.of(MOD_ID,"jungle_stick"), JungleStick); - registerBlockWithItem(Identifier.of(MOD_ID,"dark_oak_stick"), DarkOakStick); - registerBlockWithItem(Identifier.of(MOD_ID,"mangrove_stick"), MangroveStick); - registerBlockWithItem(Identifier.of(MOD_ID,"cherry_stick"), CherryStick); - registerBlockWithItem(Identifier.of(MOD_ID,"bamboo_stick"), BambooStick); - registerBlockWithItem(Identifier.of(MOD_ID,"crimson_stick"), CrimsonStick); - registerBlockWithItem(Identifier.of(MOD_ID,"warped_stick"), WarpedStick); + if (polymerMode) PolyUtil.init(); - registerBlockWithItem(Identifier.of(MOD_ID,"geyser"), Geyser); - registerBlockWithItem(Identifier.of(MOD_ID,"nether_geyser"), NetherGeyser); + for (RockType type : RockType.values()) { + rocksByType.put(type, registerBlockWithItem(id(type.getName()), polymerMode ? newRockPolymer() : new Rock())); + } + for (RockType type : RockType.values()) { + if (type != RockType.GRAVEL) + splittersByType.put(type, registerItem(id(type.getSplitterName()), simpleItem())); + } + for (WoodType type : WoodType.stream().toList()) { + sticksByType.put(type, registerBlockWithItem(id(type.name()+"_stick"), polymerMode ? newStickPolymer() : new Stick())); + } - registerBlockWithItem(Identifier.of(MOD_ID,"pinecone"), Pinecone); - registerBlockWithItem(Identifier.of(MOD_ID,"seashell"), Seashell); - registerBlockWithItem(Identifier.of(MOD_ID,"starfish"), Starfish); - CobblestoneSplitter = simpleItem(); - GraniteSplitter = simpleItem(); - DioriteSplitter = simpleItem(); - AndesiteSplitter = simpleItem(); - SandStoneSplitter = simpleItem(); - RedSandStoneSplitter = simpleItem(); - EndStoneSplitter = simpleItem(); - NetherrackSplitter = simpleItem(); - SoulSoilSplitter = simpleItem(); + Pinecone = registerBlockWithItem(Identifier.of(MOD_ID,"pinecone"), polymerMode ? newPineconePolymer() : new Pinecone()); + Seashell = registerBlockWithItem(Identifier.of(MOD_ID,"seashell"), polymerMode ? newSeashellPolymer() : new Seashell()); + Starfish = registerBlockWithItem(Identifier.of(MOD_ID,"starfish"), polymerMode ? newStarfishPolymer() : new Starfish()); - registerItem(Identifier.of(MOD_ID,"cobblestone_splitter"), CobblestoneSplitter); - registerItem(Identifier.of(MOD_ID,"granite_splitter"), GraniteSplitter); - registerItem(Identifier.of(MOD_ID,"diorite_splitter"), DioriteSplitter); - registerItem(Identifier.of(MOD_ID,"andesite_splitter"), AndesiteSplitter); - registerItem(Identifier.of(MOD_ID,"sandstone_splitter"), SandStoneSplitter); - registerItem(Identifier.of(MOD_ID,"red_sandstone_splitter"), RedSandStoneSplitter); - registerItem(Identifier.of(MOD_ID,"end_stone_splitter"), EndStoneSplitter); - registerItem(Identifier.of(MOD_ID,"netherrack_splitter"), NetherrackSplitter); - registerItem(Identifier.of(MOD_ID,"soul_soil_splitter"), SoulSoilSplitter); + Geyser = registerBlockWithItem(Identifier.of(MOD_ID,"geyser"), polymerMode ? newOverworldGeyserPolymer() : new OverworldGeyser()); + NetherGeyser = registerBlockWithItem(Identifier.of(MOD_ID,"nether_geyser"), polymerMode ? newNetherGeyserPolymer() : new NetherGeyser()); registerItemGroup(); - new FeatureRegistry(); + FeatureRegistry.init(); FeatureInjector.init(); BlockEntityInit.init(); } public static Identifier id(String path) { return Identifier.of(MOD_ID, path); } + + private static boolean hasRequiredPolymerModules() { + return PlatformFunctions.isModLoaded("polymer-core") && + PlatformFunctions.isModLoaded("polymer-blocks") && + PlatformFunctions.isModLoaded("polymer-resource-pack") && + PlatformFunctions.isModLoaded("polymer-virtual-entity") && + PlatformFunctions.isModLoaded("factorytools"); + } + public static Item simpleItem() { + if (polymerMode) return PolyUtil.simplePolymerItem(); return new Item(new Item.Settings()); } + public static void registerItemGroup() { - RocksGroup = FabricItemGroup.builder().displayName(Text.translatable("itemGroup.rocks.rocks")).icon(() -> new ItemStack(RocksMain.Rock)).entries(((displayContext, entries) -> entries.addAll(groupItems))).build(); - Registry.register(Registries.ITEM_GROUP, ROCKS_GROUP, RocksGroup); + if (polymerMode) PolyUtil.registerPolymerGroup(); + else { + RocksGroup = FabricItemGroup.builder().displayName(Text.translatable("itemGroup.rocks.rocks")).icon(() -> new ItemStack(rocksByType.get(RockType.STONE))).entries(((displayContext, entries) -> entries.addAll(groupItems))).build(); + Registry.register(Registries.ITEM_GROUP, ROCKS_GROUP, RocksGroup); + } } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/Rock.java b/src/main/java/eu/midnightdust/motschen/rocks/block/Rock.java index 7435f0b..30d0873 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/block/Rock.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/Rock.java @@ -35,23 +35,12 @@ public class Rock extends Block { @Override public BlockState getPlacementState(ItemPlacementContext itemPlacementContext) { return Objects.requireNonNull(super.getPlacementState(itemPlacementContext)) - .with(ROCK_VARIATION, RockVariation.TINY); + .with(ROCK_VARIATION, RockVariation.values()[itemPlacementContext.getWorld().random.nextBetween(0, 3)]); } @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (player.isCreative()) { - if (state.get(ROCK_VARIATION) == RockVariation.TINY) { - world.setBlockState(pos, state.with(ROCK_VARIATION, RockVariation.SMALL)); - } - if (state.get(ROCK_VARIATION) == RockVariation.SMALL) { - world.setBlockState(pos, state.with(ROCK_VARIATION, RockVariation.MEDIUM)); - } - if (state.get(ROCK_VARIATION) == RockVariation.MEDIUM) { - world.setBlockState(pos, state.with(ROCK_VARIATION, RockVariation.LARGE)); - } - if (state.get(ROCK_VARIATION) == RockVariation.LARGE) { - world.setBlockState(pos, state.with(ROCK_VARIATION, RockVariation.TINY)); - } + world.setBlockState(pos, state.with(ROCK_VARIATION, state.get(ROCK_VARIATION).next())); return ActionResult.SUCCESS; } else return ActionResult.FAIL; diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/Seashell.java b/src/main/java/eu/midnightdust/motschen/rocks/block/Seashell.java index 389c4ad..c7d660b 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/block/Seashell.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/Seashell.java @@ -1,6 +1,7 @@ package eu.midnightdust.motschen.rocks.block; import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.blockstates.RockVariation; import eu.midnightdust.motschen.rocks.blockstates.SeashellVariation; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.*; @@ -46,21 +47,14 @@ public class Seashell extends Block implements Waterloggable { public BlockState getPlacementState(ItemPlacementContext itemPlacementContext) { FluidState fluidState = itemPlacementContext.getWorld().getFluidState(itemPlacementContext.getBlockPos()); return Objects.requireNonNull(super.getPlacementState(itemPlacementContext)) - .with(SEASHELL_VARIATION, SeashellVariation.PINK).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + .with(SEASHELL_VARIATION, SeashellVariation.values()[itemPlacementContext.getWorld().random.nextBetween(0, 2)]) + .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); } @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (player.isCreative()) { - if (state.get(SEASHELL_VARIATION) == SeashellVariation.YELLOW) { - world.setBlockState(pos, state.with(SEASHELL_VARIATION, SeashellVariation.WHITE)); - } - if (state.get(SEASHELL_VARIATION) == SeashellVariation.WHITE) { - world.setBlockState(pos, state.with(SEASHELL_VARIATION, SeashellVariation.PINK)); - } - if (state.get(SEASHELL_VARIATION) == SeashellVariation.PINK) { - world.setBlockState(pos, state.with(SEASHELL_VARIATION, SeashellVariation.YELLOW)); - } + world.setBlockState(pos, state.with(SEASHELL_VARIATION, state.get(SEASHELL_VARIATION).next())); return ActionResult.SUCCESS; } else return ActionResult.FAIL; diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/Starfish.java b/src/main/java/eu/midnightdust/motschen/rocks/block/Starfish.java index b0c5e09..cbf5c0b 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/block/Starfish.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/Starfish.java @@ -1,6 +1,7 @@ package eu.midnightdust.motschen.rocks.block; import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.blockstates.RockVariation; import eu.midnightdust.motschen.rocks.blockstates.StarfishVariation; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.*; @@ -52,6 +53,7 @@ public class Starfish extends Block implements Waterloggable { public BlockState getPlacementState(ItemPlacementContext itemPlacementContext) { FluidState fluidState = itemPlacementContext.getWorld().getFluidState(itemPlacementContext.getBlockPos()); return Objects.requireNonNull(super.getPlacementState(itemPlacementContext)) + .with(STARFISH_VARIATION, StarfishVariation.values()[itemPlacementContext.getWorld().random.nextBetween(0, 2)]) .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); } @Override @@ -63,15 +65,7 @@ public class Starfish extends Block implements Waterloggable { public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (player.isCreative()) { - if (state.get(STARFISH_VARIATION) == StarfishVariation.RED) { - world.setBlockState(pos, state.with(STARFISH_VARIATION, StarfishVariation.PINK)); - } - if (state.get(STARFISH_VARIATION) == StarfishVariation.PINK) { - world.setBlockState(pos, state.with(STARFISH_VARIATION, StarfishVariation.ORANGE)); - } - if (state.get(STARFISH_VARIATION) == StarfishVariation.ORANGE) { - world.setBlockState(pos, state.with(STARFISH_VARIATION, StarfishVariation.RED)); - } + world.setBlockState(pos, state.with(STARFISH_VARIATION, state.get(STARFISH_VARIATION).next())); return ActionResult.SUCCESS; } else return ActionResult.FAIL; diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/Stick.java b/src/main/java/eu/midnightdust/motschen/rocks/block/Stick.java index 667ab9c..997d649 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/block/Stick.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/Stick.java @@ -1,6 +1,7 @@ package eu.midnightdust.motschen.rocks.block; import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.blockstates.RockVariation; import eu.midnightdust.motschen.rocks.blockstates.StickVariation; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.*; @@ -38,19 +39,13 @@ public class Stick extends Block { @Override public BlockState getPlacementState(ItemPlacementContext itemPlacementContext) { return Objects.requireNonNull(super.getPlacementState(itemPlacementContext)) - .with(STICK_VARIATION, StickVariation.SMALL).with(WATERLOGGED, false); + .with(STICK_VARIATION, StickVariation.values()[itemPlacementContext.getWorld().random.nextBetween(0, 2)]) + .with(WATERLOGGED, false); } + @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (player.isCreative()) { - if (state.get(STICK_VARIATION) == StickVariation.SMALL) { - world.setBlockState(pos, state.with(STICK_VARIATION, StickVariation.MEDIUM)); - } - if (state.get(STICK_VARIATION) == StickVariation.MEDIUM) { - world.setBlockState(pos, state.with(STICK_VARIATION, StickVariation.LARGE)); - } - if (state.get(STICK_VARIATION) == StickVariation.LARGE) { - world.setBlockState(pos, state.with(STICK_VARIATION, StickVariation.SMALL)); - } + world.setBlockState(pos, state.with(STICK_VARIATION, state.get(STICK_VARIATION).next())); return ActionResult.SUCCESS; } else return ActionResult.FAIL; diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/blockentity/BlockEntityInit.java b/src/main/java/eu/midnightdust/motschen/rocks/block/blockentity/BlockEntityInit.java index 4a6da42..c2ae063 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/block/blockentity/BlockEntityInit.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/blockentity/BlockEntityInit.java @@ -1,18 +1,21 @@ package eu.midnightdust.motschen.rocks.block.blockentity; import eu.midnightdust.motschen.rocks.RocksMain; -import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; +import static eu.midnightdust.motschen.rocks.RocksMain.polymerMode; + public class BlockEntityInit { public static BlockEntityType OVERWORLD_GEYSER_BE; public static BlockEntityType NETHER_GEYSER_BE; public static void init() { - OVERWORLD_GEYSER_BE = Registry.register(Registries.BLOCK_ENTITY_TYPE, Identifier.of(RocksMain.MOD_ID,"overworld_geyser_blockentity"), FabricBlockEntityTypeBuilder.create(OverworldGeyserBlockEntity::new, RocksMain.Geyser).build(null)); - NETHER_GEYSER_BE = Registry.register(Registries.BLOCK_ENTITY_TYPE, Identifier.of(RocksMain.MOD_ID,"nether_geyser_blockentity"), FabricBlockEntityTypeBuilder.create(NetherGeyserBlockEntity::new, RocksMain.NetherGeyser).build(null)); + OVERWORLD_GEYSER_BE = Registry.register(Registries.BLOCK_ENTITY_TYPE, Identifier.of(RocksMain.MOD_ID,"overworld_geyser_blockentity"), BlockEntityType.Builder.create(OverworldGeyserBlockEntity::new, RocksMain.Geyser).build(null)); + NETHER_GEYSER_BE = Registry.register(Registries.BLOCK_ENTITY_TYPE, Identifier.of(RocksMain.MOD_ID,"nether_geyser_blockentity"), BlockEntityType.Builder.create(NetherGeyserBlockEntity::new, RocksMain.NetherGeyser).build(null)); + if (polymerMode) PolyUtil.registerBlockEntities(OVERWORLD_GEYSER_BE, NETHER_GEYSER_BE); } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/NetherGeyserPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/NetherGeyserPolymer.java new file mode 100644 index 0000000..9cecae2 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/NetherGeyserPolymer.java @@ -0,0 +1,43 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.NetherGeyser; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayNetherGeyserModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class NetherGeyserPolymer extends NetherGeyser implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.NETHERRACK.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayNetherGeyserModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/OverworldGeyserPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/OverworldGeyserPolymer.java new file mode 100644 index 0000000..70b4376 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/OverworldGeyserPolymer.java @@ -0,0 +1,43 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.OverworldGeyser; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayOverworldGeyserModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class OverworldGeyserPolymer extends OverworldGeyser implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + return state.get(SNOWY) ? Blocks.SNOW.getDefaultState() : PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.SNOW.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayOverworldGeyserModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/PineconePolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/PineconePolymer.java new file mode 100644 index 0000000..9faa289 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/PineconePolymer.java @@ -0,0 +1,45 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.Pinecone; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayPineconeModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.enums.BlockFace; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class PineconePolymer extends Pinecone implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.SPRUCE_BUTTON.getDefaultState().with(Properties.BLOCK_FACE, BlockFace.FLOOR); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayPineconeModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/RockPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/RockPolymer.java new file mode 100644 index 0000000..882df1a --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/RockPolymer.java @@ -0,0 +1,45 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.Rock; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayRockModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.enums.BlockFace; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class RockPolymer extends Rock implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.STONE_BUTTON.getDefaultState().with(Properties.BLOCK_FACE, BlockFace.FLOOR); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayRockModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/SeashellPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/SeashellPolymer.java new file mode 100644 index 0000000..33466e7 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/SeashellPolymer.java @@ -0,0 +1,44 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.Seashell; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplaySeashellModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class SeashellPolymer extends Seashell implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + if (state.get(WATERLOGGED)) return PolyUtil.PASSABLE_WATERLOGGED_BLOCK; + else return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.WHITE_CANDLE.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplaySeashellModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StarfishPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StarfishPolymer.java new file mode 100644 index 0000000..4e29d42 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StarfishPolymer.java @@ -0,0 +1,44 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.Starfish; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayStarfishModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class StarfishPolymer extends Starfish implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + if (state.get(WATERLOGGED)) return PolyUtil.PASSABLE_WATERLOGGED_BLOCK; + else return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.SEA_PICKLE.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayStarfishModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StickPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StickPolymer.java new file mode 100644 index 0000000..0dbc3d0 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/StickPolymer.java @@ -0,0 +1,45 @@ +package eu.midnightdust.motschen.rocks.block.polymer; + +import eu.midnightdust.motschen.rocks.block.Stick; +import eu.midnightdust.motschen.rocks.block.polymer.model.ItemDisplayStickModel; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.enums.BlockFace; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public class StickPolymer extends Stick implements PolymerBlock, PolymerTexturedBlock, BlockWithElementHolder { + @Override + public BlockState getPolymerBlockState(BlockState state) { + return PolyUtil.SMALL_BLOCK; + } + @Override + public BlockState getPolymerBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : getPolymerBlockState(state); + } + + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return hasModOnClient(player) ? state : Blocks.OAK_BUTTON.getDefaultState().with(Properties.BLOCK_FACE, BlockFace.FLOOR); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayStickModel(initialBlockState, pos); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ConditionalBlockModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ConditionalBlockModel.java new file mode 100644 index 0000000..885d27f --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ConditionalBlockModel.java @@ -0,0 +1,14 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.pb4.factorytools.api.virtualentity.BlockModel; +import net.minecraft.server.network.ServerPlayNetworkHandler; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; + +public abstract class ConditionalBlockModel extends BlockModel { + @Override + public boolean startWatching(ServerPlayNetworkHandler player) { + if (hasModOnClient(player.player)) return false; + else return super.startWatching(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayNetherGeyserModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayNetherGeyserModel.java new file mode 100644 index 0000000..ba498a2 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayNetherGeyserModel.java @@ -0,0 +1,61 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.block.NetherGeyser; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.entity.decoration.Brightness; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import org.joml.Vector3f; + +public class ItemDisplayNetherGeyserModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + private final ItemDisplayElement magma; + public static ItemStack NETHER; + + public static void initModels() { + NETHER = BaseItemProvider.requestModel(RocksMain.id("block/nether_geyser_off")); + } + + public ItemDisplayNetherGeyserModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(2)); + int rotation = pos.hashCode() % 360; + System.out.println(pos.hashCode() + " " + rotation + " " + pos.hashCode() % 360); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); + this.main.setViewRange(0.75f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + + this.magma = ItemDisplayElementUtil.createSimple(new ItemStack(Items.MAGMA_BLOCK)); + this.magma.setDisplaySize(1, 1); + this.magma.setScale(new Vector3f(0.73f, 0.01f, 0.73f)); + this.magma.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); + this.magma.setBrightness(Brightness.FULL); + this.magma.setOffset(new Vec3d(0d, -0.48d, 0d)); + this.magma.setViewRange(state.get(NetherGeyser.ACTIVE) ? (0.75f * (RocksConfig.polymerViewDistance / 100f)) : 0); + this.addElement(this.magma); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + this.magma.setViewRange(state.get(NetherGeyser.ACTIVE) ? (0.75f * (RocksConfig.polymerViewDistance / 100f)) : 0); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return NETHER; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayOverworldGeyserModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayOverworldGeyserModel.java new file mode 100644 index 0000000..e75f2da --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayOverworldGeyserModel.java @@ -0,0 +1,70 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.block.OverworldGeyser; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.entity.decoration.Brightness; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import org.joml.Vector3f; + +public class ItemDisplayOverworldGeyserModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + private final ItemDisplayElement magma; + public static ItemStack OVERWORLD; + + public static void initModels() { + OVERWORLD = BaseItemProvider.requestModel(RocksMain.id("block/geyser_off")); + } + + public ItemDisplayOverworldGeyserModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(2)); + int rotation = pos.hashCode() % 360; + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); + if (state.get(Properties.SNOWY)) this.main.setOffset(new Vec3d(0d, 0.125d, 0d)); + this.main.setViewRange(0.75f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + + this.magma = ItemDisplayElementUtil.createSimple(new ItemStack(Items.MAGMA_BLOCK)); + this.magma.setDisplaySize(1, 1); + this.magma.setScale(new Vector3f(0.73f, 0.01f, 0.73f)); + this.magma.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); + this.magma.setBrightness(Brightness.FULL); + this.magma.setOffset(new Vec3d(0d, state.get(Properties.SNOWY) ? -0.355d : -0.48d, 0d)); + this.magma.setViewRange(state.get(OverworldGeyser.ACTIVE) ? (0.75f * (RocksConfig.polymerViewDistance / 100f)) : 0); + this.addElement(this.magma); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + if (state.get(Properties.SNOWY)) { + this.main.setOffset(new Vec3d(0d, 0.125d, 0d)); + this.magma.setOffset(new Vec3d(0d, -0.355d, 0d)); + } + else { + this.main.setOffset(new Vec3d(0, 0, 0)); + this.magma.setOffset(new Vec3d(0, -0.48d, 0)); + } + this.magma.setViewRange(state.get(OverworldGeyser.ACTIVE) ? (0.75f * (RocksConfig.polymerViewDistance / 100f)) : 0); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return OVERWORLD; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayPineconeModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayPineconeModel.java new file mode 100644 index 0000000..7061ef5 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayPineconeModel.java @@ -0,0 +1,36 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import org.joml.Vector3f; + +public class ItemDisplayPineconeModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + private static ItemStack PINECONE_MODEL; + + public static void initModels() { + PINECONE_MODEL = BaseItemProvider.requestModel(RocksMain.id("block/pinecone")); + } + + public ItemDisplayPineconeModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(1)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(pos.hashCode() % 360)); + this.main.setOffset(new Vec3d(0, -0.25d, 0)); + this.main.setViewRange(0.75f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + } + + private ItemStack getModel(BlockState state) { + return PINECONE_MODEL; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayRockModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayRockModel.java new file mode 100644 index 0000000..05d27f1 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayRockModel.java @@ -0,0 +1,55 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.midnightdust.motschen.rocks.util.RockType; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +import java.util.HashMap; +import java.util.Map; + +public class ItemDisplayRockModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + public static Map models = new HashMap<>(); + + public static void initModels() { + for (RockType type : RockType.values()) { + var stacks = new ItemStack[4]; + for (int i = 0; i < 4; i++) { + stacks[i] = BaseItemProvider.requestModel(RocksMain.id("block/"+type.getVariations()[i].getPath())); + } + models.put(type, stacks); + } + } + + public ItemDisplayRockModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(2)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(90 * (pos.hashCode() % 4))); + this.main.setViewRange(0.75f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + this.main.setItem(getModel(state)); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return models.get(RockType.fromBlockName(state.getBlock().getTranslationKey()))[state.get(RocksMain.ROCK_VARIATION).ordinal()]; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplaySeashellModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplaySeashellModel.java new file mode 100644 index 0000000..e9b471a --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplaySeashellModel.java @@ -0,0 +1,53 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +public class ItemDisplaySeashellModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + public static ItemStack PINK; + public static ItemStack WHITE; + public static ItemStack YELLOW; + + public static void initModels() { + PINK = BaseItemProvider.requestModel(RocksMain.id("block/seashell_pink")); + WHITE = BaseItemProvider.requestModel(RocksMain.id("block/seashell_white")); + YELLOW = BaseItemProvider.requestModel(RocksMain.id("block/seashell_yellow")); + } + + public ItemDisplaySeashellModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(2)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(90 * (pos.hashCode() % 4))); + this.main.setViewRange(0.5f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + this.main.setItem(getModel(state)); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return switch (state.get(RocksMain.SEASHELL_VARIATION)) { + case PINK -> PINK; + case WHITE -> WHITE; + case YELLOW -> YELLOW; + }; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStarfishModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStarfishModel.java new file mode 100644 index 0000000..007647e --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStarfishModel.java @@ -0,0 +1,82 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import org.joml.Vector3f; + +import java.util.HashSet; +import java.util.Set; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.polymerId; + +public class ItemDisplayStarfishModel extends ConditionalBlockModel { + private final Set arms = HashSet.newHashSet(5); + public static ItemStack RED; + public static ItemStack ORANGE; + public static ItemStack PINK; + public static ItemStack RED_FIRST; + public static ItemStack ORANGE_FIRST; + public static ItemStack PINK_FIRST; + + public static void initModels() { + RED = BaseItemProvider.requestModel(polymerId("block/starfish_red_arm")); + ORANGE = BaseItemProvider.requestModel(polymerId("block/starfish_orange_arm")); + PINK = BaseItemProvider.requestModel(polymerId("block/starfish_pink_arm")); + RED_FIRST = BaseItemProvider.requestModel(polymerId("block/starfish_red_first_arm")); + ORANGE_FIRST = BaseItemProvider.requestModel(polymerId("block/starfish_orange_first_arm")); + PINK_FIRST = BaseItemProvider.requestModel(polymerId("block/starfish_pink_first_arm")); + } + + public ItemDisplayStarfishModel(BlockState state, BlockPos pos) { + ItemStack modelStack = getModel(state); + int baseRotation = pos.hashCode() % 360; + double xOffset = ((pos.hashCode() + pos.getX()) % 250 - 125) / 1000f; + double zOffset = ((pos.hashCode() + pos.getZ()) % 250 - 125) / 1000f; + for (int i = 0; i < 5; i++) { + var arm = ItemDisplayElementUtil.createSimple(i != 0 ? modelStack : getFirstModel(state)); + arm.setDisplaySize(1, 1); + arm.setScale(new Vector3f(1)); + arm.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(baseRotation + 72.5f * i)); + arm.setOffset(new Vec3d(xOffset, 0, zOffset)); + arm.setViewRange(0.4f * (RocksConfig.polymerViewDistance / 100f)); + arms.add(arm); + this.addElement(arm); + } + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + ItemStack modelStack = getModel(state); + this.arms.forEach(arm -> arm.setItem(modelStack)); + this.arms.stream().findFirst().orElseThrow().setItem(getFirstModel(state)); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return switch (state.get(RocksMain.STARFISH_VARIATION)) { + case RED -> RED; + case ORANGE -> ORANGE; + case PINK -> PINK; + }; + } + private ItemStack getFirstModel(BlockState state) { + return switch (state.get(RocksMain.STARFISH_VARIATION)) { + case RED -> RED_FIRST; + case ORANGE -> ORANGE_FIRST; + case PINK -> PINK_FIRST; + }; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStickModel.java b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStickModel.java new file mode 100644 index 0000000..e5732d6 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/block/polymer/model/ItemDisplayStickModel.java @@ -0,0 +1,56 @@ +package eu.midnightdust.motschen.rocks.block.polymer.model; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.config.RocksConfig; +import eu.midnightdust.motschen.rocks.util.StickType; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.block.WoodType; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +import java.util.HashMap; +import java.util.Map; + +public class ItemDisplayStickModel extends ConditionalBlockModel { + private final ItemDisplayElement main; + public static Map models = new HashMap<>(); + + public static void initModels() { + for (WoodType type : WoodType.stream().toList()) { + var stacks = new ItemStack[3]; + stacks[0] = BaseItemProvider.requestModel(RocksMain.id("block/small_"+type.name()+"_stick")); + stacks[1] = BaseItemProvider.requestModel(RocksMain.id("block/medium_"+type.name()+"_stick")); + stacks[2] = BaseItemProvider.requestModel(RocksMain.id("block/large_"+type.name()+"_stick")); + models.put(type, stacks); + } + } + + public ItemDisplayStickModel(BlockState state, BlockPos pos) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(1)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(90 * (pos.hashCode() % 4))); + this.main.setViewRange(0.75f * (RocksConfig.polymerViewDistance / 100f)); + this.addElement(this.main); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + this.main.setItem(getModel(state)); + + this.tick(); + } + } + private ItemStack getModel(BlockState state) { + return models.get(StickType.fromBlockName(state.getBlock().getTranslationKey()))[state.get(RocksMain.STICK_VARIATION).ordinal()]; + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/RockVariation.java b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/RockVariation.java index 95eaeb7..03065d1 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/RockVariation.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/RockVariation.java @@ -21,4 +21,10 @@ public enum RockVariation implements StringIdentifiable { public String asString() { return this.name; } + + private static final RockVariation[] vals = values(); + + public RockVariation next() { + return vals[(this.ordinal() + 1) % vals.length]; + } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/SeashellVariation.java b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/SeashellVariation.java index a48269b..62c4ee8 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/SeashellVariation.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/SeashellVariation.java @@ -20,4 +20,10 @@ public enum SeashellVariation implements StringIdentifiable { public String asString() { return this.name; } + + private static final SeashellVariation[] vals = values(); + + public SeashellVariation next() { + return vals[(this.ordinal() + 1) % vals.length]; + } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StarfishVariation.java b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StarfishVariation.java index 9b4bfbd..610425b 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StarfishVariation.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StarfishVariation.java @@ -20,4 +20,10 @@ public enum StarfishVariation implements StringIdentifiable { public String asString() { return this.name; } + + private static final StarfishVariation[] vals = values(); + + public StarfishVariation next() { + return vals[(this.ordinal() + 1) % vals.length]; + } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StickVariation.java b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StickVariation.java index 5a9c986..33b7c4f 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StickVariation.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/blockstates/StickVariation.java @@ -20,4 +20,10 @@ public enum StickVariation implements StringIdentifiable { public String asString() { return this.name; } + + private static final StickVariation[] vals = values(); + + public StickVariation next() { + return vals[(this.ordinal() + 1) % vals.length]; + } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/config/RocksConfig.java b/src/main/java/eu/midnightdust/motschen/rocks/config/RocksConfig.java index 3aea9d6..682008f 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/config/RocksConfig.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/config/RocksConfig.java @@ -44,4 +44,7 @@ public class RocksConfig extends MidnightConfig { public final static String effects = "effects"; @Entry(category = effects) public static boolean geyserLevitation = true; @Entry(category = effects) public static boolean netherGeyserDamage = true; + + @Entry(category = effects) public static boolean enablePolymerMode = true; + @Entry(category = effects, min = 0, max = 200, isSlider = true) public static int polymerViewDistance = 100; } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/item/polymer/StarfishItemPolymer.java b/src/main/java/eu/midnightdust/motschen/rocks/item/polymer/StarfishItemPolymer.java new file mode 100644 index 0000000..be3319f --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/item/polymer/StarfishItemPolymer.java @@ -0,0 +1,60 @@ +package eu.midnightdust.motschen.rocks.item.polymer; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.blockstates.StarfishVariation; +import eu.pb4.factorytools.api.item.AutoModeledPolymerItem; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils; +import net.minecraft.block.Block; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.hasModOnClient; +import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.polymerId; + +public class StarfishItemPolymer extends BlockItem implements AutoModeledPolymerItem { + private final Item polymerItem; + + public StarfishItemPolymer(T block, Settings settings, Item item) { + super(block, settings); + this.polymerItem = item; + } + + @Override + public Item getPolymerItem() { + return polymerItem; + } + + @Override + public int getPolymerCustomModelData(ItemStack itemStack, @Nullable ServerPlayerEntity player) { + var state = itemStack.getComponents().get(DataComponentTypes.BLOCK_STATE); + if (state != null && !state.isEmpty()) { + return switch (state.getValue(RocksMain.STARFISH_VARIATION)) { + case RED -> MODELS.get(StarfishVariation.RED).value(); + case PINK -> MODELS.get(StarfishVariation.PINK).value(); + case ORANGE -> MODELS.get(StarfishVariation.ORANGE).value(); + case null -> MODELS.get(this).value(); + }; + } + return MODELS.get(this).value(); + } + + @Override + public void onRegistered(Identifier selfId) { + var item = Identifier.of(selfId.getNamespace(), "item/" + selfId.getPath()); + MODELS.put(this, PolymerResourcePackUtils.requestModel(this.getPolymerItem(), item)); + MODELS.put(StarfishVariation.RED, PolymerResourcePackUtils.requestModel(this.getPolymerItem(), polymerId("item/" + "red_" + selfId.getPath()))); + MODELS.put(StarfishVariation.PINK, PolymerResourcePackUtils.requestModel(this.getPolymerItem(), polymerId("item/" + "pink_" + selfId.getPath()))); + MODELS.put(StarfishVariation.ORANGE, PolymerResourcePackUtils.requestModel(this.getPolymerItem(), polymerId("item/" + "orange_" + selfId.getPath()))); + } + + @Override + public boolean canSyncRawToClient(@Nullable ServerPlayerEntity player) { + return hasModOnClient(player); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/mixin/MixinModelElementDeserializer.java b/src/main/java/eu/midnightdust/motschen/rocks/mixin/MixinModelElementDeserializer.java index 62a7bce..a6e6a8b 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/mixin/MixinModelElementDeserializer.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/mixin/MixinModelElementDeserializer.java @@ -13,7 +13,7 @@ public class MixinModelElementDeserializer { * @author Motschen * @reason Not cancellable * Unlimited rotation angles for starfish - * Inspired by https://github.com/CottonMC/ModelsUnlocked/blob/master/src/main/java/io/github/cottonmc/modelsunlocked/mixin/ModelElementDeserializerMixin.java + * Inspired by ModelsUnlocked */ @Overwrite private float deserializeRotationAngle(JsonObject json) { diff --git a/src/main/java/eu/midnightdust/motschen/rocks/networking/HelloPayload.java b/src/main/java/eu/midnightdust/motschen/rocks/networking/HelloPayload.java new file mode 100644 index 0000000..0f3d3e7 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/networking/HelloPayload.java @@ -0,0 +1,24 @@ +package eu.midnightdust.motschen.rocks.networking; + +import eu.midnightdust.motschen.rocks.RocksMain; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; + +public record HelloPayload() implements CustomPayload { + public static final Identifier hello = RocksMain.id("hello_payload"); + public static final CustomPayload.Id PACKET_ID = new CustomPayload.Id<>(hello); + public static final PacketCodec codec = PacketCodec.of(HelloPayload::write, HelloPayload::read); + + public static HelloPayload read(RegistryByteBuf buf) { + return new HelloPayload(); + } + + public void write(RegistryByteBuf buf) {} + + @Override + public Id getId() { + return PACKET_ID; + } +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/RegistryUtil.java b/src/main/java/eu/midnightdust/motschen/rocks/util/RegistryUtil.java index eff5e16..6217cd1 100644 --- a/src/main/java/eu/midnightdust/motschen/rocks/util/RegistryUtil.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/RegistryUtil.java @@ -2,6 +2,7 @@ package eu.midnightdust.motschen.rocks.util; import eu.midnightdust.motschen.rocks.RocksMain; import eu.midnightdust.motschen.rocks.blockstates.StarfishVariation; +import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; import net.minecraft.block.Block; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; @@ -19,33 +20,30 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.PlacedFeature; import static eu.midnightdust.motschen.rocks.RocksMain.STARFISH_VARIATION; +import static eu.midnightdust.motschen.rocks.RocksMain.polymerMode; public class RegistryUtil { - public static void registerBlockWithItem(Identifier id, Block block) { + public static T registerBlockWithItem(Identifier id, T block) { Registry.register(Registries.BLOCK, id, block); registerItem(id, blockItem(block)); + return block; } public static Item blockItem(Block block) { + if (polymerMode) return PolyUtil.polymerBlockItem(block); return new BlockItem(block, new Item.Settings()); } - public static void registerItem(Identifier id, Item item) { + public static Item registerItem(Identifier id, Item item) { Registry.register(Registries.ITEM, id, item); if (id.equals(Identifier.of(RocksMain.MOD_ID, "starfish"))) putStarfishItems(item); - else { - ItemStack itemStack = new ItemStack(item); - RocksMain.groupItems.add(itemStack); - } + else RocksMain.groupItems.add(new ItemStack(item)); + return item; } private static void putStarfishItems(Item starfish) { - ItemStack redStarfish = new ItemStack(starfish); - redStarfish.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.BLOCK_STATE, BlockStateComponent.DEFAULT.with(STARFISH_VARIATION, StarfishVariation.RED)).build()); - RocksMain.groupItems.add(redStarfish); - ItemStack orangeStarfish = new ItemStack(starfish); - orangeStarfish.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.BLOCK_STATE, BlockStateComponent.DEFAULT.with(STARFISH_VARIATION, StarfishVariation.ORANGE)).build()); - RocksMain.groupItems.add(orangeStarfish); - ItemStack pinkStarfish = new ItemStack(starfish); - pinkStarfish.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.BLOCK_STATE, BlockStateComponent.DEFAULT.with(STARFISH_VARIATION, StarfishVariation.PINK)).build()); - RocksMain.groupItems.add(pinkStarfish); + for (StarfishVariation variation : StarfishVariation.values()) { + ItemStack starfishType = new ItemStack(starfish); + starfishType.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.BLOCK_STATE, BlockStateComponent.DEFAULT.with(STARFISH_VARIATION, variation)).build()); + RocksMain.groupItems.add(starfishType); + } } public static void register(Registerable> context, String name, ConfiguredFeature feature) { context.register(RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, Identifier.of(RocksMain.MOD_ID, name)), feature); diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/RockType.java b/src/main/java/eu/midnightdust/motschen/rocks/util/RockType.java new file mode 100644 index 0000000..9d687c9 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/RockType.java @@ -0,0 +1,48 @@ +package eu.midnightdust.motschen.rocks.util; + +import net.minecraft.util.Identifier; + +import java.util.Arrays; + +import static eu.midnightdust.motschen.rocks.RocksMain.id; + +public enum RockType { + STONE("rock"), ANDESITE("andesite_rock"), GRANITE("granite_rock"), + DIORITE("diorite_rock"), GRAVEL("gravel_rock"), SANDSTONE("sand_rock"), + RED_SANDSTONE("red_sand_rock"), NETHERRACK("netherrack_rock"), + SOUL_SOIL("soul_soil_rock"), END_STONE("end_stone_rock"), ICE("ice_rock"); + + private final String name; + + RockType(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + public String getSplitterName() { + String splitterName = this.name().toLowerCase()+ "_splitter"; + if (this.equals(RockType.STONE)) splitterName = "cobblestone_splitter"; + return splitterName; + } + + public Identifier[] getVariations() { + var variations = new Identifier[4]; + variations[0] = id("tiny_"+name); + variations[1] = id("small_"+name); + variations[2] = id("medium_"+name); + variations[3] = id("large_"+name); + return variations; + } + + public static RockType fromBlockName(String name) { + return Arrays.stream(values()).filter(type -> name + .replace("block.rocks.", "") + .replace("tiny", "") + .replace("small_", "") + .replace("medium_", "") + .replace("large_", "") + .equals(type.getName())).findFirst().orElse(RockType.STONE); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/StickType.java b/src/main/java/eu/midnightdust/motschen/rocks/util/StickType.java new file mode 100644 index 0000000..a44d566 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/StickType.java @@ -0,0 +1,13 @@ +package eu.midnightdust.motschen.rocks.util; + +import net.minecraft.block.WoodType; + +import java.util.Objects; + +public class StickType { + public static WoodType fromBlockName(String name) { + return WoodType.stream().filter(woodType -> Objects.equals(woodType.name(), name + .replace("block.rocks.", "").replace("_stick", "") + )).findFirst().orElse(WoodType.OAK); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java b/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java new file mode 100644 index 0000000..13625c7 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java @@ -0,0 +1,109 @@ +package eu.midnightdust.motschen.rocks.util.polymer; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.block.Rock; +import eu.midnightdust.motschen.rocks.block.Starfish; +import eu.midnightdust.motschen.rocks.block.Stick; +import eu.midnightdust.motschen.rocks.block.polymer.*; +import eu.midnightdust.motschen.rocks.block.polymer.model.*; +import eu.midnightdust.motschen.rocks.item.polymer.StarfishItemPolymer; +import eu.midnightdust.motschen.rocks.util.RockType; +import eu.pb4.factorytools.api.item.FactoryBlockItem; +import eu.pb4.factorytools.api.item.ModeledItem; +import eu.pb4.polymer.blocks.api.BlockModelType; +import eu.pb4.polymer.blocks.api.PolymerBlockResourceUtils; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import eu.pb4.polymer.core.api.block.PolymerBlockUtils; +import eu.pb4.polymer.core.api.item.PolymerItemGroupUtils; +import eu.pb4.polymer.core.api.utils.PolymerSyncUtils; +import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils; +import eu.pb4.polymer.virtualentity.api.ElementHolder; +import eu.pb4.polymer.virtualentity.api.attachment.BlockBoundAttachment; +import eu.pb4.polymer.virtualentity.impl.HolderHolder; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.List; + +import static eu.midnightdust.motschen.rocks.RocksMain.*; +import static net.minecraft.state.property.Properties.WATERLOGGED; + +public class PolyUtil { + public static BlockState SMALL_BLOCK; + public static BlockState PASSABLE_WATERLOGGED_BLOCK; + + public static void init() { + SMALL_BLOCK = PolymerBlockResourceUtils.requestEmpty(BlockModelType.TRIPWIRE_BLOCK_FLAT); + if (SMALL_BLOCK == null) SMALL_BLOCK = Blocks.STRUCTURE_VOID.getDefaultState(); + + PASSABLE_WATERLOGGED_BLOCK = PolymerBlockResourceUtils.requestEmpty(BlockModelType.KELP_BLOCK); + if (PASSABLE_WATERLOGGED_BLOCK == null) SMALL_BLOCK = Blocks.BARRIER.getDefaultState().with(WATERLOGGED, true); + + PolymerResourcePackUtils.addModAssets(MOD_ID); + + ItemDisplayNetherGeyserModel.initModels(); + ItemDisplayOverworldGeyserModel.initModels(); + ItemDisplayPineconeModel.initModels(); + ItemDisplayRockModel.initModels(); + ItemDisplaySeashellModel.initModels(); + ItemDisplayStarfishModel.initModels(); + ItemDisplayStickModel.initModels(); + } + public static Identifier polymerId(String path) { + return Identifier.of("polymer-rocks", path); + } + + public static boolean hasModOnClient(ServerPlayerEntity player) { + return playersWithMod.contains(player); + } + + public static Item polymerBlockItem(Block block) { + if (block instanceof Starfish) return new StarfishItemPolymer((Block & PolymerBlock) block, new Item.Settings(), Items.KELP); + else return new FactoryBlockItem((Block & PolymerBlock) block, new Item.Settings(), Items.KELP); + } + + public static Item simplePolymerItem() { + return new ModeledItem(Items.FLINT, new Item.Settings()); + } + + public static void registerPolymerGroup() { + RocksMain.RocksGroup = PolymerItemGroupUtils.builder().displayName(Text.translatable("itemGroup.rocks.rocks")).icon(() -> new ItemStack(rocksByType.get(RockType.STONE))).entries((displayContext, entries) -> entries.addAll(RocksMain.groupItems)).build(); + PolymerItemGroupUtils.registerPolymerItemGroup(id("rocks"), RocksMain.RocksGroup); + } + + public static void registerBlockEntities(BlockEntityType... types) { + PolymerBlockUtils.registerBlockEntity(types); + } + + public static void hideElementHolders(ServerPlayerEntity player) { + PolymerSyncUtils.removeCreativeTab(RocksGroup, player.networkHandler); + + List holders = new ArrayList<>(((HolderHolder)player.networkHandler).polymer$getHolders()); + for (ElementHolder holder : holders) { + if (holder.getAttachment() instanceof BlockBoundAttachment bbAttachment + && bbAttachment.getBlockState().getBlock().getTranslationKey().startsWith("block.rocks.")) { + + bbAttachment.stopWatching(player); + player.networkHandler.chunkDataSender.unload(player, bbAttachment.getChunk().getPos()); + player.networkHandler.chunkDataSender.add(bbAttachment.getChunk()); + } + } + } + + public static Rock newRockPolymer() {return new RockPolymer();} + public static Stick newStickPolymer() {return new StickPolymer();} + public static Block newPineconePolymer() {return new PineconePolymer();} + public static Block newSeashellPolymer() {return new SeashellPolymer();} + public static Block newStarfishPolymer() {return new StarfishPolymer();} + public static Block newOverworldGeyserPolymer() {return new OverworldGeyserPolymer();} + public static Block newNetherGeyserPolymer() {return new NetherGeyserPolymer();} +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/world/FeatureRegistry.java b/src/main/java/eu/midnightdust/motschen/rocks/world/FeatureRegistry.java index 19acee1..6f6b671 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/world/FeatureRegistry.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/world/FeatureRegistry.java @@ -21,6 +21,8 @@ public class FeatureRegistry { public static final UnderwaterFeature UNDERWATER_SEASHELL_FEATURE; public static final SnowFeature SNOWY_GEYSER_FEATURE; + public static void init() {} + private static > F register(String name, F feature) { return Registry.register(Registries.FEATURE, name, feature); } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/NetherFeatures.java b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/NetherFeatures.java index fb1b835..4f53bd4 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/NetherFeatures.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/NetherFeatures.java @@ -4,8 +4,10 @@ import com.google.common.collect.ImmutableList; import eu.midnightdust.motschen.rocks.RocksMain; import eu.midnightdust.motschen.rocks.blockstates.RockVariation; import eu.midnightdust.motschen.rocks.blockstates.StickVariation; +import eu.midnightdust.motschen.rocks.util.RockType; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.WoodType; import net.minecraft.registry.Registerable; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.collection.DataPool; @@ -17,45 +19,47 @@ import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider; import java.util.List; +import static eu.midnightdust.motschen.rocks.RocksMain.rocksByType; +import static eu.midnightdust.motschen.rocks.RocksMain.sticksByType; import static eu.midnightdust.motschen.rocks.util.RegistryUtil.register; public class NetherFeatures { public static ConfiguredFeature NETHERRACK_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.NetherrackRock.getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) - .add(RocksMain.NetherrackRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.NetherrackRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.NetherrackRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.NETHERRACK).getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) + .add(rocksByType.get(RockType.NETHERRACK).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.NETHERRACK).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.NETHERRACK).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature SOUL_SOIL_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.SoulSoilRock.getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) - .add(RocksMain.SoulSoilRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.SoulSoilRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.SoulSoilRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.SOUL_SOIL).getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) + .add(rocksByType.get(RockType.SOUL_SOIL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.SOUL_SOIL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.SOUL_SOIL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature NETHER_GRAVEL_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION, RockVariation.TINY), 10) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature NETHER_GEYSER_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder().add(RocksMain.NetherGeyser.getDefaultState(), 1))) ); public static ConfiguredFeature WARPED_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK,new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.WarpedStick.getDefaultState().with(RocksMain.STICK_VARIATION, StickVariation.SMALL), 7) - .add(RocksMain.WarpedStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.WarpedStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.WARPED).getDefaultState().with(RocksMain.STICK_VARIATION, StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.WARPED).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.WARPED).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature CRIMSON_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.CrimsonStick.getDefaultState().with(RocksMain.STICK_VARIATION, StickVariation.SMALL), 7) - .add(RocksMain.CrimsonStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.CrimsonStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.CRIMSON).getDefaultState().with(RocksMain.STICK_VARIATION, StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.CRIMSON).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.CRIMSON).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static PlacedFeature NETHERRACK_ROCK_PLACED_FEATURE = new PlacedFeature(RegistryEntry.of(NETHERRACK_ROCK_FEATURE), List.of(CountPlacementModifier.of(90), RarityFilterPlacementModifier.of(1), SquarePlacementModifier.of(), PlacedFeatures.BOTTOM_TO_TOP_RANGE, BiomePlacementModifier.of(), BlockFilterPlacementModifier.of(BlockPredicate .bothOf(BlockPredicate.IS_AIR, BlockPredicate.matchingBlocks(new Vec3i(0, -1, 0), ImmutableList.of(Blocks.NETHERRACK,Blocks.WARPED_NYLIUM,Blocks.CRIMSON_NYLIUM)))))); diff --git a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/RockFeatures.java b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/RockFeatures.java index c35a96c..23a2776 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/RockFeatures.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/RockFeatures.java @@ -3,6 +3,7 @@ package eu.midnightdust.motschen.rocks.world.configured_feature; import com.google.common.collect.ImmutableList; import eu.midnightdust.motschen.rocks.RocksMain; import eu.midnightdust.motschen.rocks.blockstates.RockVariation; +import eu.midnightdust.motschen.rocks.util.RockType; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.registry.*; @@ -16,64 +17,65 @@ import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider; import java.util.List; +import static eu.midnightdust.motschen.rocks.RocksMain.rocksByType; import static eu.midnightdust.motschen.rocks.util.RegistryUtil.register; public class RockFeatures { public static ConfiguredFeature ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.Rock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.Rock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.Rock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.Rock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature GRANITE_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.GraniteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.GraniteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.GraniteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.GraniteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.GRANITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.GRANITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.GRANITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.GRANITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature DIORITE_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.DioriteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.DioriteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.DioriteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.DioriteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.DIORITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.DIORITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.DIORITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.DIORITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature ANDESITE_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.AndesiteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.AndesiteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.AndesiteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.AndesiteRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.ANDESITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.ANDESITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.ANDESITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.ANDESITE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature SAND_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.SandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.SandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.SandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.SandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature RED_SAND_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK,new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.RedSandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.RedSandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.RedSandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.RedSandRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.RED_SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.RED_SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.RED_SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.RED_SANDSTONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static ConfiguredFeature END_STONE_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.EndstoneRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.EndstoneRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.EndstoneRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.EndstoneRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build()) + .add(rocksByType.get(RockType.END_STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.END_STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.END_STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.END_STONE).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build()) )); public static ConfiguredFeature GRAVEL_ROCK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) - .add(RocksMain.GravelRock.getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.TINY), 10) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.SMALL), 7) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.MEDIUM), 5) + .add(rocksByType.get(RockType.GRAVEL).getDefaultState().with(RocksMain.ROCK_VARIATION,RockVariation.LARGE), 1).build())) ); public static PlacedFeature ROCK_PLACED_FEATURE = new PlacedFeature(RegistryEntry.of(ROCK_FEATURE), List.of(CountPlacementModifier.of(3), RarityFilterPlacementModifier.of(1), SquarePlacementModifier.of(), PlacedFeatures.WORLD_SURFACE_WG_HEIGHTMAP, BiomePlacementModifier.of(), BlockFilterPlacementModifier.of(BlockPredicate.bothOf(BlockPredicate.IS_AIR, BlockPredicate.not(BlockPredicate.matchingBlocks(new Vec3i(0, -1, 0), ImmutableList.of(Blocks.ICE,Blocks.SAND,Blocks.RED_SAND,Blocks.END_STONE))))))); diff --git a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/StickFeatures.java b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/StickFeatures.java index a04ad62..b064fd9 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/StickFeatures.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/world/configured_feature/StickFeatures.java @@ -5,6 +5,7 @@ import eu.midnightdust.motschen.rocks.RocksMain; import eu.midnightdust.motschen.rocks.blockstates.StickVariation; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.WoodType; import net.minecraft.registry.Registerable; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.collection.DataPool; @@ -16,63 +17,64 @@ import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider; import java.util.List; +import static eu.midnightdust.motschen.rocks.RocksMain.sticksByType; import static eu.midnightdust.motschen.rocks.util.RegistryUtil.register; public class StickFeatures { public static ConfiguredFeature OAK_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.OakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.OakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.OakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature SPRUCE_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.SpruceStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.SpruceStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.SpruceStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1) + .add(sticksByType.get(WoodType.SPRUCE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.SPRUCE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.SPRUCE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1) .add(RocksMain.Pinecone.getDefaultState(), 1).build())) ); public static ConfiguredFeature BIRCH_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.BirchStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.BirchStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.BirchStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.BIRCH).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.BIRCH).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.BIRCH).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature ACACIA_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.AcaciaStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.AcaciaStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.AcaciaStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.ACACIA).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.ACACIA).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.ACACIA).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature JUNGLE_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.JungleStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.JungleStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.JungleStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.JUNGLE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.JUNGLE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.JUNGLE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature DARK_OAK_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.DarkOakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.DarkOakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.DarkOakStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.DARK_OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.DARK_OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.DARK_OAK).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature MANGROVE_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.MangroveStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.MangroveStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.MangroveStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.MANGROVE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.MANGROVE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.MANGROVE).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature CHERRY_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.CherryStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.CherryStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.CherryStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.CHERRY).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.CHERRY).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.CHERRY).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static ConfiguredFeature BAMBOO_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( new WeightedBlockStateProvider(DataPool.builder() - .add(RocksMain.BambooStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) - .add(RocksMain.BambooStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) - .add(RocksMain.BambooStick.getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) + .add(sticksByType.get(WoodType.BAMBOO).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.SMALL), 7) + .add(sticksByType.get(WoodType.BAMBOO).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.MEDIUM), 5) + .add(sticksByType.get(WoodType.BAMBOO).getDefaultState().with(RocksMain.STICK_VARIATION,StickVariation.LARGE), 1).build())) ); public static final List modifiers = List.of(CountPlacementModifier.of(3), RarityFilterPlacementModifier.of(1), SquarePlacementModifier.of(), PlacedFeatures.WORLD_SURFACE_WG_HEIGHTMAP, BiomePlacementModifier.of(), BlockFilterPlacementModifier.of(BlockPredicate.bothOf(BlockPredicate.IS_AIR, BlockPredicate.matchingBlocks(new Vec3i(0, -1, 0), ImmutableList.of(Blocks.GRASS_BLOCK, Blocks.MUD, Blocks.PODZOL))))); diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_arm.json new file mode 100644 index 0000000..c237692 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_arm.json @@ -0,0 +1,61 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "rocks:block/starfish_orange", + "particle": "rocks:block/starfish_orange" + }, + "elements": [ + { + "from": [7.5, 0, 8.5], + "to": [8.5, 1, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [9, 4, 10, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 9, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 0], "texture": "#0"}, + "down": {"uv": [6, 0, 5, 4], "texture": "#0"} + } + }, + { + "from": [7.75, 0.02, 8.5], + "to": [8.75, 1.02, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [8, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 8, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 1], "texture": "#0"}, + "down": {"uv": [6, 1, 5, 4], "texture": "#0"} + } + }, + { + "from": [7, -0.01, 8.5], + "to": [9, 0.99, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0, 8]}, + "faces": { + "north": {"uv": [3, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 3, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 7, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 3, 2], "texture": "#0"}, + "down": {"uv": [7, 2, 5, 4], "texture": "#0"} + } + }, + { + "from": [7.25, 0.01, 8.5], + "to": [8.25, 1.01, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [8, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 8, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 1], "texture": "#0"}, + "down": {"uv": [6, 1, 5, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_first_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_first_arm.json new file mode 100644 index 0000000..23dd2f8 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_first_arm.json @@ -0,0 +1,100 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "rocks:block/starfish_orange", + "particle": "rocks:block/starfish_orange" + }, + "elements": [ + { + "from": [7.5, 0, 8.5], + "to": [8.5, 1, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [0, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [9, 4, 10, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 9, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 0], "texture": "#0"}, + "down": {"uv": [6, 0, 5, 4], "texture": "#0"} + } + }, + { + "from": [7.75, 0.02, 8.5], + "to": [8.75, 1.02, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [8, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 8, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 1], "texture": "#0"}, + "down": {"uv": [6, 1, 5, 4], "texture": "#0"} + } + }, + { + "from": [7, -0.01, 8.5], + "to": [9, 0.99, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0, 8]}, + "faces": { + "north": {"uv": [3, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 3, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 7, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 3, 2], "texture": "#0"}, + "down": {"uv": [7, 2, 5, 4], "texture": "#0"} + } + }, + { + "from": [7.25, 0.01, 8.5], + "to": [8.25, 1.01, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [8, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 8, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 1], "texture": "#0"}, + "down": {"uv": [6, 1, 5, 4], "texture": "#0"} + } + }, + { + "from": [7, 0.005, 6.5], + "to": [9, 1.005, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 7]}, + "faces": { + "north": {"uv": [3, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 3, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 7, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 3, 2], "texture": "#0"}, + "down": {"uv": [7, 2, 5, 4], "texture": "#0"} + } + }, + { + "from": [6.8, 0, 6], + "to": [8.8, 1, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [3, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 3, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 9, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 7, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 3, 2], "texture": "#0"}, + "down": {"uv": [7, 2, 5, 4], "texture": "#0"} + } + }, + { + "from": [8.2, 0, 6.25], + "to": [9.2, 1, 8.25], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 5, 5], "texture": "#0"}, + "east": {"uv": [2, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 8, 5], "texture": "#0"}, + "west": {"uv": [5, 4, 7, 5], "texture": "#0"}, + "up": {"uv": [5, 4, 4, 2], "texture": "#0"}, + "down": {"uv": [6, 2, 5, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_arm.json new file mode 100755 index 0000000..b75b269 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_arm", + "textures": { + "0": "rocks:block/starfish_orange" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_first_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_first_arm.json new file mode 100755 index 0000000..430767f --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_orange_first_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_first_arm", + "textures": { + "0": "rocks:block/starfish_orange" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_arm.json new file mode 100755 index 0000000..728eb3e --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_arm", + "textures": { + "0": "rocks:block/starfish_pink" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_first_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_first_arm.json new file mode 100755 index 0000000..5511b9e --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_pink_first_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_first_arm", + "textures": { + "0": "rocks:block/starfish_pink" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_red_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_red_arm.json new file mode 100755 index 0000000..ad32d4c --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_red_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_arm", + "textures": { + "0": "rocks:block/starfish_red" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/block/starfish_red_first_arm.json b/src/main/resources/assets/polymer-rocks/models/block/starfish_red_first_arm.json new file mode 100755 index 0000000..d9df2a5 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/block/starfish_red_first_arm.json @@ -0,0 +1,6 @@ +{ + "parent": "polymer-rocks:block/starfish_first_arm", + "textures": { + "0": "rocks:block/starfish_red" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/polymer-rocks/models/item/orange_starfish.json b/src/main/resources/assets/polymer-rocks/models/item/orange_starfish.json new file mode 100755 index 0000000..d0ff271 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/item/orange_starfish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "polymer-rocks:item/starfish_orange" + } +} diff --git a/src/main/resources/assets/polymer-rocks/models/item/pink_starfish.json b/src/main/resources/assets/polymer-rocks/models/item/pink_starfish.json new file mode 100755 index 0000000..288783c --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/item/pink_starfish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "polymer-rocks:item/starfish_pink" + } +} diff --git a/src/main/resources/assets/polymer-rocks/models/item/red_starfish.json b/src/main/resources/assets/polymer-rocks/models/item/red_starfish.json new file mode 100755 index 0000000..f7be084 --- /dev/null +++ b/src/main/resources/assets/polymer-rocks/models/item/red_starfish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "polymer-rocks:item/starfish_red" + } +} diff --git a/src/main/resources/assets/polymer-rocks/textures/item/starfish_orange.png b/src/main/resources/assets/polymer-rocks/textures/item/starfish_orange.png new file mode 100644 index 0000000..05c0506 Binary files /dev/null and b/src/main/resources/assets/polymer-rocks/textures/item/starfish_orange.png differ diff --git a/src/main/resources/assets/polymer-rocks/textures/item/starfish_pink.png b/src/main/resources/assets/polymer-rocks/textures/item/starfish_pink.png new file mode 100644 index 0000000..3f07962 Binary files /dev/null and b/src/main/resources/assets/polymer-rocks/textures/item/starfish_pink.png differ diff --git a/src/main/resources/assets/polymer-rocks/textures/item/starfish_red.png b/src/main/resources/assets/polymer-rocks/textures/item/starfish_red.png new file mode 100755 index 0000000..ab1a061 Binary files /dev/null and b/src/main/resources/assets/polymer-rocks/textures/item/starfish_red.png differ