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

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