mirror of
https://github.com/TeamMidnightDust/ThisRocks.git
synced 2025-12-17 11:25:10 +01:00
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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();}
|
||||
}
|
||||
Reference in New Issue
Block a user