/* * Decompiled with CFR 0.152. */ package net.minecraft.world.item; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; import net.minecraft.tags.StructureTags; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.EyeOfEnder; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EndPortalFrameBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.pattern.BlockPattern; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; public class EnderEyeItem extends Item { public EnderEyeItem(Item.Properties properties) { super(properties); } @Override public InteractionResult useOn(UseOnContext context) { BlockPos pos; Level level = context.getLevel(); BlockState targetState = level.getBlockState(pos = context.getClickedPos()); if (!targetState.is(Blocks.END_PORTAL_FRAME) || targetState.getValue(EndPortalFrameBlock.HAS_EYE).booleanValue()) { return InteractionResult.PASS; } if (level.isClientSide()) { return InteractionResult.SUCCESS; } BlockState newState = (BlockState)targetState.setValue(EndPortalFrameBlock.HAS_EYE, true); Block.pushEntitiesUp(targetState, newState, level, pos); level.setBlock(pos, newState, 2); level.updateNeighbourForOutputSignal(pos, Blocks.END_PORTAL_FRAME); context.getItemInHand().shrink(1); level.levelEvent(1503, pos, 0); BlockPattern.BlockPatternMatch match = EndPortalFrameBlock.getOrCreatePortalShape().find(level, pos); if (match != null) { BlockPos blockPos = match.getFrontTopLeft().offset(-3, 0, -3); for (int x = 0; x < 3; ++x) { for (int z = 0; z < 3; ++z) { BlockPos portalBlockPos = blockPos.offset(x, 0, z); level.destroyBlock(portalBlockPos, true, null); level.setBlock(portalBlockPos, Blocks.END_PORTAL.defaultBlockState(), 2); } } level.globalLevelEvent(1038, blockPos.offset(1, 0, 1), 0); } return InteractionResult.SUCCESS; } @Override public int getUseDuration(ItemStack itemStack, LivingEntity user) { return 0; } @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemStack = player.getItemInHand(hand); BlockHitResult hitResult = EnderEyeItem.getPlayerPOVHitResult(level, player, ClipContext.Fluid.NONE); if (hitResult.getType() == HitResult.Type.BLOCK && level.getBlockState(hitResult.getBlockPos()).is(Blocks.END_PORTAL_FRAME)) { return InteractionResult.PASS; } player.startUsingItem(hand); if (level instanceof ServerLevel) { ServerLevel serverLevel = (ServerLevel)level; BlockPos nearestMapFeature = serverLevel.findNearestMapStructure(StructureTags.EYE_OF_ENDER_LOCATED, player.blockPosition(), 100, false); if (nearestMapFeature == null) { return InteractionResult.CONSUME; } EyeOfEnder eyeOfEnder = new EyeOfEnder(level, player.getX(), player.getY(0.5), player.getZ()); eyeOfEnder.setItem(itemStack); eyeOfEnder.signalTo(Vec3.atLowerCornerOf(nearestMapFeature)); level.gameEvent(GameEvent.PROJECTILE_SHOOT, eyeOfEnder.position(), GameEvent.Context.of(player)); level.addFreshEntity(eyeOfEnder); if (player instanceof ServerPlayer) { ServerPlayer serverPlayer = (ServerPlayer)player; CriteriaTriggers.USED_ENDER_EYE.trigger(serverPlayer, nearestMapFeature); } float pitch = Mth.lerp(level.random.nextFloat(), 0.33f, 0.5f); level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENDER_EYE_LAUNCH, SoundSource.NEUTRAL, 1.0f, pitch); itemStack.consume(1, player); player.awardStat(Stats.ITEM_USED.get(this)); } return InteractionResult.SUCCESS_SERVER; } }