diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 7713a1e97a..749aa9cf76 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -17,7 +17,6 @@ import static com.simibubi.create.foundation.data.TagGen.tagBlockAndItem; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; -import com.simibubi.create.api.contraption.train.TrainConductorHandler; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsBlock; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovingInteraction; @@ -289,6 +288,7 @@ import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.UncontainableBlockItem; import com.simibubi.create.foundation.utility.ColorHandlers; import com.simibubi.create.foundation.utility.DyeHelper; +import com.simibubi.create.impl.contraption.train.TrainConductorHandlerImpl; import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.DataIngredient; @@ -768,7 +768,7 @@ public class AllBlocks { .loot((lt, block) -> lt.add(block, BlazeBurnerBlock.buildLootTable())) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .onRegister(movementBehaviour(new BlazeBurnerMovementBehaviour())) - .onRegister(TrainConductorHandler::registerBlazeBurner) + .onRegister(block -> TrainConductorHandlerImpl.registerBlazeBurner()) .item(BlazeBurnerBlockItem::withBlaze) .model(AssetLookup.customBlockItemModel("blaze_burner", "block_with_blaze")) .build() diff --git a/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java b/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java index ea84d580f3..757466f1cd 100644 --- a/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java +++ b/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java @@ -1,16 +1,11 @@ package com.simibubi.create.api.contraption.train; -import java.util.ArrayList; -import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; -import org.jetbrains.annotations.ApiStatus; - -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllInteractionBehaviours; -import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.burner.BlockBasedTrainConductorInteractionBehaviour; +import com.simibubi.create.impl.contraption.train.TrainConductorHandlerImpl; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -21,13 +16,10 @@ import net.minecraft.world.level.block.state.BlockState; */ @FunctionalInterface public interface TrainConductorHandler { - @ApiStatus.Internal - List CONDUCTOR_HANDLERS = new ArrayList<>(); - boolean isValidConductor(BlockState state); private static void registerHandler(TrainConductorHandler handler) { - CONDUCTOR_HANDLERS.add(handler); + TrainConductorHandlerImpl.CONDUCTOR_HANDLERS.add(handler); } static void registerConductor(Block block, Predicate isValidConductor, UpdateScheduleCallback updateScheduleCallback) { @@ -36,13 +28,6 @@ public interface TrainConductorHandler { registerHandler(isValidConductor::test); } - @ApiStatus.Internal - static void registerBlazeBurner(Block block) { - registerConductor(block, blockState -> AllBlocks.BLAZE_BURNER.has(blockState) - && blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) != BlazeBurnerBlock.HeatLevel.NONE, UpdateScheduleCallback.EMPTY); - } - - @FunctionalInterface interface UpdateScheduleCallback { UpdateScheduleCallback EMPTY = (hasSchedule, blockState, blockStateSetter) -> {}; diff --git a/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java b/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java deleted file mode 100644 index 59ca6fadc8..0000000000 --- a/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.api.contraption.transformable; - -import com.simibubi.create.content.contraptions.StructureTransform; - -public interface ITransformableBlockEntity { - void transform(StructureTransform transform); -} diff --git a/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java b/src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlock.java similarity index 81% rename from src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java rename to src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlock.java index 5bdcdf1b0a..15d7d5fa26 100644 --- a/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java +++ b/src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlock.java @@ -4,6 +4,7 @@ import com.simibubi.create.content.contraptions.StructureTransform; import net.minecraft.world.level.block.state.BlockState; -public interface ITransformableBlock { +@FunctionalInterface +public interface TransformableBlock { BlockState transform(BlockState state, StructureTransform transform); } diff --git a/src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlockEntity.java b/src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlockEntity.java new file mode 100644 index 0000000000..d7182381b4 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/transformable/TransformableBlockEntity.java @@ -0,0 +1,9 @@ +package com.simibubi.create.api.contraption.transformable; + +import com.simibubi.create.content.contraptions.StructureTransform; + +import net.minecraft.world.level.block.entity.BlockEntity; + +public interface TransformableBlockEntity { + void transform(BlockEntity blockEntity, StructureTransform transform); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java b/src/main/java/com/simibubi/create/api/schematic/nbt/PartialSafeNBT.java similarity index 84% rename from src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java rename to src/main/java/com/simibubi/create/api/schematic/nbt/PartialSafeNBT.java index 2cd7948168..95d2c928e8 100644 --- a/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java +++ b/src/main/java/com/simibubi/create/api/schematic/nbt/PartialSafeNBT.java @@ -2,7 +2,7 @@ package com.simibubi.create.api.schematic.nbt; import net.minecraft.nbt.CompoundTag; -public interface IPartialSafeNBT { +public interface PartialSafeNBT { /** * This will always be called from the logical server */ diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockEntityItemRequirement.java similarity index 81% rename from src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java rename to src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockEntityItemRequirement.java index de6e29561b..9d8764d012 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockEntityItemRequirement.java @@ -4,6 +4,6 @@ import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.world.level.block.state.BlockState; -public interface ISpecialBlockEntityItemRequirement { +public interface SpecialBlockEntityItemRequirement { ItemRequirement getRequiredItems(BlockState state); } diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockItemRequirement.java similarity index 58% rename from src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java rename to src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockItemRequirement.java index dc89bd0f49..39ca485dfb 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialBlockItemRequirement.java @@ -1,10 +1,12 @@ package com.simibubi.create.api.schematic.requirement; +import org.jetbrains.annotations.Nullable; + import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -public interface ISpecialBlockItemRequirement { - ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity); +public interface SpecialBlockItemRequirement { + ItemRequirement getRequiredItems(BlockState state, @Nullable BlockEntity blockEntity); } diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialEntityItemRequirement.java similarity index 77% rename from src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java rename to src/main/java/com/simibubi/create/api/schematic/requirement/SpecialEntityItemRequirement.java index 38bb16f779..9623dd4147 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SpecialEntityItemRequirement.java @@ -2,6 +2,6 @@ package com.simibubi.create.api.schematic.requirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; -public interface ISpecialEntityItemRequirement { +public interface SpecialEntityItemRequirement { ItemRequirement getRequiredItems(); } diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index a34ab7b913..37418fe6a7 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -20,7 +20,6 @@ public enum Mods { AETHER, BETTEREND, COMPUTERCRAFT, - CONNECTIVITY, CURIOS, DYNAMICTREES, FUNCTIONALSTORAGE, diff --git a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java index a1285a3d9f..1234313176 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java @@ -9,6 +9,7 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import dev.ftb.mods.ftbchunks.client.gui.LargeMapScreen; import dev.ftb.mods.ftbchunks.client.gui.RegionMapPanel; +import dev.ftb.mods.ftblibrary.ui.BaseScreen; import dev.ftb.mods.ftblibrary.ui.ScreenWrapper; import dev.ftb.mods.ftblibrary.ui.Widget; import net.minecraft.client.Minecraft; @@ -152,7 +153,7 @@ public class FTBChunksTrainMap { private static LargeMapScreen getAsLargeMapScreen(Screen screen) { if (!(screen instanceof ScreenWrapper screenWrapper)) return null; - Object wrapped = ObfuscationReflectionHelper.getPrivateValue(ScreenWrapper.class, screenWrapper, "wrappedGui"); + BaseScreen wrapped = screenWrapper.getGui(); if (!(wrapped instanceof LargeMapScreen largeMapScreen)) return null; return largeMapScreen; diff --git a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java index aed5425cd6..d29961056b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java @@ -18,13 +18,13 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceMovement; import com.simibubi.create.content.contraptions.actors.seat.SeatBlock; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.contraptions.actors.trainControls.ControlsStopControllingPacket; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; +import com.simibubi.create.content.contraptions.data.ContraptionSyncLimiting; import com.simibubi.create.content.contraptions.elevator.ElevatorContraption; import com.simibubi.create.content.contraptions.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.mounted.MountedContraption; @@ -615,11 +615,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit CompoundTag compound = new CompoundTag(); writeAdditional(compound, true); - if (ContraptionData.isTooLargeForSync(compound)) { - String info = getContraption().getType().id + " @" + position() + " (" + getStringUUID() + ")"; - Create.LOGGER.warn("Could not send Contraption Spawn Data (Packet too big): " + info); - compound = null; - } + if (ContraptionSyncLimiting.isTooLargeForSync(compound)) + compound = null; // don't sync contraption data buffer.writeNbt(compound); } 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 9879b73980..60b0735b08 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -91,6 +91,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.network.protocol.game.DebugPackets; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.village.poi.PoiTypes; @@ -106,6 +107,7 @@ import net.minecraft.world.level.block.PressurePlateBlock; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.ChestType; @@ -138,6 +140,7 @@ public abstract class Contraption { public boolean disassembled; protected Map blocks; + protected Map updateTags; protected List> actors; protected Map interactors; protected List disabledActors; @@ -165,6 +168,7 @@ public abstract class Contraption { public Contraption() { blocks = new HashMap<>(); + updateTags = new HashMap<>(); seats = new ArrayList<>(); actors = new ArrayList<>(); disabledActors = new ArrayList<>(); @@ -645,6 +649,15 @@ public abstract class Contraption { bounds = bounds.minmax(new AABB(localPos)); BlockEntity be = pair.getValue(); + + if (be != null) { + CompoundTag updateTag = be.getUpdateTag(); + // the ID needs to be in the tag so the client can properly add the BlockEntity + ResourceLocation id = Objects.requireNonNull(BlockEntityType.getKey(be.getType())); + updateTag.putString("id", id.toString()); + updateTags.put(localPos, updateTag); + } + storage.addBlock(level, state, pos, localPos, be); captureMultiblock(localPos, structureBlockInfo, be); @@ -787,7 +800,7 @@ public abstract class Contraption { CompoundTag nbt = new CompoundTag(); nbt.putString("Type", getType().id); - CompoundTag blocksNBT = writeBlocksCompound(); + CompoundTag blocksNBT = writeBlocksCompound(spawnPacket); ListTag multiblocksNBT = new ListTag(); capturedMultiblocks.keySet().forEach(controllerPos -> { @@ -824,7 +837,7 @@ public abstract class Contraption { superglueNBT.add(c); } } - + writeStorage(nbt, spawnPacket); ListTag interactorNBT = new ListTag(); @@ -867,12 +880,12 @@ public abstract class Contraption { return nbt; } - + public void writeStorage(CompoundTag nbt, boolean spawnPacket) { storage.write(nbt, spawnPacket); } - private CompoundTag writeBlocksCompound() { + private CompoundTag writeBlocksCompound(boolean spawnPacket) { CompoundTag compound = new CompoundTag(); HashMapPalette palette = new HashMapPalette<>(GameData.getBlockStateIDMap(), 16, (i, s) -> { throw new IllegalStateException("Palette Map index exceeded maximum"); @@ -881,11 +894,30 @@ public abstract class Contraption { for (StructureBlockInfo block : this.blocks.values()) { int id = palette.idFor(block.state()); + BlockPos pos = block.pos(); CompoundTag c = new CompoundTag(); - c.putLong("Pos", block.pos().asLong()); + c.putLong("Pos", pos.asLong()); c.putInt("State", id); - if (block.nbt() != null) - c.put("Data", block.nbt()); + + CompoundTag updateTag = updateTags.get(pos); + if (spawnPacket) { + // for client sync, treat the updateTag as the data + if (updateTag != null) { + c.put("Data", updateTag); + } + // legacy: use full data if update tag is not available + if (updateTag == null && block.nbt() != null) { + c.put("Data", block.nbt()); + } + } else { + // otherwise, write actual data as the data, save updateTag on its own + if (block.nbt() != null) { + c.put("Data", block.nbt()); + } + if (updateTag != null) { + c.put("UpdateTag", updateTag); + } + } blockList.add(c); } @@ -928,6 +960,13 @@ public abstract class Contraption { this.blocks.put(info.pos(), info); + if (c.contains("UpdateTag", Tag.TAG_COMPOUND)) { + CompoundTag updateTag = c.getCompound("UpdateTag"); + if (!updateTag.isEmpty()) { + this.updateTags.put(info.pos(), updateTag); + } + } + if (!world.isClientSide) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/ContraptionData.java b/src/main/java/com/simibubi/create/content/contraptions/ContraptionData.java deleted file mode 100644 index 158d306a76..0000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/ContraptionData.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.simibubi.create.content.contraptions; - -import com.simibubi.create.compat.Mods; -import com.simibubi.create.foundation.mixin.accessor.NbtAccounterAccessor; -import com.simibubi.create.infrastructure.config.AllConfigs; - -import io.netty.buffer.Unpooled; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtAccounter; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; - -public class ContraptionData { - /** - * A sane, default maximum for contraption data size. - */ - public static final int DEFAULT_LIMIT = 2_000_000; - /** - * Connectivity expands the NBT packet limit to 2 GB. - */ - public static final int CONNECTIVITY_LIMIT = Integer.MAX_VALUE; - /** - * Packet Fixer expands the NBT packet limit to 200 MB. - */ - public static final int PACKET_FIXER_LIMIT = 209_715_200; - /** - * XL Packets expands the NBT packet limit to 2 GB. - */ - public static final int XL_PACKETS_LIMIT = 2_000_000_000; - /** - * Minecart item sizes are limited by the vanilla slot change packet ({@link ClientboundContainerSetSlotPacket}). - * {@link #DEFAULT_LIMIT} is used as the default. - * Connectivity, PacketFixer, and XL Packets expand the size limit. - * If one of these mods is loaded, we take advantage of it and use the higher limit. - */ - public static final int PICKUP_LIMIT; - - static { - int limit = DEFAULT_LIMIT; - - // Check from largest to smallest to use the smallest limit if multiple mods are loaded. - // It is necessary to use the smallest limit because even if multiple mods are loaded, - // not all of their mixins may be applied. Therefore, it is safest to only assume that - // the mod with the smallest limit is actually active. - if (Mods.CONNECTIVITY.isLoaded()) { - limit = CONNECTIVITY_LIMIT; - } - if (Mods.XLPACKETS.isLoaded()) { - limit = XL_PACKETS_LIMIT; - } - if (Mods.PACKETFIXER.isLoaded()) { - limit = PACKET_FIXER_LIMIT; - } - - PICKUP_LIMIT = limit; - } - - /** - * @return true if the given NBT is too large for a contraption to be synced to clients. - */ - public static boolean isTooLargeForSync(CompoundTag data) { - int max = AllConfigs.server().kinetics.maxDataSize.get(); - return max != 0 && packetSize(data) > max; - } - - /** - * @return true if the given NBT is too large for a contraption to be picked up with a wrench. - */ - public static boolean isTooLargeForPickup(CompoundTag data) { - return packetSize(data) > PICKUP_LIMIT; - } - - /** - * @return the size of the given NBT when put through a packet, in bytes. - */ - public static long packetSize(CompoundTag data) { - FriendlyByteBuf test = new FriendlyByteBuf(Unpooled.buffer()); - test.writeNbt(data); - NbtAccounter sizeTracker = new NbtAccounter(Long.MAX_VALUE); - test.readNbt(sizeTracker); - long size = ((NbtAccounterAccessor) sizeTracker).create$getUsage(); - test.release(); - return size; - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java index 37e2684413..5645c099c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java @@ -4,8 +4,8 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.api.contraption.transformable.MovedBlockTransformerRegistries; import com.simibubi.create.api.contraption.transformable.MovedBlockTransformerRegistries.BlockEntityTransformer; import com.simibubi.create.api.contraption.transformable.MovedBlockTransformerRegistries.BlockTransformer; @@ -137,7 +137,7 @@ public class StructureTransform { BlockEntityTransformer transformer = MovedBlockTransformerRegistries.BLOCK_ENTITY_TRANSFORMERS.get(be.getType()); if (transformer != null) { transformer.transform(be, this); - } else if (be instanceof ITransformableBlockEntity itbe) { + } else if (be instanceof TransformableBlockEntity itbe) { itbe.transform(this); } } @@ -152,7 +152,7 @@ public class StructureTransform { BlockTransformer transformer = MovedBlockTransformerRegistries.BLOCK_TRANSFORMERS.get(block); if (transformer != null) { return transformer.transform(block, state, this); - } else if (block instanceof ITransformableBlock transformable) { + } else if (block instanceof TransformableBlock transformable) { return transformable.transform(state, this); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java index eee7c7cd2a..98233bebec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.chassis; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; @@ -29,7 +29,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.Tags; -public abstract class AbstractChassisBlock extends RotatedPillarBlock implements IWrenchable, IBE, ITransformableBlock { +public abstract class AbstractChassisBlock extends RotatedPillarBlock implements IWrenchable, IBE, TransformableBlock { public AbstractChassisBlock(Properties properties) { super(properties); diff --git a/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionPickupLimiting.java b/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionPickupLimiting.java new file mode 100644 index 0000000000..a862e443d4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionPickupLimiting.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.contraptions.data; + +import com.simibubi.create.compat.Mods; +import com.simibubi.create.foundation.mixin.accessor.NbtAccounterAccessor; + +import io.netty.buffer.Unpooled; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.network.FriendlyByteBuf; + +public class ContraptionPickupLimiting { + /// The default NBT limit, defined by {@link FriendlyByteBuf#readNbt()}. + public static final int NBT_LIMIT = 2_097_152; + + // increased nbt limits provided by other mods. + public static final int PACKET_FIXER_LIMIT = NBT_LIMIT * 100; + public static final int XL_PACKETS_LIMIT = Integer.MAX_VALUE; + + // leave some space for the rest of the packet. + public static final int BUFFER = 20_000; + + // the actual limit to be used + public static final int LIMIT = Util.make(() -> { + // the smallest limit needs to be used, as we can't guarantee that all mixins are applied if multiple are present. + if (Mods.PACKETFIXER.isLoaded()) { + return PACKET_FIXER_LIMIT; + } else if (Mods.XLPACKETS.isLoaded()) { + return XL_PACKETS_LIMIT; + } + + // none are present, use vanilla default + return NBT_LIMIT; + }) - BUFFER; + + /** + * @return true if the given NBT is too large for a contraption to be picked up with a wrench. + */ + public static boolean isTooLargeForPickup(CompoundTag data) { + return nbtSize(data) > LIMIT; + } + + /** + * @return the size of the given NBT when read by the client according to {@link NbtAccounter} + */ + private static long nbtSize(CompoundTag data) { + FriendlyByteBuf test = new FriendlyByteBuf(Unpooled.buffer()); + test.writeNbt(data); + NbtAccounter sizeTracker = new NbtAccounter(Long.MAX_VALUE); + test.readNbt(sizeTracker); + long size = ((NbtAccounterAccessor) sizeTracker).create$getUsage(); + test.release(); + return size; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionSyncLimiting.java b/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionSyncLimiting.java new file mode 100644 index 0000000000..372a30a529 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/data/ContraptionSyncLimiting.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.contraptions.data; + +import com.simibubi.create.compat.Mods; + +import io.netty.buffer.Unpooled; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; + +public class ContraptionSyncLimiting { + /** + * Contraption entity sync is limited by the clientbound custom payload limit, since that's what Forge's + * extended spawn packet uses. The NBT limit is irrelevant since it's bypassed on deserialization. + */ + public static final int SIZE_LIMIT = 1_048_576; + + // increased packet limits provided by other mods. + public static final int PACKET_FIXER_LIMIT = SIZE_LIMIT * 100; + public static final int XL_PACKETS_LIMIT = Integer.MAX_VALUE; + + // leave some room for the rest of the packet. + public static final int BUFFER = 20_000; + + // the actual limit to be used + public static final int LIMIT = Util.make(() -> { + // the smallest limit needs to be used, as we can't guarantee that all mixins are applied if multiple are present. + if (Mods.PACKETFIXER.isLoaded()) { + return PACKET_FIXER_LIMIT; + } else if (Mods.XLPACKETS.isLoaded()) { + return XL_PACKETS_LIMIT; + } + + // none are present, use vanilla default + return SIZE_LIMIT; + }) - BUFFER; + + /** + * @return true if the given NBT is too large for a contraption to be synced to clients. + */ + public static boolean isTooLargeForSync(CompoundTag data) { + return byteSize(data) > LIMIT; + } + + /** + * @return the size of the given NBT when encoded, in bytes + */ + private static long byteSize(CompoundTag data) { + FriendlyByteBuf test = new FriendlyByteBuf(Unpooled.buffer()); + test.writeNbt(data); + return test.writerIndex(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/data/README.md b/src/main/java/com/simibubi/create/content/contraptions/data/README.md new file mode 100644 index 0000000000..7bae5dbf77 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/data/README.md @@ -0,0 +1,37 @@ +# Data Limiting +This pair of classes prevents clients from getting chunkbanned when contraptions are too large. + +This information is up-to-date as of 1.20.1. + +There's a few different packet limits in play: +- the NBT limit: `2_097_152`, enforced by `FriendlyByteBuf.readNbt()` +- the clientbound custom payload limit: `1_048_576` bytes, applies to `ClientboundCustomPayloadPacket` +- the serverbound custom payload limit: `32767` bytes, applies to `ServerboundCustomPayloadPacket` +- the packet limit: `8_388_608` bytes, applies to all packets + +# NBT Size vs Bytes +There's two units in play as well - NBT Size and Bytes. The NBT limit uses NBT size, while the other +three use bytes. I'm (TropheusJ) not sure what exactly an NBT Size unit is - it's not bits, but it's +close. + +Because of this discrepancy, the NBT limit is actually much lower than it seems. It will usually be +the first limit hit. + +Bytes are found by writing a tag to a buffer and getting its `writerIndex`. NBT Size is found using +an `NbtAccounter`. + +# Sync +Sync is pretty straightforward. + +The only limit relevant here is the clientbound custom payload limit. The NBT limit would be relevant, but +client-side deserialization bypasses it. + +Sync is much less of an issue compared to pickup, since a lot of data can be skipped when syncing. + +# Pickup +Two limits are relevant for pickup: the NBT limit and the packet limit. + +The NBT limit is hit way sooner, and is usually the limiting factor. Other mods may increase it, in +which case the packet limit may become relevant. + +The custom payload limit is not relevant since item sync goes through the vanilla `ClientboundContainerSetSlotPacket`. diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java index cc9696235e..fefdfe9b2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java @@ -1,16 +1,21 @@ package com.simibubi.create.content.contraptions.elevator; +import java.util.Optional; + +import javax.annotation.Nullable; + import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.contraptions.elevator.ElevatorColumn.ColumnCoords; import com.simibubi.create.content.redstone.contact.RedstoneContactBlock; import com.simibubi.create.content.redstone.diodes.BrassDiodeBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.utility.BlockHelper; + import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -35,15 +40,13 @@ import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import javax.annotation.Nullable; -import java.util.Optional; - public class ElevatorContactBlock extends WrenchableDirectionalBlock - implements IBE, ISpecialBlockItemRequirement { + implements IBE, SpecialBlockItemRequirement { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty CALLING = BooleanProperty.create("calling"); diff --git a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java index cb6f965462..398d80f501 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialEntityItemRequirement; import com.simibubi.create.content.contraptions.BlockMovementChecks; import com.simibubi.create.content.contraptions.bearing.BearingBlock; import com.simibubi.create.content.contraptions.chassis.AbstractChassisBlock; @@ -56,7 +56,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.network.NetworkHooks; -public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement { +public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, SpecialEntityItemRequirement { public static AABB span(BlockPos startPos, BlockPos endPos) { return new AABB(startPos, endPos).expandTowards(1, 1, 1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java index 4d03db03a3..4da7853779 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java @@ -1,14 +1,21 @@ package com.simibubi.create.content.contraptions.mounted; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.redstone.rail.ControllerRailBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -52,13 +59,8 @@ import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - public class CartAssemblerBlock extends BaseRailBlock - implements IBE, IWrenchable, ISpecialBlockItemRequirement { + implements IBE, IWrenchable, SpecialBlockItemRequirement { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty BACKWARDS = BooleanProperty.create("backwards"); diff --git a/src/main/java/com/simibubi/create/content/contraptions/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/mounted/MinecartContraptionItem.java index dd146961cd..94839ce8e1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/mounted/MinecartContraptionItem.java @@ -10,11 +10,11 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.contraptions.ContraptionData; import com.simibubi.create.content.contraptions.ContraptionMovementSetting; import com.simibubi.create.content.contraptions.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceMovement; import com.simibubi.create.content.contraptions.behaviour.MovementContext; +import com.simibubi.create.content.contraptions.data.ContraptionPickupLimiting; import com.simibubi.create.content.kinetics.deployer.DeployerFakePlayer; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.utility.CreateLang; @@ -249,7 +249,7 @@ public class MinecartContraptionItem extends Item { ItemStack generatedStack = create(type, oce).setHoverName(entity.getCustomName()); - if (ContraptionData.isTooLargeForPickup(generatedStack.serializeNBT())) { + if (ContraptionPickupLimiting.isTooLargeForPickup(generatedStack.serializeNBT())) { MutableComponent message = CreateLang.translateDirect("contraption.minecart_contraption_too_big") .withStyle(ChatFormatting.RED); player.displayClientMessage(message, true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index e4da0aa611..dc776d2266 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -173,7 +173,8 @@ public class RadialWrenchMenu extends AbstractSimiScreen { @Override public void tick() { ticksOpen++; - + if (!level.getBlockState(pos).is(state.getBlock())) + Minecraft.getInstance().setScreen(null); super.tick(); } @@ -184,8 +185,6 @@ public class RadialWrenchMenu extends AbstractSimiScreen { PoseStack ms = graphics.pose(); - LocalPlayer player = Minecraft.getInstance().player; - ms.pushPose(); ms.translate(x, y, 0); @@ -271,6 +270,8 @@ public class RadialWrenchMenu extends AbstractSimiScreen { .translateY(-(sectorWidth / 2f + innerRadius)) .rotateZDegrees(-i * sectorAngle); + poseStack.translate(0, 0, 100); + try { GuiGameElement.of(blockState, blockEntity) .rotateBlock(player.getXRot(), player.getYRot() + 180, 0f) diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java index a8c98a9cc0..3655256d4a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java @@ -40,6 +40,9 @@ public class RadialWrenchMenuSubmitPacket extends SimplePacketBase { ServerPlayer player = context.getSender(); Level level = player.level(); + if (!level.getBlockState(blockPos).is(newState.getBlock())) + return; + BlockState updatedState = Block.updateFromNeighbourShapes(newState, level, blockPos); KineticBlockEntity.switchToBlockState(level, blockPos, updatedState); diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java index 8ce129e90c..36136044d3 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.decoration.copycat; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; -import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; +import com.simibubi.create.api.schematic.nbt.PartialSafeNBT; +import com.simibubi.create.api.schematic.requirement.SpecialBlockEntityItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; import com.simibubi.create.content.schematics.requirement.ItemRequirement; @@ -20,6 +20,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -28,7 +29,7 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.items.ItemHandlerHelper; public class CopycatBlockEntity extends SmartBlockEntity - implements ISpecialBlockEntityItemRequirement, ITransformableBlockEntity, IPartialSafeNBT { + implements SpecialBlockEntityItemRequirement, TransformableBlockEntity, PartialSafeNBT { private BlockState material; private ItemStack consumedItem; @@ -128,7 +129,7 @@ public class CopycatBlockEntity extends SmartBlockEntity } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { material = transform.apply(material); notifyUpdate(); } diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java index 6b04d80e81..6f9bd783ae 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java @@ -5,10 +5,10 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; @@ -37,7 +37,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; public class GirderEncasedShaftBlock extends HorizontalAxisKineticBlock - implements IBE, SimpleWaterloggedBlock, IWrenchable, ISpecialBlockItemRequirement { + implements IBE, SimpleWaterloggedBlock, IWrenchable, SpecialBlockItemRequirement { public static final BooleanProperty TOP = GirderBlock.TOP; public static final BooleanProperty BOTTOM = GirderBlock.BOTTOM; diff --git a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java index d19809b56b..161fc06940 100644 --- a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java @@ -6,10 +6,10 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; @@ -41,10 +41,11 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.items.ItemHandlerHelper; public class PlacardBlock extends FaceAttachedHorizontalDirectionalBlock - implements ProperWaterloggedBlock, IBE, ISpecialBlockItemRequirement, IWrenchable { + implements ProperWaterloggedBlock, IBE, SpecialBlockItemRequirement, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index f50551dc9f..1ecd71e649 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -6,8 +6,8 @@ import java.util.Optional; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllShapes; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; @@ -46,9 +46,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.common.util.FakePlayer; -public class BacktankBlock extends HorizontalKineticBlock implements IBE, SimpleWaterloggedBlock, ISpecialBlockItemRequirement { +public class BacktankBlock extends HorizontalKineticBlock implements IBE, SimpleWaterloggedBlock, SpecialBlockItemRequirement { public BacktankBlock(Properties properties) { super(properties); diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java index f54ec39320..25ea995073 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java @@ -12,8 +12,8 @@ import org.apache.commons.lang3.Validate; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.Create; +import com.simibubi.create.api.schematic.requirement.SpecialEntityItemRequirement; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.ISyncPersistentData; @@ -59,6 +59,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeHooks; @@ -72,7 +73,7 @@ import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.network.NetworkHooks; public class BlueprintEntity extends HangingEntity - implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement, ISyncPersistentData, IInteractionChecker { + implements IEntityAdditionalSpawnData, SpecialEntityItemRequirement, ISyncPersistentData, IInteractionChecker { protected int size; protected Direction verticalOrientation; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java index b3ed1bc109..8c577ad4b1 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java @@ -12,13 +12,13 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.fluids.FluidPropagator; import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; @@ -51,7 +51,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.ticks.TickPriority; public class EncasedPipeBlock extends Block - implements IWrenchable, ISpecialBlockItemRequirement, IBE, EncasedBlock, ITransformableBlock { + implements IWrenchable, SpecialBlockItemRequirement, IBE, EncasedBlock, TransformableBlock { public static final Map FACING_TO_PROPERTY_MAP = PipeBlock.PROPERTY_BY_DIRECTION; private final Supplier casing; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java index 8c3cf43958..d7997a42f4 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.decoration.encasing.EncasableBlock; @@ -55,7 +55,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.ticks.TickPriority; public class FluidPipeBlock extends PipeBlock implements SimpleWaterloggedBlock, IWrenchableWithBracket, - IBE, EncasableBlock, ITransformableBlock { + IBE, EncasableBlock, TransformableBlock { private static final VoxelShape OCCLUSION_BOX = Block.box(4, 4, 4, 12, 12, 12); diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java index f101643750..31d65dcef4 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.fluids.pipes; import java.util.List; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.fluids.FluidPropagator; @@ -13,10 +13,11 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -public class FluidPipeBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { +public class FluidPipeBlockEntity extends SmartBlockEntity implements TransformableBlockEntity { public FluidPipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -30,7 +31,7 @@ public class FluidPipeBlockEntity extends SmartBlockEntity implements ITransform } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { BracketedBlockEntityBehaviour bracketBehaviour = getBehaviour(BracketedBlockEntityBehaviour.TYPE); if (bracketBehaviour != null) { bracketBehaviour.transformBracket(transform); diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java index 8250c9cb4d..6bae8eff31 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java @@ -4,8 +4,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; @@ -30,7 +30,7 @@ import net.minecraft.world.level.pathfinder.PathComputationType; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class GlassFluidPipeBlock extends AxisPipeBlock implements IBE, SimpleWaterloggedBlock, ISpecialBlockItemRequirement { +public class GlassFluidPipeBlock extends AxisPipeBlock implements IBE, SimpleWaterloggedBlock, SpecialBlockItemRequirement { public static final BooleanProperty ALT = BooleanProperty.create("alt"); diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java index ad41239c71..92c8a065e4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import net.createmod.catnip.data.Iterate; @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BooleanProperty; -public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBlock implements ITransformableBlock { +public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBlock implements TransformableBlock { public static final BooleanProperty AXIS_ALONG_FIRST_COORDINATE = BooleanProperty.create("axis_along_first"); diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 2914a1f2bc..eb1f8ad539 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -12,8 +12,8 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; @@ -88,6 +88,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.extensions.common.IClientBlockExtensions; @@ -96,7 +97,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; public class BeltBlock extends HorizontalKineticBlock - implements IBE, ISpecialBlockItemRequirement, ITransformableBlock, ProperWaterloggedBlock { + implements IBE, SpecialBlockItemRequirement, TransformableBlock, ProperWaterloggedBlock { public static final Property SLOPE = EnumProperty.create("slope", BeltSlope.class); public static final Property PART = EnumProperty.create("part", BeltPart.class); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index e5d0466b98..39841b9a0e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -12,7 +12,7 @@ import java.util.function.Consumer; import javax.annotation.Nullable; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; @@ -28,9 +28,9 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.data.Iterate; -import net.createmod.catnip.nbt.NBTHelper; -import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.BlockParticleOption; @@ -48,13 +48,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.items.ItemHandlerHelper; -public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITransformableBlockEntity { +public class ChainConveyorBlockEntity extends KineticBlockEntity implements TransformableBlockEntity { public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { } @@ -782,7 +784,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { if (connections == null || connections.isEmpty()) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java index 6f2e9272ec..33900b8d34 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.kinetics.chainDrive; import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; @@ -33,7 +33,7 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.PushReaction; public class ChainDriveBlock extends RotatedPillarKineticBlock - implements IBE, ITransformableBlock { + implements IBE, TransformableBlock { public static final Property PART = EnumProperty.create("part", Part.class); public static final BooleanProperty CONNECTED_ALONG_FIRST_COORDINATE = diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java index b29fc120ad..162ae7062d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java @@ -6,7 +6,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.Create; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes.JukeboxPoint; @@ -22,11 +22,11 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.nbt.NBTHelper; -import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.animation.LerpedFloat; import net.createmod.catnip.lang.Lang; import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; @@ -42,15 +42,17 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.JukeboxBlock; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -public class ArmBlockEntity extends KineticBlockEntity implements ITransformableBlockEntity { +public class ArmBlockEntity extends KineticBlockEntity implements TransformableBlockEntity { // Server List inputs; @@ -419,7 +421,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { if (interactionPointTag == null) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java index 1b452758bc..9490c98105 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java @@ -2,16 +2,17 @@ package com.simibubi.create.content.kinetics.simpleRelays; import java.util.List; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -public class BracketedKineticBlockEntity extends SimpleKineticBlockEntity implements ITransformableBlockEntity { +public class BracketedKineticBlockEntity extends SimpleKineticBlockEntity implements TransformableBlockEntity { public BracketedKineticBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -25,7 +26,7 @@ public class BracketedKineticBlockEntity extends SimpleKineticBlockEntity implem } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { BracketedBlockEntityBehaviour bracketBehaviour = getBehaviour(BracketedBlockEntityBehaviour.TYPE); if (bracketBehaviour != null) { bracketBehaviour.transformBracket(transform); diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index 444ad42130..f9de060b73 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -4,7 +4,8 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; @@ -14,7 +15,6 @@ import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.content.kinetics.simpleRelays.SimpleKineticBlockEntity; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; @@ -45,7 +45,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; public class EncasedCogwheelBlock extends RotatedPillarKineticBlock - implements ICogWheel, IBE, ISpecialBlockItemRequirement, ITransformableBlock, EncasedBlock { + implements ICogWheel, IBE, SpecialBlockItemRequirement, TransformableBlock, EncasedBlock { public static final BooleanProperty TOP_SHAFT = BooleanProperty.create("top_shaft"); public static final BooleanProperty BOTTOM_SHAFT = BooleanProperty.create("bottom_shaft"); diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java index 752d562f59..8d5d8a7972 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java @@ -4,11 +4,11 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.kinetics.base.AbstractEncasedShaftBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; @@ -28,7 +28,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; public class EncasedShaftBlock extends AbstractEncasedShaftBlock - implements IBE, ISpecialBlockItemRequirement, EncasedBlock { + implements IBE, SpecialBlockItemRequirement, EncasedBlock { private final Supplier casing; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java index a6618ceaf9..8598932c4f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java @@ -26,6 +26,7 @@ public class SteamEngineVisual extends AbstractBlockEntityVisual, ITransformableBlock { +public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implements IBE, TransformableBlock { public static final BooleanProperty VERTICAL = BooleanProperty.create("vertical"); public static final IntegerProperty STATE = IntegerProperty.create("state", 0, 5); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index d5f00a894d..dbcd2f78d7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.schematics.requirement.ItemRequirement; @@ -51,12 +51,13 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.level.BlockEvent; public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock - implements ProperWaterloggedBlock, IBE, IWrenchable, ISpecialBlockItemRequirement { + implements ProperWaterloggedBlock, IBE, IWrenchable, SpecialBlockItemRequirement { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java index 5da9c71a1b..201152e2fd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java @@ -2,18 +2,18 @@ package com.simibubi.create.content.logistics.funnel; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltSlope; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.tterrag.registrate.util.entry.BlockEntry; -import net.createmod.catnip.math.VoxelShaper; import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; @@ -37,7 +37,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements ISpecialBlockItemRequirement { +public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements SpecialBlockItemRequirement { private BlockEntry parent; diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java index d1d6f840d4..7bf2da0bec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java @@ -47,6 +47,7 @@ public class ItemVaultBlockEntity extends SmartBlockEntity implements IMultiBloc protected void onContentsChanged(int slot) { super.onContentsChanged(slot); updateComparators(); + level.blockEntityChanged(worldPosition); } }; diff --git a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java index aa7a6ddf97..ceb784aea7 100644 --- a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.redstone; import javax.annotation.Nullable; -import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.TransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.EnumProperty; -public class DirectedDirectionalBlock extends HorizontalDirectionalBlock implements IWrenchable, ITransformableBlock { +public class DirectedDirectionalBlock extends HorizontalDirectionalBlock implements IWrenchable, TransformableBlock { public static final EnumProperty TARGET = EnumProperty.create("target", AttachFace.class); diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java index c0d214391f..52102c3ca7 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; @@ -25,7 +25,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; public class LecternControllerBlock extends LecternBlock - implements IBE, ISpecialBlockItemRequirement { + implements IBE, SpecialBlockItemRequirement { public LecternControllerBlock(Properties properties) { super(properties); diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java index f2f0694282..a2a4a4f88e 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java @@ -8,9 +8,9 @@ import java.util.function.BiConsumer; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; @@ -48,7 +48,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; public class NixieTubeBlock extends DoubleFaceAttachedBlock - implements IBE, IWrenchable, SimpleWaterloggedBlock, ISpecialBlockItemRequirement { + implements IBE, IWrenchable, SimpleWaterloggedBlock, SpecialBlockItemRequirement { protected final DyeColor color; 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 3dc0c019af..67f476e1eb 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 @@ -98,8 +98,6 @@ public class SchematicHandler implements IGuiOverlay { if (activeSchematicItem != null && transformation != null) transformation.tick(); - renderers.forEach(SchematicRenderer::tick); - LocalPlayer player = mc.player; ItemStack stack = findBlueprintInHand(player); if (stack == null) { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 7e9e401ae1..9139a79a90 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -53,20 +53,17 @@ public class SchematicRenderer { changed = true; } - public void tick() { - if (!active) - return; - Minecraft mc = Minecraft.getInstance(); - if (mc.level == null || mc.player == null || !changed) - return; - - redraw(); - changed = false; - } - public void render(PoseStack ms, SuperRenderTypeBuffer buffers) { if (!active) return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null) + return; + if (changed) + redraw(); + changed = false; + bufferCache.forEach((layer, buffer) -> { buffer.renderInto(ms, buffers.getBuffer(layer)); }); 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 4ba76575da..1c8ddedbdc 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 @@ -8,13 +8,12 @@ import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; -import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialBlockEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialEntityItemRequirement; import com.simibubi.create.api.schematic.requirement.SchematicRequirementRegistries; import com.simibubi.create.compat.framedblocks.FramedBlocksInSchematics; import com.simibubi.create.foundation.data.recipe.Mods; - import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.ArmorStand; @@ -73,7 +72,7 @@ public class ItemRequirement { SchematicRequirementRegistries.BlockRequirement blockRequirement = SchematicRequirementRegistries.BLOCKS.get(block); if (blockRequirement != null) { requirement = blockRequirement.getRequiredItems(block, state, be); - } else if (block instanceof ISpecialBlockItemRequirement specialBlock) { + } else if (block instanceof SpecialBlockItemRequirement specialBlock) { requirement = specialBlock.getRequiredItems(state, be); } else { requirement = defaultOf(state, be); @@ -83,7 +82,7 @@ public class ItemRequirement { SchematicRequirementRegistries.BlockEntityRequirement beRequirement = SchematicRequirementRegistries.BLOCK_ENTITIES.get(be.getType()); if (beRequirement != null) { requirement = requirement.union(beRequirement.getRequiredItems(be, state)); - } else if (be instanceof ISpecialBlockEntityItemRequirement specialBE) { + } else if (be instanceof SpecialBlockEntityItemRequirement specialBE) { requirement = requirement.union(specialBE.getRequiredItems(state)); } else if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) { requirement = requirement.union(FramedBlocksInSchematics.getRequiredItems(state, be)); @@ -136,7 +135,7 @@ public class ItemRequirement { SchematicRequirementRegistries.EntityRequirement requirement = SchematicRequirementRegistries.ENTITIES.get(entity.getType()); if (requirement != null) { return requirement.getRequiredItems(entity); - } else if (entity instanceof ISpecialEntityItemRequirement specialEntity) { + } else if (entity instanceof SpecialEntityItemRequirement specialEntity) { return specialEntity.getRequiredItems(); } diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java index 7c43084755..25cdfafd5e 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java @@ -16,8 +16,8 @@ import com.google.common.collect.ImmutableSet; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.AllItems; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.CarriageBogey; @@ -28,8 +28,8 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -52,9 +52,10 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.registries.ForgeRegistries; -public abstract class AbstractBogeyBlock extends Block implements IBE, ProperWaterloggedBlock, ISpecialBlockItemRequirement, IWrenchable { +public abstract class AbstractBogeyBlock extends Block implements IBE, ProperWaterloggedBlock, SpecialBlockItemRequirement, IWrenchable { public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; static final List BOGEYS = new ArrayList<>(); public BogeySizes.BogeySize size; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java index 91e5c7548a..e8dad70394 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.trains.bogey; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBogeyStyles; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.trains.track.TrackMaterial; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; @@ -18,7 +18,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock - implements IBE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { + implements IBE, ProperWaterloggedBlock, SpecialBlockItemRequirement { public StandardBogeyBlock(Properties props, BogeySizes.BogeySize size) { super(props, size); diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java index c35af91519..7a7e30c684 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java @@ -7,11 +7,10 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.simibubi.create.api.contraption.train.TrainConductorHandler; - import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.contraption.train.TrainConductorHandler; import com.simibubi.create.content.contraptions.AssemblyException; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.ContraptionType; @@ -20,11 +19,12 @@ import com.simibubi.create.content.contraptions.actors.trainControls.ControlsBlo import com.simibubi.create.content.contraptions.minecart.TrainCargoManager; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.impl.contraption.train.TrainConductorHandlerImpl; import net.createmod.catnip.data.Couple; import net.createmod.catnip.data.Iterate; -import net.createmod.catnip.nbt.NBTHelper; import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -165,8 +165,12 @@ public class CarriageContraption extends Contraption { captureBE ? world.getBlockEntity(pos) : null); } - if (TrainConductorHandler.CONDUCTOR_HANDLERS.stream().anyMatch(handler -> handler.isValidConductor(blockState))) - assembledBlockConductors.add(toLocalPos(pos)); + for (TrainConductorHandler handler : TrainConductorHandlerImpl.CONDUCTOR_HANDLERS) { + if (handler.isValidConductor(blockState)) { + assembledBlockConductors.add(toLocalPos(pos)); + break; + } + } if (AllBlocks.TRAIN_CONTROLS.has(blockState)) { Direction facing = blockState.getValue(ControlsBlock.FACING); diff --git a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java index 9fd1ff282d..c2869670e2 100644 --- a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java @@ -5,7 +5,7 @@ import java.util.List; import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.graph.EdgePointType; @@ -20,12 +20,13 @@ import dev.engine_room.flywheel.lib.transform.TransformStack; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -public class TrackObserverBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { +public class TrackObserverBlockEntity extends SmartBlockEntity implements TransformableBlockEntity { public TrackTargetingBehaviour edgePoint; @@ -90,8 +91,8 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans } @Override - public void transform(StructureTransform transform) { - edgePoint.transform(transform); + public void transform(BlockEntity be, StructureTransform transform) { + edgePoint.transform(be, transform); } public FilteringBehaviour createFilter() { diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java index d6629af78f..79b23434c3 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java @@ -4,7 +4,7 @@ import java.util.List; import javax.annotation.Nullable; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.EdgePointType; import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; @@ -15,11 +15,12 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -public class SignalBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { +public class SignalBlockEntity extends SmartBlockEntity implements TransformableBlockEntity { public static enum OverlayState { RENDER, SKIP, DUAL @@ -160,8 +161,8 @@ public class SignalBlockEntity extends SmartBlockEntity implements ITransformabl } @Override - public void transform(StructureTransform transform) { - edgePoint.transform(transform); + public void transform(BlockEntity be, StructureTransform transform) { + edgePoint.transform(be, transform); } } diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 4c2bb4bd04..8d9345fa71 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -21,10 +21,10 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.contraptions.AssemblyException; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.equipment.wrench.IWrenchable; @@ -60,12 +60,12 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.data.Iterate; -import net.createmod.catnip.nbt.NBTHelper; -import net.createmod.catnip.math.VecHelper; -import net.createmod.catnip.data.WorldAttached; import net.createmod.catnip.animation.LerpedFloat; import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; @@ -90,13 +90,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.network.PacketDistributor; -public class StationBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { +public class StationBlockEntity extends SmartBlockEntity implements TransformableBlockEntity { public TrackTargetingBehaviour edgePoint; public DoorControlBehaviour doorControls; @@ -970,8 +971,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab } @Override - public void transform(StructureTransform transform) { - edgePoint.transform(transform); + public void transform(BlockEntity be, StructureTransform transform) { + edgePoint.transform(be, transform); } // Package port integration diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java index 01edd65f71..6003bd5875 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java @@ -19,7 +19,6 @@ import java.util.Random; import java.util.Set; import java.util.function.Consumer; -import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; import com.google.common.base.Predicates; @@ -29,9 +28,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTags; +import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; import com.simibubi.create.content.decoration.girder.GirderBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.content.trains.CubeParticleData; @@ -50,17 +49,18 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.createmod.catnip.math.BlockFace; import net.createmod.catnip.data.Iterate; import net.createmod.catnip.data.Pair; -import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.math.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; @@ -99,12 +99,13 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.ticks.LevelTickAccess; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.extensions.common.IClientBlockExtensions; public class TrackBlock extends Block - implements IBE, IWrenchable, ITrackBlock, ISpecialBlockItemRequirement, ProperWaterloggedBlock, IHaveBigOutline { + implements IBE, IWrenchable, ITrackBlock, SpecialBlockItemRequirement, ProperWaterloggedBlock, IHaveBigOutline { public static final EnumProperty SHAPE = EnumProperty.create("shape", TrackShape.class); public static final BooleanProperty HAS_BE = BooleanProperty.create("turn"); diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java index f9d56b37f4..48ede28c05 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java @@ -11,7 +11,7 @@ import java.util.Set; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags; -import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.TransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; @@ -41,12 +41,13 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.fml.DistExecutor; -public class TrackBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity, IMergeableBE { +public class TrackBlockEntity extends SmartBlockEntity implements TransformableBlockEntity, IMergeableBE { Map connections; boolean cancelDrops; @@ -262,7 +263,7 @@ public class TrackBlockEntity extends SmartBlockEntity implements ITransformable } @Override - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { Map restoredConnections = new HashMap<>(); for (Entry entry : connections.entrySet()) restoredConnections.put(entry.getKey(), diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java index 6b2ee80c0f..5bd2fa4f23 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java @@ -23,10 +23,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.data.Iterate; -import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.levelWrappers.SchematicLevel; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -41,8 +41,10 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -332,7 +334,7 @@ public class TrackTargetingBehaviour extends BlockEnti ms.popPose(); } - public void transform(StructureTransform transform) { + public void transform(BlockEntity be, StructureTransform transform) { id = UUID.randomUUID(); targetTrack = transform.applyWithoutOffset(targetTrack); if (prevDirection != null) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index 44474d6a70..b81fd26a9e 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -7,14 +7,14 @@ import java.util.Map; import java.util.function.Consumer; import com.simibubi.create.api.event.BlockEntityBehaviourEvent; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; +import com.simibubi.create.api.schematic.nbt.PartialSafeNBT; +import com.simibubi.create.api.schematic.requirement.SpecialBlockEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.CreateAdvancement; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.IInteractionChecker; -import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.createmod.ponder.api.VirtualBlockEntity; @@ -24,12 +24,13 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; public abstract class SmartBlockEntity extends CachedRenderBBBlockEntity - implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement, VirtualBlockEntity { + implements PartialSafeNBT, IInteractionChecker, SpecialBlockEntityItemRequirement, VirtualBlockEntity { private final Map, BlockEntityBehaviour> behaviours = new Reference2ObjectArrayMap<>(); private boolean initialized = false; 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 91acda588d..a8c0f4f8de 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; -import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; +import com.simibubi.create.api.schematic.nbt.PartialSafeNBT; import com.simibubi.create.api.schematic.nbt.SafeNbtWriterRegistry; import com.simibubi.create.api.schematic.nbt.SafeNbtWriterRegistry.SafeNbtWriter; import com.simibubi.create.compat.Mods; @@ -286,7 +286,7 @@ public class BlockHelper { } else if (writer != null) { data = new CompoundTag(); writer.writeSafe(blockEntity, data); - } else if (blockEntity instanceof IPartialSafeNBT safeNbtBE) { + } else if (blockEntity instanceof PartialSafeNBT safeNbtBE) { data = new CompoundTag(); safeNbtBE.writeSafe(data); } else if (Mods.FRAMEDBLOCKS.contains(blockState.getBlock())) { diff --git a/src/main/java/com/simibubi/create/impl/contraption/train/TrainConductorHandlerImpl.java b/src/main/java/com/simibubi/create/impl/contraption/train/TrainConductorHandlerImpl.java new file mode 100644 index 0000000000..0a767a4cf9 --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/contraption/train/TrainConductorHandlerImpl.java @@ -0,0 +1,22 @@ +package com.simibubi.create.impl.contraption.train; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.ApiStatus; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.contraption.train.TrainConductorHandler; +import com.simibubi.create.api.contraption.train.TrainConductorHandler.UpdateScheduleCallback; +import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; + +@ApiStatus.Internal +public class TrainConductorHandlerImpl { + public static final List CONDUCTOR_HANDLERS = new ArrayList<>(); + + @ApiStatus.Internal + public static void registerBlazeBurner() { + TrainConductorHandler.registerConductor(AllBlocks.BLAZE_BURNER.getId(), blockState -> AllBlocks.BLAZE_BURNER.has(blockState) + && blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) != BlazeBurnerBlock.HeatLevel.NONE, UpdateScheduleCallback.EMPTY); + } +} diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java index 707e12238f..a06e24abe4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java @@ -1,6 +1,5 @@ package com.simibubi.create.infrastructure.config; -import com.simibubi.create.content.contraptions.ContraptionData; import com.simibubi.create.content.contraptions.ContraptionMovementSetting; import net.createmod.catnip.config.ConfigBase; @@ -32,8 +31,6 @@ public class CKinetics extends ConfigBase { public final ConfigGroup contraptions = group(1, "contraptions", "Moving Contraptions"); public final ConfigInt maxBlocksMoved = i(2048, 1, "maxBlocksMoved", Comments.maxBlocksMoved); - public final ConfigInt maxDataSize = - i(ContraptionData.DEFAULT_LIMIT, 0, "maxDataSize", Comments.bytes, Comments.maxDataDisable, Comments.maxDataSize, Comments.maxDataSize2); public final ConfigInt maxChassisRange = i(16, 1, "maxChassisRange", Comments.maxChassisRange); public final ConfigInt maxPistonPoles = i(64, 1, "maxPistonPoles", Comments.maxPistonPoles); public final ConfigInt maxRopeLength = i(384, 1, "maxRopeLength", Comments.maxRopeLength); @@ -86,9 +83,6 @@ public class CKinetics extends ConfigBase { "multiplier used for calculating exhaustion from speed when a crank is turned."; static String maxBlocksMoved = "Maximum amount of blocks in a structure movable by Pistons, Bearings or other means."; - static String maxDataSize = "Maximum amount of data a contraption can have before it can't be synced with players."; - static String maxDataSize2 = "Un-synced contraptions will not be visible and will not have collision."; - static String maxDataDisable = "[0 to disable this limit]"; static String maxChassisRange = "Maximum value of a chassis attachment range."; static String maxPistonPoles = "Maximum amount of extension poles behind a Mechanical Piston."; static String maxRopeLength = "Max length of rope available off a Rope Pulley."; diff --git a/src/main/resources/assets/create/textures/block/vault/vault_side_large.png b/src/main/resources/assets/create/textures/block/vault/vault_side_large.png index f58fbe7e00..48d0e4d719 100644 Binary files a/src/main/resources/assets/create/textures/block/vault/vault_side_large.png and b/src/main/resources/assets/create/textures/block/vault/vault_side_large.png differ diff --git a/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png b/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png index e44307a190..94b0c4be9d 100644 Binary files a/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png and b/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png differ diff --git a/src/main/resources/assets/create/textures/block/vault/vault_top_large.png b/src/main/resources/assets/create/textures/block/vault/vault_top_large.png index 44b837d810..770609b600 100644 Binary files a/src/main/resources/assets/create/textures/block/vault/vault_top_large.png and b/src/main/resources/assets/create/textures/block/vault/vault_top_large.png differ diff --git a/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png b/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png index c28936a15c..2ec555bab1 100644 Binary files a/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png and b/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png differ