diff --git a/build.gradle b/build.gradle index bacbef81e..f2ef227ae 100644 --- a/build.gradle +++ b/build.gradle @@ -203,6 +203,7 @@ dependencies { // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") // implementation fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-1.16.5:0.10.0-Beta25") + // runtimeOnly fg.deobf("curse.maven:framedblocks-441647:4567924") // runtimeOnly fg.deobf("curse.maven:galosphere-631098:4398234") // runtimeOnly fg.deobf("curse.maven:elementary-ores-332609:3956498") // runtimeOnly fg.deobf("curse.maven:flib-661261:3956196") diff --git a/gradle.properties b/gradle.properties index 265020e1e..7af4f260f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ registrate_version = MC1.18.2-1.1.3 flywheel_minecraft_version = 1.18.2 flywheel_version = 0.6.10-105 jei_minecraft_version = 1.18.2 -jei_version = 9.7.0.209 +jei_version = 9.7.2.277 curios_minecraft_version = 1.18.2 curios_version = 5.0.7.0 diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c18d73ede..ac89b4d94 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -2,7 +2,6 @@ package com.simibubi.create; import static com.simibubi.create.AllTags.NameSpace.CURIOS; import static com.simibubi.create.AllTags.NameSpace.FORGE; -import static com.simibubi.create.AllTags.NameSpace.GS; import static com.simibubi.create.AllTags.NameSpace.MOD; import static com.simibubi.create.AllTags.NameSpace.QUARK; import static com.simibubi.create.AllTags.NameSpace.TIC; diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index 105256b58..2bbad51c9 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -6,6 +6,8 @@ import java.util.function.Supplier; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.ForgeRegistries; @@ -25,6 +27,7 @@ public enum Mods { SOPHISTICATEDSTORAGE, STORAGEDRAWERS, TCONSTRUCT, + FRAMEDBLOCKS, XLPACKETS, MODERNUI; @@ -48,6 +51,19 @@ public enum Mods { public Block getBlock(String id) { return ForgeRegistries.BLOCKS.getValue(rl(id)); } + + public Item getItem(String id) { + return ForgeRegistries.ITEMS.getValue(rl(id)); + } + + public boolean contains(ItemLike entry) { + if (!isLoaded()) + return false; + Item asItem = entry.asItem(); + return asItem != null && asItem.getRegistryName() + .getNamespace() + .equals(id); + } /** * @return a boolean of whether the mod is loaded or not based on mod id diff --git a/src/main/java/com/simibubi/create/compat/framedblocks/FramedBlocksInSchematics.java b/src/main/java/com/simibubi/create/compat/framedblocks/FramedBlocksInSchematics.java new file mode 100644 index 000000000..100a07e7e --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/framedblocks/FramedBlocksInSchematics.java @@ -0,0 +1,71 @@ +package com.simibubi.create.compat.framedblocks; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.compat.Mods; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; +import com.simibubi.create.content.schematics.requirement.ItemRequirement.StackRequirement; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class FramedBlocksInSchematics { + + static final List KEYS_TO_RETAIN = + List.of("intangible", "glowing", "reinforced", "camo_stack", "camo_stack_two", "camo_state", "camo_state_two"); + + public static CompoundTag prepareBlockEntityData(BlockState blockState, BlockEntity blockEntity) { + CompoundTag data = null; + if (blockEntity == null) + return data; + + data = blockEntity.saveWithFullMetadata(); + + List keysToRemove = new ArrayList<>(); + for (String key : data.getAllKeys()) + if (!KEYS_TO_RETAIN.contains(key)) + keysToRemove.add(key); + for (String key : keysToRemove) + data.remove(key); + + return data; + } + + public static ItemRequirement getRequiredItems(BlockState blockState, BlockEntity blockEntity) { + if (blockEntity == null) + return ItemRequirement.NONE; + + CompoundTag data = blockEntity.saveWithFullMetadata(); + List list = new ArrayList<>(); + + if (data.getBoolean("intangible")) + list.add(new StackRequirement(new ItemStack(Items.PHANTOM_MEMBRANE), ItemUseType.CONSUME)); + + if (data.getBoolean("glowing")) + list.add(new StackRequirement(new ItemStack(Items.GLOWSTONE_DUST), ItemUseType.CONSUME)); + + if (data.getBoolean("reinforced")) + list.add(new StackRequirement(new ItemStack(Mods.FRAMEDBLOCKS.getItem("framed_reinforcement")), + ItemUseType.CONSUME)); + + if (data.contains("camo_stack")) + addCamoStack(data.getCompound("camo_stack"), list); + + if (data.contains("camo_stack_two")) + addCamoStack(data.getCompound("camo_stack_two"), list); + + return new ItemRequirement(list); + } + + private static void addCamoStack(CompoundTag tag, List list) { + ItemStack itemStack = ItemStack.of(tag); + if (!itemStack.isEmpty()) + list.add(new StackRequirement(itemStack, ItemUseType.CONSUME)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index f42ad9a02..6ceabcd11 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -1077,7 +1077,7 @@ public abstract class Contraption { CompoundTag tag = block.nbt; if (blockEntity != null) - tag = NBTProcessors.process(blockEntity, tag, false); + tag = NBTProcessors.process(state, blockEntity, tag, false); if (blockEntity != null && tag != null) { tag.putInt("x", targetPos.getX()); tag.putInt("y", targetPos.getY()); diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java index cfff5ebed..acab3fa91 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java @@ -234,7 +234,7 @@ public abstract class ZapperItem extends Item implements CustomArmPoseItem { if (data != null && AllBlockTags.SAFE_NBT.matches(state)) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity != null) { - data = NBTProcessors.process(blockEntity, data, !player.isCreative()); + data = NBTProcessors.process(state, blockEntity, data, !player.isCreative()); if (data == null) return; data.putInt("x", pos.getX()); diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java index 131338652..71a73a253 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java @@ -35,7 +35,7 @@ public class SchematicProcessor extends StructureProcessor { if (info.nbt != null && info.state.hasBlockEntity()) { BlockEntity be = ((EntityBlock) info.state.getBlock()).newBlockEntity(info.pos, info.state); if (be != null) { - CompoundTag nbt = NBTProcessors.process(be, info.nbt, false); + CompoundTag nbt = NBTProcessors.process(info.state, be, info.nbt, false); if (nbt != info.nbt) return new StructureTemplate.StructureBlockInfo(info.pos, info.state, nbt); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index b2f86344c..0696509d1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -163,6 +163,8 @@ public class SchematicHandler { try { schematic.placeInWorld(w, pos, pos, placementSettings, w.getRandom(), Block.UPDATE_CLIENTS); + for (BlockEntity blockEntity : w.getBlockEntities()) + blockEntity.setLevel(w); } catch (Exception e) { Minecraft.getInstance().player.displayClientMessage(Lang.translate("schematic.error") .component(), false); diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java index eb2045b62..49ead1435 100644 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.simibubi.create.compat.framedblocks.FramedBlocksInSchematics; import com.simibubi.create.foundation.data.recipe.Mods; import com.simibubi.create.foundation.utility.NBTProcessors; @@ -70,7 +71,10 @@ public class ItemRequirement { if (be instanceof ISpecialBlockEntityItemRequirement specialBE) requirement = requirement.union(specialBE.getRequiredItems(state)); - + + if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) + requirement = requirement.union(FramedBlocksInSchematics.getRequiredItems(state, be)); + return requirement; } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/Mods.java b/src/main/java/com/simibubi/create/foundation/data/recipe/Mods.java index 9b8ecea24..5adcf9817 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/Mods.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/Mods.java @@ -1,10 +1,8 @@ package com.simibubi.create.foundation.data.recipe; import java.util.function.Consumer; -import java.util.function.Supplier; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.ItemLike; public enum Mods { diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 4d229b2a5..11a426e3f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -6,6 +6,8 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; +import com.simibubi.create.compat.Mods; +import com.simibubi.create.compat.framedblocks.FramedBlocksInSchematics; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; @@ -243,15 +245,18 @@ public class BlockHelper { CompoundTag data = null; if (blockEntity == null) return data; + if (AllBlockTags.SAFE_NBT.matches(blockState)) { data = blockEntity.saveWithFullMetadata(); - data = NBTProcessors.process(blockEntity, data, true); + } else if (blockEntity instanceof IPartialSafeNBT) { data = new CompoundTag(); ((IPartialSafeNBT) blockEntity).writeSafe(data); - data = NBTProcessors.process(blockEntity, data, true); - } - return data; + + } else if (Mods.FRAMEDBLOCKS.contains(blockState.getBlock())) + data = FramedBlocksInSchematics.prepareBlockEntityData(blockState, blockEntity); + + return NBTProcessors.process(blockState, blockEntity, data, true); } public static void placeSchematicBlock(Level world, BlockState state, BlockPos target, ItemStack stack, diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java index 971d0072a..f685969c9 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java @@ -13,11 +13,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.tags.BlockTags; import net.minecraft.world.item.EnchantedBookItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; public final class NBTProcessors { @@ -34,13 +36,6 @@ public final class NBTProcessors { } static { - addProcessor(BlockEntityType.SIGN, data -> { - for (int i = 0; i < 4; ++i) { - if (textComponentHasClickEvent(data.getString("Text" + (i + 1)))) - return null; - } - return data; - }); addProcessor(BlockEntityType.LECTERN, data -> { if (!data.contains("Book", Tag.TAG_COMPOUND)) return data; @@ -63,6 +58,14 @@ public final class NBTProcessors { addProcessor(AllBlockEntityTypes.CREATIVE_CRATE.get(), itemProcessor("Filter")); addProcessor(AllBlockEntityTypes.PLACARD.get(), itemProcessor("Item")); } + + // Triggered by block tag, not BE type + private static final UnaryOperator signProcessor = data -> { + for (int i = 0; i < 4; ++i) + if (textComponentHasClickEvent(data.getString("Text" + (i + 1)))) + return null; + return data; + }; public static UnaryOperator itemProcessor(String tagKey) { return data -> { @@ -117,7 +120,7 @@ public final class NBTProcessors { private NBTProcessors() {} @Nullable - public static CompoundTag process(BlockEntity blockEntity, CompoundTag compound, boolean survival) { + public static CompoundTag process(BlockState blockState, BlockEntity blockEntity, CompoundTag compound, boolean survival) { if (compound == null) return null; BlockEntityType type = blockEntity.getType(); @@ -129,6 +132,8 @@ public final class NBTProcessors { .apply(compound); if (blockEntity instanceof SpawnerBlockEntity) return compound; + if (blockState.is(BlockTags.SIGNS)) + return signProcessor.apply(compound); if (blockEntity.onlyOpCanSetNbt()) return null; return compound;