Spaces:
Build error
Build error
package net.minecraft.world.item; | |
import java.util.List; | |
import java.util.Map; | |
import javax.annotation.Nullable; | |
import net.minecraft.advancements.CriteriaTriggers; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.core.component.DataComponents; | |
import net.minecraft.core.registries.Registries; | |
import net.minecraft.nbt.CompoundTag; | |
import net.minecraft.network.chat.Component; | |
import net.minecraft.server.level.ServerPlayer; | |
import net.minecraft.sounds.SoundEvent; | |
import net.minecraft.sounds.SoundSource; | |
import net.minecraft.world.InteractionResult; | |
import net.minecraft.world.entity.item.ItemEntity; | |
import net.minecraft.world.entity.player.Player; | |
import net.minecraft.world.flag.FeatureFlagSet; | |
import net.minecraft.world.item.component.BlockItemStateProperties; | |
import net.minecraft.world.item.component.CustomData; | |
import net.minecraft.world.item.component.ItemContainerContents; | |
import net.minecraft.world.item.context.BlockPlaceContext; | |
import net.minecraft.world.item.context.UseOnContext; | |
import net.minecraft.world.level.Level; | |
import net.minecraft.world.level.block.Block; | |
import net.minecraft.world.level.block.ShulkerBoxBlock; | |
import net.minecraft.world.level.block.SoundType; | |
import net.minecraft.world.level.block.entity.BlockEntity; | |
import net.minecraft.world.level.block.entity.BlockEntityType; | |
import net.minecraft.world.level.block.state.BlockState; | |
import net.minecraft.world.level.gameevent.GameEvent; | |
import net.minecraft.world.phys.shapes.CollisionContext; | |
public class BlockItem extends Item { | |
private final Block block; | |
public BlockItem(Block p_40565_, Item.Properties p_40566_) { | |
super(p_40566_); | |
this.block = p_40565_; | |
} | |
public InteractionResult useOn(UseOnContext p_40581_) { | |
InteractionResult interactionresult = this.place(new BlockPlaceContext(p_40581_)); | |
return !interactionresult.consumesAction() && p_40581_.getItemInHand().has(DataComponents.CONSUMABLE) | |
? super.use(p_40581_.getLevel(), p_40581_.getPlayer(), p_40581_.getHand()) | |
: interactionresult; | |
} | |
public InteractionResult place(BlockPlaceContext p_40577_) { | |
if (!this.getBlock().isEnabled(p_40577_.getLevel().enabledFeatures())) { | |
return InteractionResult.FAIL; | |
} else if (!p_40577_.canPlace()) { | |
return InteractionResult.FAIL; | |
} else { | |
BlockPlaceContext blockplacecontext = this.updatePlacementContext(p_40577_); | |
if (blockplacecontext == null) { | |
return InteractionResult.FAIL; | |
} else { | |
BlockState blockstate = this.getPlacementState(blockplacecontext); | |
if (blockstate == null) { | |
return InteractionResult.FAIL; | |
} else if (!this.placeBlock(blockplacecontext, blockstate)) { | |
return InteractionResult.FAIL; | |
} else { | |
BlockPos blockpos = blockplacecontext.getClickedPos(); | |
Level level = blockplacecontext.getLevel(); | |
Player player = blockplacecontext.getPlayer(); | |
ItemStack itemstack = blockplacecontext.getItemInHand(); | |
BlockState blockstate1 = level.getBlockState(blockpos); | |
if (blockstate1.is(blockstate.getBlock())) { | |
blockstate1 = this.updateBlockStateFromTag(blockpos, level, itemstack, blockstate1); | |
this.updateCustomBlockEntityTag(blockpos, level, player, itemstack, blockstate1); | |
updateBlockEntityComponents(level, blockpos, itemstack); | |
blockstate1.getBlock().setPlacedBy(level, blockpos, blockstate1, player, itemstack); | |
if (player instanceof ServerPlayer) { | |
CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer)player, blockpos, itemstack); | |
} | |
} | |
SoundType soundtype = blockstate1.getSoundType(); | |
level.playSound( | |
player, blockpos, this.getPlaceSound(blockstate1), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F | |
); | |
level.gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(player, blockstate1)); | |
itemstack.consume(1, player); | |
return InteractionResult.SUCCESS; | |
} | |
} | |
} | |
} | |
protected SoundEvent getPlaceSound(BlockState p_40588_) { | |
return p_40588_.getSoundType().getPlaceSound(); | |
} | |
public BlockPlaceContext updatePlacementContext(BlockPlaceContext p_40609_) { | |
return p_40609_; | |
} | |
private static void updateBlockEntityComponents(Level p_333389_, BlockPos p_335748_, ItemStack p_334527_) { | |
BlockEntity blockentity = p_333389_.getBlockEntity(p_335748_); | |
if (blockentity != null) { | |
blockentity.applyComponentsFromItemStack(p_334527_); | |
blockentity.setChanged(); | |
} | |
} | |
protected boolean updateCustomBlockEntityTag(BlockPos p_40597_, Level p_40598_, { Player p_40599_, ItemStack p_40600_, BlockState p_40601_) | |
return updateCustomBlockEntityTag(p_40598_, p_40599_, p_40597_, p_40600_); | |
} | |
protected BlockState getPlacementState(BlockPlaceContext p_40613_) { | |
BlockState blockstate = this.getBlock().getStateForPlacement(p_40613_); | |
return blockstate != null && this.canPlace(p_40613_, blockstate) ? blockstate : null; | |
} | |
private BlockState updateBlockStateFromTag(BlockPos p_40603_, Level p_40604_, ItemStack p_40605_, BlockState p_40606_) { | |
BlockItemStateProperties blockitemstateproperties = p_40605_.getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY); | |
if (blockitemstateproperties.isEmpty()) { | |
return p_40606_; | |
} else { | |
BlockState blockstate = blockitemstateproperties.apply(p_40606_); | |
if (blockstate != p_40606_) { | |
p_40604_.setBlock(p_40603_, blockstate, 2); | |
} | |
return blockstate; | |
} | |
} | |
protected boolean canPlace(BlockPlaceContext p_40611_, BlockState p_40612_) { | |
Player player = p_40611_.getPlayer(); | |
CollisionContext collisioncontext = player == null ? CollisionContext.empty() : CollisionContext.of(player); | |
return (!this.mustSurvive() || p_40612_.canSurvive(p_40611_.getLevel(), p_40611_.getClickedPos())) | |
&& p_40611_.getLevel().isUnobstructed(p_40612_, p_40611_.getClickedPos(), collisioncontext); | |
} | |
protected boolean mustSurvive() { | |
return true; | |
} | |
protected boolean placeBlock(BlockPlaceContext p_40578_, BlockState p_40579_) { | |
return p_40578_.getLevel().setBlock(p_40578_.getClickedPos(), p_40579_, 11); | |
} | |
public static boolean updateCustomBlockEntityTag(Level p_40583_, { Player p_40584_, BlockPos p_40585_, ItemStack p_40586_) | |
if (p_40583_.isClientSide) { | |
return false; | |
} else { | |
CustomData customdata = p_40586_.getOrDefault(DataComponents.BLOCK_ENTITY_DATA, CustomData.EMPTY); | |
if (!customdata.isEmpty()) { | |
BlockEntityType<?> blockentitytype = customdata.parseEntityType(p_40583_.registryAccess(), Registries.BLOCK_ENTITY_TYPE); | |
if (blockentitytype == null) { | |
return false; | |
} | |
BlockEntity blockentity = p_40583_.getBlockEntity(p_40585_); | |
if (blockentity != null) { | |
BlockEntityType<?> blockentitytype1 = blockentity.getType(); | |
if (blockentitytype1 != blockentitytype) { | |
return false; | |
} | |
if (!blockentitytype1.onlyOpCanSetNbt() || p_40584_ != null && p_40584_.canUseGameMasterBlocks()) { | |
return customdata.loadInto(blockentity, p_40583_.registryAccess()); | |
} | |
return false; | |
} | |
} | |
return false; | |
} | |
} | |
public void appendHoverText(ItemStack p_40572_, Item.TooltipContext p_327780_, List<Component> p_40574_, TooltipFlag p_40575_) { | |
super.appendHoverText(p_40572_, p_327780_, p_40574_, p_40575_); | |
this.getBlock().appendHoverText(p_40572_, p_327780_, p_40574_, p_40575_); | |
} | |
public boolean shouldPrintOpWarning(ItemStack p_377642_, { Player p_377092_) | |
if (p_377092_ != null && p_377092_.getPermissionLevel() >= 2) { | |
CustomData customdata = p_377642_.get(DataComponents.BLOCK_ENTITY_DATA); | |
if (customdata != null) { | |
BlockEntityType<?> blockentitytype = customdata.parseEntityType(p_377092_.level().registryAccess(), Registries.BLOCK_ENTITY_TYPE); | |
return blockentitytype != null && blockentitytype.onlyOpCanSetNbt(); | |
} | |
} | |
return false; | |
} | |
public Block getBlock() { | |
return this.block; | |
} | |
public void registerBlocks(Map<Block, Item> p_40607_, Item p_40608_) { | |
p_40607_.put(this.getBlock(), p_40608_); | |
} | |
public boolean canFitInsideContainerItems() { | |
return !(this.getBlock() instanceof ShulkerBoxBlock); | |
} | |
public void onDestroyed(ItemEntity p_150700_) { | |
ItemContainerContents itemcontainercontents = p_150700_.getItem().set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); | |
if (itemcontainercontents != null) { | |
ItemUtils.onContainerDestroyed(p_150700_, itemcontainercontents.nonEmptyItemsCopy()); | |
} | |
} | |
public static void setBlockEntityData(ItemStack p_186339_, BlockEntityType<?> p_186340_, CompoundTag p_186341_) { | |
p_186341_.remove("id"); | |
if (p_186341_.isEmpty()) { | |
p_186339_.remove(DataComponents.BLOCK_ENTITY_DATA); | |
} else { | |
BlockEntity.addEntityType(p_186341_, p_186340_); | |
p_186339_.set(DataComponents.BLOCK_ENTITY_DATA, CustomData.of(p_186341_)); | |
} | |
} | |
public FeatureFlagSet requiredFeatures() { | |
return this.getBlock().requiredFeatures(); | |
} | |
} |