diff --git a/src/generated/resources/data/create/tags/blocks/safe_nbt.json b/src/generated/resources/data/create/tags/blocks/safe_nbt.json new file mode 100644 index 000000000..e0049a6df --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/safe_nbt.json @@ -0,0 +1,30 @@ +{ + "replace": false, + "values": [ + "create:creative_motor", + "create:fluid_tank", + "create:creative_fluid_tank", + "create:mechanical_piston", + "create:sticky_mechanical_piston", + "create:mechanical_piston_head", + "create:windmill_bearing", + "create:mechanical_bearing", + "create:clockwork_bearing", + "create:rope_pulley", + "create:cart_assembler", + "create:linear_chassis", + "create:secondary_linear_chassis", + "create:radial_chassis", + "create:sequenced_gearshift", + "create:rotation_speed_controller", + "create:andesite_funnel", + "create:andesite_belt_funnel", + "create:brass_funnel", + "create:brass_belt_funnel", + "create:creative_crate", + "create:redstone_link", + "create:analog_lever", + "create:adjustable_repeater", + "create:adjustable_pulse_repeater" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 8a09fc0f5..91864933b 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -320,6 +320,7 @@ public class AllBlocks { public static final BlockEntry CREATIVE_MOTOR = REGISTRATE.block("creative_motor", CreativeMotorBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new CreativeMotorGenerator()::generate) .transform(StressConfigDefaults.setCapacity(16384.0)) .item() @@ -592,6 +593,7 @@ public class AllBlocks { public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.SAFE_NBT.tag) .properties(Block.Properties::nonOpaque) .blockstate(new FluidTankGenerator()::generate) .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) @@ -604,6 +606,7 @@ public class AllBlocks { public static final BlockEntry CREATIVE_FLUID_TANK = REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.SAFE_NBT.tag) .properties(Block.Properties::nonOpaque) .blockstate(new FluidTankGenerator("creative_")::generate) .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::creative)) @@ -653,11 +656,13 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PISTON = REGISTRATE.block("mechanical_piston", MechanicalPistonBlock::normal) .transform(BuilderTransformers.mechanicalPiston(PistonType.DEFAULT)) + .tag(AllBlockTags.SAFE_NBT.tag) .register(); public static final BlockEntry STICKY_MECHANICAL_PISTON = REGISTRATE.block("sticky_mechanical_piston", MechanicalPistonBlock::sticky) .transform(BuilderTransformers.mechanicalPiston(PistonType.STICKY)) + .tag(AllBlockTags.SAFE_NBT.tag) .register(); public static final BlockEntry PISTON_EXTENSION_POLE = @@ -670,6 +675,7 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PISTON_HEAD = REGISTRATE.block("mechanical_piston_head", MechanicalPistonHeadBlock::new) .initialProperties(() -> Blocks.PISTON_HEAD) + .tag(AllBlockTags.SAFE_NBT.tag) .loot((p, b) -> p.registerDropping(b, PISTON_EXTENSION_POLE.get())) .blockstate((c, p) -> BlockStateGen.directionalBlockIgnoresWaterlogged(c, p, state -> p.models() .getExistingFile(p.modLoc("block/mechanical_piston/" + state.get(MechanicalPistonHeadBlock.TYPE) @@ -680,12 +686,14 @@ public class AllBlocks { REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new) .transform(BuilderTransformers.bearing("windmill", "gearbox", true)) .transform(StressConfigDefaults.setCapacity(512.0)) + .tag(AllBlockTags.SAFE_NBT.tag) .register(); public static final BlockEntry MECHANICAL_BEARING = REGISTRATE.block("mechanical_bearing", MechanicalBearingBlock::new) .transform(BuilderTransformers.bearing("mechanical", "gearbox", false)) .transform(StressConfigDefaults.setImpact(4.0)) + .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(new StabilizedBearingMovementBehaviour())) .register(); @@ -693,10 +701,12 @@ public class AllBlocks { REGISTRATE.block("clockwork_bearing", ClockworkBearingBlock::new) .transform(BuilderTransformers.bearing("clockwork", "brass_gearbox", false)) .transform(StressConfigDefaults.setImpact(4.0)) + .tag(AllBlockTags.SAFE_NBT.tag) .register(); public static final BlockEntry ROPE_PULLEY = REGISTRATE.block("rope_pulley", PulleyBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.horizontalAxisBlockProvider(true)) .transform(StressConfigDefaults.setImpact(4.0)) .item() @@ -725,7 +735,7 @@ public class AllBlocks { .properties(Block.Properties::nonOpaque) .blockstate(BlockStateGen.cartAssembler()) .addLayer(() -> RenderType::getCutoutMipped) - .tag(BlockTags.RAILS) + .tag(BlockTags.RAILS, AllBlockTags.SAFE_NBT.tag) .item(CartAssemblerBlockItem::new) .transform(customItemModel()) .register(); @@ -765,6 +775,7 @@ public class AllBlocks { public static final BlockEntry LINEAR_CHASSIS = REGISTRATE.block("linear_chassis", LinearChassisBlock::new) .initialProperties(SharedProperties::wooden) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.linearChassis()) .onRegister(connectedTextures(new ChassisCTBehaviour())) .lang("Linear Chassis") @@ -774,6 +785,7 @@ public class AllBlocks { public static final BlockEntry SECONDARY_LINEAR_CHASSIS = REGISTRATE.block("secondary_linear_chassis", LinearChassisBlock::new) .initialProperties(SharedProperties::wooden) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.linearChassis()) .onRegister(connectedTextures(new ChassisCTBehaviour())) .simpleItem() @@ -782,6 +794,7 @@ public class AllBlocks { public static final BlockEntry RADIAL_CHASSIS = REGISTRATE.block("radial_chassis", RadialChassisBlock::new) .initialProperties(SharedProperties::wooden) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.radialChassis()) .item() .model((c, p) -> { @@ -968,6 +981,7 @@ public class AllBlocks { public static final BlockEntry SEQUENCED_GEARSHIFT = REGISTRATE.block("sequenced_gearshift", SequencedGearshiftBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.SAFE_NBT.tag) .properties(Block.Properties::nonOpaque) .transform(StressConfigDefaults.setNoImpact()) .blockstate(new SequencedGearshiftGenerator()::generate) @@ -997,6 +1011,7 @@ public class AllBlocks { public static final BlockEntry ROTATION_SPEED_CONTROLLER = REGISTRATE.block("rotation_speed_controller", SpeedControllerBlock::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.SAFE_NBT.tag) .transform(StressConfigDefaults.setNoImpact()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(true)) .item() @@ -1024,6 +1039,7 @@ public class AllBlocks { public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite())) .transform(BuilderTransformers.funnel("andesite", Create.asResource("block/andesite_casing"))) .register(); @@ -1031,6 +1047,7 @@ public class AllBlocks { public static final BlockEntry ANDESITE_BELT_FUNNEL = REGISTRATE.block("andesite_belt_funnel", AndesiteBeltFunnelBlock::new) .initialProperties(SharedProperties::stone) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("andesite", new ResourceLocation("block/polished_andesite"))::generate) .loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get())) .register(); @@ -1038,6 +1055,7 @@ public class AllBlocks { public static final BlockEntry BRASS_FUNNEL = REGISTRATE.block("brass_funnel", BrassFunnelBlock::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass())) .transform(BuilderTransformers.funnel("brass", Create.asResource("block/brass_casing"))) .register(); @@ -1045,6 +1063,7 @@ public class AllBlocks { public static final BlockEntry BRASS_BELT_FUNNEL = REGISTRATE.block("brass_belt_funnel", BrassBeltFunnelBlock::new) .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("brass", Create.asResource("block/brass_block"))::generate) .loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get())) .register(); @@ -1093,6 +1112,7 @@ public class AllBlocks { public static final BlockEntry CREATIVE_CRATE = REGISTRATE.block("creative_crate", CreativeCrateBlock::new) .transform(BuilderTransformers.crate("creative")) + .tag(AllBlockTags.SAFE_NBT.tag) .register(); public static final BlockEntry NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new) @@ -1107,7 +1127,7 @@ public class AllBlocks { public static final BlockEntry REDSTONE_LINK = REGISTRATE.block("redstone_link", RedstoneLinkBlock::new) .initialProperties(SharedProperties::wooden) - .tag(AllBlockTags.BRITTLE.tag) + .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.SAFE_NBT.tag) .blockstate(new RedstoneLinkGenerator()::generate) .addLayer(() -> RenderType::getCutoutMipped) .item() @@ -1117,6 +1137,7 @@ public class AllBlocks { public static final BlockEntry ANALOG_LEVER = REGISTRATE.block("analog_lever", AnalogLeverBlock::new) .initialProperties(() -> Blocks.LEVER) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .item() .transform(customItemModel()) @@ -1134,6 +1155,7 @@ public class AllBlocks { public static final BlockEntry ADJUSTABLE_REPEATER = REGISTRATE.block("adjustable_repeater", AdjustableRepeaterBlock::new) .initialProperties(() -> Blocks.REPEATER) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new AdjustableRepeaterGenerator()::generate) .item() .model(AbstractDiodeGenerator.diodeItemModel(true)) @@ -1143,6 +1165,7 @@ public class AllBlocks { public static final BlockEntry ADJUSTABLE_PULSE_REPEATER = REGISTRATE.block("adjustable_pulse_repeater", AdjustableRepeaterBlock::new) .initialProperties(() -> Blocks.REPEATER) + .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new AdjustableRepeaterGenerator()::generate) .addLayer(() -> RenderType::getCutoutMipped) .item() diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index b486accd5..039c576ad 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -109,7 +109,7 @@ public class AllTags { } public static enum AllBlockTags { - WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, SAILS, VALVE_HANDLES, FAN_TRANSPARENT + WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, SAILS, VALVE_HANDLES, FAN_TRANSPARENT, SAFE_NBT ; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 2f043502d..65beab8e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -36,9 +36,7 @@ import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.wrapper.InvWrapper; public class DeployerTileEntity extends KineticTileEntity { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index 941c91731..1589e2768 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -74,7 +74,7 @@ public class BlockMovementTraits { return true; if (blockState.getBlockHardness(world, pos) == -1) return false; - if (AllBlockTags.NON_MOVABLE.tag.contains(block)) + if (AllBlockTags.NON_MOVABLE.matches(blockState)) return false; // Move controllers only when they aren't moving diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 63f141114..76db5bd8b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -6,7 +6,6 @@ import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import net.minecraft.client.renderer.FaceDirection; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java index 975989cdb..9102302d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java @@ -3,8 +3,6 @@ package com.simibubi.create.content.contraptions.fluids.recipe; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.content.contraptions.fluids.actors.FillingRecipe; - import net.minecraft.client.resources.ReloadListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index cd070dcbb..654528425 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -8,7 +8,6 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Function; -import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java index 9883870d4..210ba1029 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java @@ -2,12 +2,8 @@ package com.simibubi.create.content.contraptions.relays.elementary; import java.util.Optional; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -16,11 +12,9 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.state.StateContainer.Builder; @@ -29,12 +23,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.shapes.ISelectionContext; -import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java index ccc010a83..030f9ee44 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java @@ -1,8 +1,9 @@ package com.simibubi.create.content.curiosities.zapper; +import java.util.Objects; + import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.networking.NbtPacket; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.foundation.utility.BlockHelper; import net.minecraft.block.BlockState; @@ -12,8 +13,8 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.StairsShape; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; @@ -21,30 +22,21 @@ import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; import net.minecraft.util.math.Vec3d; -import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -@EventBusSubscriber(value = Dist.CLIENT) +@EventBusSubscriber public class ZapperInteractionHandler { - @SubscribeEvent - public static void leftClickingTheZapperSelectsANewBlock(PlayerInteractEvent.LeftClickEmpty event) { - ItemStack heldItem = event.getPlayer() - .getHeldItemMainhand(); - if (heldItem.getItem() instanceof ZapperItem && trySelect(heldItem, event.getPlayer())) - AllPackets.channel.sendToServer(new NbtPacket(heldItem, Hand.MAIN_HAND)); - } - @SubscribeEvent public static void leftClickingBlocksWithTheZapperSelectsTheBlock(PlayerInteractEvent.LeftClickBlock event) { - ItemStack heldItem = event.getPlayer() - .getHeldItemMainhand(); + if (event.getWorld().isRemote) + return; + ItemStack heldItem = event.getPlayer().getHeldItemMainhand(); if (heldItem.getItem() instanceof ZapperItem && trySelect(heldItem, event.getPlayer())) { event.setCancellationResult(ActionResultType.FAIL); event.setCanceled(true); - AllPackets.channel.sendToServer(new NbtPacket(heldItem, Hand.MAIN_HAND)); } } @@ -68,7 +60,7 @@ public class ZapperInteractionHandler { if (BlockHelper.getRequiredItem(newState) .isEmpty()) return false; - if (player.world.getTileEntity(pos) != null) + if (newState.hasTileEntity() && !AllBlockTags.SAFE_NBT.matches(newState)) return false; if (newState.has(BlockStateProperties.DOUBLE_BLOCK_HALF)) return false; @@ -85,14 +77,31 @@ public class ZapperInteractionHandler { if (newState.has(BlockStateProperties.WATERLOGGED)) newState = newState.with(BlockStateProperties.WATERLOGGED, false); + CompoundNBT data = null; + TileEntity tile = player.world.getTileEntity(pos); + if (tile != null) { + data = tile.write(new CompoundNBT()); + data.remove("x"); + data.remove("y"); + data.remove("z"); + data.remove("id"); + } CompoundNBT tag = stack.getOrCreateTag(); - if (tag.contains("BlockUsed") && NBTUtil.readBlockState(stack.getTag() - .getCompound("BlockUsed")) == newState) + if (tag.contains("BlockUsed") + && NBTUtil.readBlockState( + stack.getTag().getCompound("BlockUsed")) == newState + && Objects.equals(data, tag.get("BlockData"))) { return false; + } tag.put("BlockUsed", NBTUtil.writeBlockState(newState)); - player.world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_CONFIRM.get(), + if (data == null) + tag.remove("BlockData"); + else + tag.put("BlockData", data); + player.world.playSound(null, player.getPosition(), AllSoundEvents.BLOCKZAPPER_CONFIRM.get(), SoundCategory.BLOCKS, 0.5f, 0.8f); + return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 37253ceea..7dfb7dc06 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -5,6 +5,7 @@ import java.util.List; import javax.annotation.Nonnull; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.BlockHelper; @@ -23,6 +24,7 @@ import net.minecraft.item.Rarity; import net.minecraft.item.UseAction; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; @@ -35,12 +37,12 @@ import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; @@ -149,6 +151,10 @@ public abstract class ZapperItem extends Item { if (nbt.contains("BlockUsed")) stateToUse = NBTUtil.readBlockState(nbt.getCompound("BlockUsed")); stateToUse = BlockHelper.setZeroAge(stateToUse); + CompoundNBT data = null; + if (AllBlockTags.SAFE_NBT.matches(stateToUse) && nbt.contains("BlockData", NBT.TAG_COMPOUND)) { + data = nbt.getCompound("BlockData"); + } // Raytrace - Find the target Vec3d start = player.getPositionVec() @@ -181,7 +187,7 @@ public abstract class ZapperItem extends Item { } // Server side - if (activate(world, player, item, stateToUse, raytrace)) { + if (activate(world, player, item, stateToUse, raytrace, data)) { applyCooldown(player, item, gunInOtherHand); AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> player), new ZapperBeamPacket(barrelPos, raytrace.getHitVec(), hand, false)); @@ -200,7 +206,7 @@ public abstract class ZapperItem extends Item { } protected abstract boolean activate(World world, PlayerEntity player, ItemStack item, BlockState stateToUse, - BlockRayTraceResult raytrace); + BlockRayTraceResult raytrace, CompoundNBT data); @OnlyIn(Dist.CLIENT) protected abstract void openHandgunGUI(ItemStack item, boolean b); @@ -234,4 +240,16 @@ public abstract class ZapperItem extends Item { return UseAction.NONE; } + public static void setTileData(World world, BlockPos pos, CompoundNBT data) { + if (data != null) { + TileEntity tile = world.getTileEntity(pos); + if (tile != null && !tile.onlyOpsCanSetNbt()) { + data.putInt("x", pos.getX()); + data.putInt("y", pos.getY()); + data.putInt("z", pos.getZ()); + tile.read(data); + } + } + } + } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java index e6051d6de..5e27ad20c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java @@ -22,7 +22,6 @@ import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.RedstoneLampBlock; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; @@ -97,7 +96,7 @@ public class BlockzapperItem extends ZapperItem { @Override protected boolean activate(World world, PlayerEntity player, ItemStack stack, BlockState selectedState, - BlockRayTraceResult raytrace) { + BlockRayTraceResult raytrace, CompoundNBT data) { CompoundNBT nbt = stack.getOrCreateTag(); boolean replace = nbt.contains("Replace") && nbt.getBoolean("Replace"); @@ -136,6 +135,7 @@ public class BlockzapperItem extends ZapperItem { blocksnapshot.restore(true, false); return false; } + setTileData(world, placed, data); if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) { ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java index ad9602f1e..51401b113 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java @@ -4,11 +4,13 @@ import java.util.List; import javax.annotation.Nullable; +import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -34,7 +36,7 @@ public enum TerrainTools { return this != Clear && this != Flatten; } - public void run(World world, List targetPositions, Direction facing, @Nullable BlockState paintedState) { + public void run(World world, List targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data) { switch (this) { case Clear: targetPositions.forEach(p -> world.setBlockState(p, Blocks.AIR.getDefaultState())); @@ -45,6 +47,7 @@ public enum TerrainTools { if (!isReplaceable(toReplace)) return; world.setBlockState(p, paintedState); + ZapperItem.setTileData(world, p, data); }); break; case Flatten: @@ -64,11 +67,13 @@ public enum TerrainTools { if (!isReplaceable(toReplace)) return; world.setBlockState(p, paintedState); + ZapperItem.setTileData(world, p, data); }); break; case Place: targetPositions.forEach(p -> { world.setBlockState(p, paintedState); + ZapperItem.setTileData(world, p, data); }); break; case Replace: @@ -77,6 +82,7 @@ public enum TerrainTools { if (isReplaceable(toReplace)) return; world.setBlockState(p, paintedState); + ZapperItem.setTileData(world, p, data); }); break; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java index 7c7b91e72..9f2e4d019 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java @@ -60,7 +60,7 @@ public class WorldshaperItem extends ZapperItem { @Override protected boolean activate(World world, PlayerEntity player, ItemStack stack, BlockState stateToUse, - BlockRayTraceResult raytrace) { + BlockRayTraceResult raytrace, CompoundNBT data) { BlockPos targetPos = raytrace.getPos(); List affectedPositions = new ArrayList<>(); @@ -77,7 +77,7 @@ public class WorldshaperItem extends ZapperItem { for (BlockPos blockPos : brush.getIncludedPositions()) affectedPositions.add(targetPos.add(blockPos)); PlacementPatterns.applyPattern(affectedPositions, stack); - tool.run(world, affectedPositions, raytrace.getFace(), stateToUse); + tool.run(world, affectedPositions, raytrace.getFace(), stateToUse, data); return true; } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java index efebcdcd7..5502356af 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java @@ -19,6 +19,7 @@ import net.minecraft.nbt.NBTUtil; import net.minecraft.particles.ParticleTypes; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tags.FluidTags; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction.Axis; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; @@ -26,6 +27,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.Constants; public abstract class LaunchedItem { @@ -90,18 +92,27 @@ public abstract class LaunchedItem { public static class ForBlockState extends LaunchedItem { public BlockState state; + public CompoundNBT data; ForBlockState() {} - public ForBlockState(BlockPos start, BlockPos target, ItemStack stack, BlockState state) { + public ForBlockState(BlockPos start, BlockPos target, ItemStack stack, BlockState state, CompoundNBT data) { super(start, target, stack); this.state = state; + this.data = data; } @Override public CompoundNBT serializeNBT() { CompoundNBT serializeNBT = super.serializeNBT(); serializeNBT.put("BlockState", NBTUtil.writeBlockState(state)); + if (data != null) { + data.remove("x"); + data.remove("y"); + data.remove("z"); + data.remove("id"); + serializeNBT.put("Data", data); + } return serializeNBT; } @@ -109,6 +120,9 @@ public abstract class LaunchedItem { void readNBT(CompoundNBT nbt) { super.readNBT(nbt); state = NBTUtil.readBlockState(nbt.getCompound("BlockState")); + if (nbt.contains("Data", Constants.NBT.TAG_COMPOUND)) { + data = nbt.getCompound("Data"); + } } @Override @@ -141,6 +155,15 @@ public abstract class LaunchedItem { return; } world.setBlockState(target, state, 18); + if (data != null) { + TileEntity tile = world.getTileEntity(target); + if (tile != null) { + data.putInt("x", target.getX()); + data.putInt("y", target.getY()); + data.putInt("z", target.getZ()); + tile.read(data); + } + } state.getBlock().onBlockPlacedBy(world, target, state, null, stack); } @@ -165,7 +188,7 @@ public abstract class LaunchedItem { } public ForBelt(BlockPos start, BlockPos target, ItemStack stack, BlockState state, int length) { - super(start, target, stack, state); + super(start, target, stack, state, null); this.length = length; } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index e6a4eb1a9..872b36696 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -3,9 +3,12 @@ package com.simibubi.create.content.schematics.block; import java.util.LinkedList; import java.util.List; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltPart; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; @@ -458,9 +461,17 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (te instanceof BeltTileEntity && AllBlocks.BELT.has(blockState)) launchBelt(target, blockState, ((BeltTileEntity) te).beltLength); else - launchBlock(target, icon, blockState); - } else - launchBlock(target, icon, blockState); + launchBlock(target, icon, blockState, null); + } else { + CompoundNBT data = null; + if (AllBlockTags.SAFE_NBT.matches(blockState)) { + TileEntity tile = blockReader.getTileEntity(target); + if (tile != null && !tile.onlyOpsCanSetNbt()) { + data = tile.write(new CompoundNBT()); + } + } + launchBlock(target, icon, blockState, data); + } printerCooldown = config().schematicannonDelay.get(); fuelLevel -= getFuelUsageRate(); @@ -692,7 +703,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (world == null) return false; BlockState toReplace = world.getBlockState(pos); - boolean placingAir = state.getBlock() == Blocks.AIR; + boolean placingAir = state.getBlock().isAir(state, world, pos); BlockState toReplaceOther = null; if (state.has(BlockStateProperties.BED_PART) && state.has(BlockStateProperties.HORIZONTAL_FACING) && state.get(BlockStateProperties.BED_PART) == BedPart.FOOT) @@ -828,10 +839,10 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC playFiringSound(); } - protected void launchBlock(BlockPos target, ItemStack stack, BlockState state) { - if (state.getBlock() != Blocks.AIR) + protected void launchBlock(BlockPos target, ItemStack stack, BlockState state, @Nullable CompoundNBT data) { + if (state.getBlock().isAir(state, world, target)) blocksPlaced++; - flyingBlocks.add(new LaunchedItem.ForBlockState(this.getPos(), target, stack, state)); + flyingBlocks.add(new LaunchedItem.ForBlockState(this.getPos(), target, stack, state, data)); playFiringSound(); } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 5f5e8c978..a609e7955 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -19,6 +19,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; +import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler; @@ -26,6 +27,8 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -53,6 +56,7 @@ import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.RenderTickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -216,4 +220,12 @@ public class ClientEvents { } } + @SubscribeEvent + public static void leftClickEmpty(PlayerInteractEvent.LeftClickEmpty event) { + ItemStack stack = event.getItemStack(); + if (stack.getItem() instanceof ZapperItem) { + AllPackets.channel.sendToServer(new LeftClickPacket()); + } + } + } diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index e3dd7bf80..e8422f75f 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -8,6 +8,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.fluids.recipe.FluidTransferRecipes; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.wrench.WrenchItem; +import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler; +import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.foundation.command.AllCommands; import com.simibubi.create.foundation.fluid.FluidHelper; @@ -19,7 +21,9 @@ import com.simibubi.create.foundation.utility.recipe.RecipeFinder; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.fluid.IFluidState; +import net.minecraft.item.ItemStack; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.tags.FluidTags; import net.minecraft.util.Direction; @@ -159,4 +163,11 @@ public class CommonEvents { CapabilityMinecartController.startTracking(event); } + public static void leftClickEmpty(ServerPlayerEntity player) { + ItemStack stack = player.getHeldItemMainhand(); + if (stack.getItem() instanceof ZapperItem) { + ZapperInteractionHandler.trySelect(stack, player); + } + } + } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 0d4dbf5fa..94222fb36 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -64,6 +64,7 @@ public enum AllPackets { MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new), SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new), + LEFT_CLICK(LeftClickPacket.class, LeftClickPacket::new), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new), diff --git a/src/main/java/com/simibubi/create/foundation/networking/LeftClickPacket.java b/src/main/java/com/simibubi/create/foundation/networking/LeftClickPacket.java new file mode 100644 index 000000000..8ce69099b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/networking/LeftClickPacket.java @@ -0,0 +1,32 @@ +package com.simibubi.create.foundation.networking; + +import java.util.function.Supplier; + +import com.simibubi.create.events.CommonEvents; + +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkDirection; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class LeftClickPacket extends SimplePacketBase { + + public LeftClickPacket() { + } + + LeftClickPacket(PacketBuffer buffer) { + } + + @Override + public void write(PacketBuffer buffer) { + } + + @Override + public void handle(Supplier context) { + Context ctx = context.get(); + if (ctx.getDirection() != NetworkDirection.PLAY_TO_SERVER) + return; + ctx.enqueueWork(() -> CommonEvents.leftClickEmpty(ctx.getSender())); + ctx.setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 651fd7828..871c126ce 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -1,9 +1,8 @@ package com.simibubi.create.foundation.tileEntity.behaviour.linked; -import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.Supplier; - +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.Create; @@ -35,8 +34,8 @@ public class LinkBehaviour extends TileEntityBehaviour { public boolean newPosition; private Mode mode; - private Supplier transmission; - private Consumer signalCallback; + private IntSupplier transmission; + private IntConsumer signalCallback; protected LinkBehaviour(SmartTileEntity te, Pair slots) { super(te); @@ -49,7 +48,7 @@ public class LinkBehaviour extends TileEntityBehaviour { } public static LinkBehaviour receiver(SmartTileEntity te, Pair slots, - Consumer signalCallback) { + IntConsumer signalCallback) { LinkBehaviour behaviour = new LinkBehaviour(te, slots); behaviour.signalCallback = signalCallback; behaviour.mode = Mode.RECEIVE; @@ -57,7 +56,7 @@ public class LinkBehaviour extends TileEntityBehaviour { } public static LinkBehaviour transmitter(SmartTileEntity te, Pair slots, - Supplier transmission) { + IntSupplier transmission) { LinkBehaviour behaviour = new LinkBehaviour(te, slots); behaviour.transmission = transmission; behaviour.mode = Mode.TRANSMIT; @@ -81,7 +80,7 @@ public class LinkBehaviour extends TileEntityBehaviour { } public int getTransmittedStrength() { - return mode == Mode.TRANSMIT ? transmission.get() : 0; + return mode == Mode.TRANSMIT ? transmission.getAsInt() : 0; } public void updateReceiver(int networkPower) {