Official Polymer compatibility

- Based on my PolymerRocks compatibility patch, featuring many improvements over it
- Less hardcoded object instances, allowing for easier addition of new variations
This commit is contained in:
Martin Prokoph
2024-09-16 18:49:17 +02:00
parent 5bbfc74a48
commit 8e2fc41b99
54 changed files with 1434 additions and 225 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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));

View File

@@ -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<ServerPlayerEntity> playersWithMod = new ArrayList<>();
public static final EnumProperty<RockVariation> ROCK_VARIATION = EnumProperty.of("variation", RockVariation.class);
public static final EnumProperty<StickVariation> STICK_VARIATION = EnumProperty.of("variation", StickVariation.class);
public static final EnumProperty<SeashellVariation> SEASHELL_VARIATION = EnumProperty.of("variation", SeashellVariation.class);
public static final EnumProperty<StarfishVariation> 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<RockType, Rock> rocksByType = new HashMap<>();
public static Map<WoodType, Stick> sticksByType = new HashMap<>();
public static Map<RockType, Item> 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<ItemStack> groupItems = new ArrayList<>();
public static ItemGroup RocksGroup;
public static final RegistryKey<ItemGroup> 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);
}
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<OverworldGeyserBlockEntity> OVERWORLD_GEYSER_BE;
public static BlockEntityType<NetherGeyserBlockEntity> 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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<RockType, ItemStack[]> 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()];
}
}

View File

@@ -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;
};
}
}

View File

@@ -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<ItemDisplayElement> 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;
};
}
}

View File

@@ -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<WoodType, ItemStack[]> 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()];
}
}

View File

@@ -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];
}
}

View File

@@ -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];
}
}

View File

@@ -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];
}
}

View File

@@ -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];
}
}

View File

@@ -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;
}

View File

@@ -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 <T extends Block & PolymerBlock> 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);
}
}

View File

@@ -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 <a href="https://github.com/CottonMC/ModelsUnlocked/blob/master/src/main/java/io/github/cottonmc/modelsunlocked/mixin/ModelElementDeserializerMixin.java">ModelsUnlocked</a>
*/
@Overwrite
private float deserializeRotationAngle(JsonObject json) {

View File

@@ -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<HelloPayload> PACKET_ID = new CustomPayload.Id<>(hello);
public static final PacketCodec<RegistryByteBuf, HelloPayload> codec = PacketCodec.of(HelloPayload::write, HelloPayload::read);
public static HelloPayload read(RegistryByteBuf buf) {
return new HelloPayload();
}
public void write(RegistryByteBuf buf) {}
@Override
public Id<? extends CustomPayload> getId() {
return PACKET_ID;
}
}

View File

@@ -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 extends Block> 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<ConfiguredFeature<?, ?>> context, String name, ConfiguredFeature<?, ?> feature) {
context.register(RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, Identifier.of(RocksMain.MOD_ID, name)), feature);

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<ElementHolder> 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();}
}

View File

@@ -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 <C extends FeatureConfig, F extends Feature<C>> F register(String name, F feature) {
return Registry.register(Registries.FEATURE, name, feature);
}

View File

@@ -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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>builder().add(RocksMain.NetherGeyser.getDefaultState(), 1)))
);
public static ConfiguredFeature<?, ?> WARPED_STICK_FEATURE = new ConfiguredFeature<>(Feature.SIMPLE_BLOCK,new SimpleBlockFeatureConfig(
new WeightedBlockStateProvider(DataPool.<BlockState>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.<BlockState>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))))));

View File

@@ -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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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)))))));

View File

@@ -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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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.<BlockState>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<PlacementModifier> 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)))));

View File

@@ -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"}
}
}
]
}

View File

@@ -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"}
}
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_arm",
"textures": {
"0": "rocks:block/starfish_orange"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_first_arm",
"textures": {
"0": "rocks:block/starfish_orange"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_arm",
"textures": {
"0": "rocks:block/starfish_pink"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_first_arm",
"textures": {
"0": "rocks:block/starfish_pink"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_arm",
"textures": {
"0": "rocks:block/starfish_red"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "polymer-rocks:block/starfish_first_arm",
"textures": {
"0": "rocks:block/starfish_red"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "polymer-rocks:item/starfish_orange"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "polymer-rocks:item/starfish_pink"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "polymer-rocks:item/starfish_red"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B