Merge pull request #533 from Creators-of-Create/mc1.15/safe-nbt

Safe NBT tag
This commit is contained in:
simibubi 2020-12-12 15:37:44 +01:00 committed by GitHub
commit a26988db70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 224 additions and 66 deletions

View file

@ -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"
]
}

View file

@ -320,6 +320,7 @@ public class AllBlocks {
public static final BlockEntry<CreativeMotorBlock> 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<FluidTankBlock> 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<FluidTankBlock> 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<MechanicalPistonBlock> MECHANICAL_PISTON =
REGISTRATE.block("mechanical_piston", MechanicalPistonBlock::normal)
.transform(BuilderTransformers.mechanicalPiston(PistonType.DEFAULT))
.tag(AllBlockTags.SAFE_NBT.tag)
.register();
public static final BlockEntry<MechanicalPistonBlock> 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<PistonExtensionPoleBlock> PISTON_EXTENSION_POLE =
@ -670,6 +675,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalPistonHeadBlock> 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<MechanicalBearingBlock> 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<PulleyBlock> 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<LinearChassisBlock> 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<LinearChassisBlock> 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<RadialChassisBlock> 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<SequencedGearshiftBlock> 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<SpeedControllerBlock> 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<AndesiteFunnelBlock> 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<AndesiteBeltFunnelBlock> 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<BrassFunnelBlock> 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<BrassBeltFunnelBlock> 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<CreativeCrateBlock> CREATIVE_CRATE =
REGISTRATE.block("creative_crate", CreativeCrateBlock::new)
.transform(BuilderTransformers.crate("creative"))
.tag(AllBlockTags.SAFE_NBT.tag)
.register();
public static final BlockEntry<NixieTubeBlock> NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new)
@ -1107,7 +1127,7 @@ public class AllBlocks {
public static final BlockEntry<RedstoneLinkBlock> 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<AnalogLeverBlock> 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<AdjustableRepeaterBlock> 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<AdjustableRepeaterBlock> 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()

View file

@ -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
;

View file

@ -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 {

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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);
}
}
}
}

View file

@ -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;

View file

@ -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<BlockPos> targetPositions, Direction facing, @Nullable BlockState paintedState) {
public void run(World world, List<BlockPos> 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;
}

View file

@ -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<BlockPos> 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;
}

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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());
}
}
}

View file

@ -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);
}
}
}

View file

@ -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),

View file

@ -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) {
Context ctx = context.get();
if (ctx.getDirection() != NetworkDirection.PLAY_TO_SERVER)
return;
ctx.enqueueWork(() -> CommonEvents.leftClickEmpty(ctx.getSender()));
ctx.setPacketHandled(true);
}
}

View file

@ -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<Integer> transmission;
private Consumer<Integer> signalCallback;
private IntSupplier transmission;
private IntConsumer signalCallback;
protected LinkBehaviour(SmartTileEntity te, Pair<ValueBoxTransform, ValueBoxTransform> slots) {
super(te);
@ -49,7 +48,7 @@ public class LinkBehaviour extends TileEntityBehaviour {
}
public static LinkBehaviour receiver(SmartTileEntity te, Pair<ValueBoxTransform, ValueBoxTransform> slots,
Consumer<Integer> 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<ValueBoxTransform, ValueBoxTransform> slots,
Supplier<Integer> 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) {