diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 93f94e6189..ec0475547b 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -383,8 +383,7 @@ public class AllBlocks { public static final BlockEntry SHAFT = REGISTRATE.block("shaft", ShaftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.METAL) - .forceSolidOn()) + .properties(p -> p.mapColor(MapColor.METAL).forceSolidOff()) .transform(BlockStressDefaults.setNoImpact()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.axisBlockProvider(false)) @@ -891,7 +890,7 @@ public class AllBlocks { public static final BlockEntry FLUID_PIPE = REGISTRATE.block("fluid_pipe", FluidPipeBlock::new) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.forceSolidOn()) + .properties(p -> p.forceSolidOff()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.pipe()) .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) diff --git a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java index 693a72aa71..2c3008b9c1 100644 --- a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java +++ b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java @@ -1,5 +1,7 @@ package com.simibubi.create.compat.computercraft.implementation.peripherals; +import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.jetbrains.annotations.NotNull; @@ -8,7 +10,11 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.LuaValues; +import dan200.computercraft.api.lua.ObjectLuaTable; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; @@ -53,6 +59,28 @@ public class DisplayLinkPeripheral extends SyncedPeripheral map) { + ObjectLuaTable table = new ObjectLuaTable(map); + bytes = new byte[table.length()]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) (table.getInt(i + 1) & 0xff); + } + } else { + throw LuaValues.badArgumentOf(args, 0, "string or table"); + } + writeImpl(new String(bytes, StandardCharsets.UTF_8)); + } + + protected final void writeImpl(String text) { ListTag tag = blockEntity.getSourceConfig().getList(TAG_KEY, Tag.TAG_STRING); int x = cursorX.get(); diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java index 76774b1836..ac685fecd3 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java @@ -115,6 +115,7 @@ public class SpoutBlockEntity extends SmartBlockEntity implements IHaveGoggleInf // Process finished ItemStack out = FillingBySpout.fillItem(level, requiredAmountForItem, transported.stack, fluid); if (!out.isEmpty()) { + transported.clearFanProcessingData(); List outList = new ArrayList<>(); TransportedItemStack held = null; TransportedItemStack result = transported.copy(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java index 215a17ef4f..e982345123 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java @@ -2,12 +2,15 @@ package com.simibubi.create.content.kinetics.belt.transport; import java.util.Random; +import com.simibubi.create.AllRegistries; import com.simibubi.create.content.kinetics.belt.BeltHelper; +import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes; import com.simibubi.create.content.kinetics.fan.processing.FanProcessingType; import com.simibubi.create.content.logistics.box.PackageItem; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; public class TransportedItemStack implements Comparable { @@ -77,6 +80,16 @@ public class TransportedItemStack implements Comparable { nbt.putInt("InSegment", insertedAt); nbt.putInt("Angle", angle); nbt.putInt("InDirection", insertedFrom.get3DDataValue()); + + if (processedBy != null && processedBy != AllFanProcessingTypes.NONE) { + ResourceLocation key = AllRegistries.FAN_PROCESSING_TYPES.get().getKey(processedBy); + if (key == null) + throw new IllegalArgumentException("Could not get id for FanProcessingType " + processedBy + "!"); + + nbt.putString("FanProcessingType", key.toString()); + nbt.putInt("FanProcessingTime", processingTime); + } + if (locked) nbt.putBoolean("Locked", locked); if (lockedExternally) @@ -95,7 +108,18 @@ public class TransportedItemStack implements Comparable { stack.insertedFrom = Direction.from3DDataValue(nbt.getInt("InDirection")); stack.locked = nbt.getBoolean("Locked"); stack.lockedExternally = nbt.getBoolean("LockedExternally"); + + if (nbt.contains("FanProcessingType")) { + stack.processedBy = AllFanProcessingTypes.parseLegacy(nbt.getString("FanProcessingType")); + stack.processingTime = nbt.getInt("FanProcessingTime"); + } + return stack; } + + public void clearFanProcessingData() { + processedBy = null; + processingTime = 0; + } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java index 091033b9b1..14412862a1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java @@ -113,6 +113,8 @@ public class BeltDeployerCallbacks { .collect(Collectors.toList()); blockEntity.award(AllAdvancements.DEPLOYER); + + transported.clearFanProcessingData(); TransportedItemStack left = transported.copy(); blockEntity.player.spawnedItemEffects = transported.stack.copy(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/press/BeltPressingCallbacks.java b/src/main/java/com/simibubi/create/content/kinetics/press/BeltPressingCallbacks.java index 900aab84b3..2ae6407f11 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/press/BeltPressingCallbacks.java +++ b/src/main/java/com/simibubi/create/content/kinetics/press/BeltPressingCallbacks.java @@ -49,6 +49,8 @@ public class BeltPressingCallbacks { boolean bulk = behaviour.specifics.canProcessInBulk() || transported.stack.getCount() == 1; + transported.clearFanProcessingData(); + List collect = results.stream() .map(stack -> { TransportedItemStack copy = transported.copy(); diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java index 5dc29d45cc..47632ba921 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java @@ -22,6 +22,8 @@ import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; @@ -33,7 +35,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -public class BasinRecipe extends ProcessingRecipe { +public class BasinRecipe extends ProcessingRecipe { public static boolean match(BasinBlockEntity basin, Recipe recipe) { FilteringBehaviour filter = basin.getFilter(); @@ -147,13 +149,15 @@ public class BasinRecipe extends ProcessingRecipe { } if (simulate) { + CraftingContainer remainderContainer = new DummyCraftingContainer(availableItems, extractedItemsFromSlot); + if (recipe instanceof BasinRecipe basinRecipe) { recipeOutputItems.addAll(basinRecipe.rollResults()); for (FluidStack fluidStack : basinRecipe.getFluidResults()) if (!fluidStack.isEmpty()) recipeOutputFluids.add(fluidStack); - for (ItemStack stack : basinRecipe.getRemainingItems(basin.getInputInventory())) + for (ItemStack stack : basinRecipe.getRemainingItems(remainderContainer)) if (!stack.isEmpty()) recipeOutputItems.add(stack); @@ -162,8 +166,7 @@ public class BasinRecipe extends ProcessingRecipe { .registryAccess())); if (recipe instanceof CraftingRecipe craftingRecipe) { - for (ItemStack stack : craftingRecipe - .getRemainingItems(new DummyCraftingContainer(availableItems, extractedItemsFromSlot))) + for (ItemStack stack : craftingRecipe.getRemainingItems(remainderContainer)) if (!stack.isEmpty()) recipeOutputItems.add(stack); } @@ -224,7 +227,7 @@ public class BasinRecipe extends ProcessingRecipe { } @Override - public boolean matches(SmartInventory inv, @Nonnull Level worldIn) { + public boolean matches(Container inv, @Nonnull Level worldIn) { return false; } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index fc60eb4e41..2a20d8fdb5 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -34,7 +34,7 @@ public class ValueBoxRenderer { float zOffset = (!blockItem ? -.15f : 0) + customZOffset(filter.getItem()); ms.scale(scale, scale, scale); ms.translate(0, 0, zOffset); - itemRenderer.renderStatic(filter, ItemDisplayContext.FIXED, light, overlay, ms, buffer, mc.level, 0); + itemRenderer.render(filter, ItemDisplayContext.FIXED, false, ms, buffer, light, overlay, modelWithOverrides); } public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, MultiBufferSource buffer, int light, diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java index 4fa8dca7eb..45f332c49c 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; +import com.simibubi.create.foundation.utility.AdventureUtil; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; @@ -95,7 +96,6 @@ public class ValueSettingsInputHandler { } public static boolean canInteract(Player player) { - return player != null && !player.isSpectator() && !player.isShiftKeyDown(); + return player != null && !player.isSpectator() && !player.isShiftKeyDown() && !AdventureUtil.isAdventure(player); } - } diff --git a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java index 7e8f5e8772..f8e10b81c6 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java +++ b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java @@ -22,7 +22,7 @@ public class CountedItemStackList { public CountedItemStackList(IItemHandler inventory, FilteringBehaviour filteringBehaviour) { for (int slot = 0; slot < inventory.getSlots(); slot++) { - ItemStack extractItem = inventory.extractItem(slot, inventory.getSlotLimit(slot), true); + ItemStack extractItem = inventory.getStackInSlot(slot); if (filteringBehaviour.test(extractItem)) add(extractItem); } diff --git a/src/main/java/com/simibubi/create/foundation/networking/BlockEntityConfigurationPacket.java b/src/main/java/com/simibubi/create/foundation/networking/BlockEntityConfigurationPacket.java index 35d80758f6..fb7ab5b0c0 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/BlockEntityConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/BlockEntityConfigurationPacket.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.networking; import com.simibubi.create.foundation.blockEntity.SyncedBlockEntity; +import com.simibubi.create.foundation.utility.AdventureUtil; + import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; @@ -33,7 +35,7 @@ public abstract class BlockEntityConfigurationPacket { ServerPlayer player = context.getSender(); - if (player == null) + if (player == null || player.isSpectator() || AdventureUtil.isAdventure(player)) return; Level world = player.level(); if (world == null || !world.isLoaded(pos)) @@ -63,7 +65,7 @@ public abstract class BlockEntityConfigurationPacket