minecraft-source/src/net/minecraft/world/item/MinecartItem.java

106 lines
4.9 KiB
Java

package net.minecraft.world.item;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.core.Direction;
import net.minecraft.core.BlockSource;
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.state.properties.RailShape;
import net.minecraft.world.level.block.BaseRailBlock;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.core.dispenser.DispenseItemBehavior;
public class MinecartItem extends Item {
private static final DispenseItemBehavior DISPENSE_ITEM_BEHAVIOR;
private final AbstractMinecart.Type type;
public MinecartItem(final AbstractMinecart.Type a, final Properties a) {
super(a);
this.type = a;
DispenserBlock.registerBehavior(this, MinecartItem.DISPENSE_ITEM_BEHAVIOR);
}
@Override
public InteractionResult useOn(final UseOnContext bfw) {
final Level bjt3 = bfw.getLevel();
final BlockPos fk4 = bfw.getClickedPos();
final BlockState byg5 = bjt3.getBlockState(fk4);
if (!byg5.is(BlockTags.RAILS)) {
return InteractionResult.FAIL;
}
final ItemStack bek6 = bfw.getItemInHand();
if (!bjt3.isClientSide) {
final RailShape bzk7 = (byg5.getBlock() instanceof BaseRailBlock) ? byg5.<RailShape>getValue(((BaseRailBlock)byg5.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH;
double double8 = 0.0;
if (bzk7.isAscending()) {
double8 = 0.5;
}
final AbstractMinecart azu10 = AbstractMinecart.createMinecart(bjt3, fk4.getX() + 0.5, fk4.getY() + 0.0625 + double8, fk4.getZ() + 0.5, this.type);
if (bek6.hasCustomHoverName()) {
azu10.setCustomName(bek6.getHoverName());
}
bjt3.addFreshEntity(azu10);
}
bek6.shrink(1);
return InteractionResult.SUCCESS;
}
static {
DISPENSE_ITEM_BEHAVIOR = new DefaultDispenseItemBehavior() {
private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
public ItemStack execute(final BlockSource fl, final ItemStack bek) {
final Direction fp4 = fl.getBlockState().<Direction>getValue((Property<Direction>)DispenserBlock.FACING);
final Level bjt5 = fl.getLevel();
final double double6 = fl.x() + fp4.getStepX() * 1.125;
final double double7 = Math.floor(fl.y()) + fp4.getStepY();
final double double8 = fl.z() + fp4.getStepZ() * 1.125;
final BlockPos fk12 = fl.getPos().relative(fp4);
final BlockState byg13 = bjt5.getBlockState(fk12);
final RailShape bzk14 = (byg13.getBlock() instanceof BaseRailBlock) ? byg13.<RailShape>getValue(((BaseRailBlock)byg13.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH;
double double9;
if (byg13.is(BlockTags.RAILS)) {
if (bzk14.isAscending()) {
double9 = 0.6;
}
else {
double9 = 0.1;
}
}
else {
if (!byg13.isAir() || !bjt5.getBlockState(fk12.below()).is(BlockTags.RAILS)) {
return this.defaultDispenseItemBehavior.dispense(fl, bek);
}
final BlockState byg14 = bjt5.getBlockState(fk12.below());
final RailShape bzk15 = (byg14.getBlock() instanceof BaseRailBlock) ? byg14.<RailShape>getValue(((BaseRailBlock)byg14.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH;
if (fp4 == Direction.DOWN || !bzk15.isAscending()) {
double9 = -0.9;
}
else {
double9 = -0.4;
}
}
final AbstractMinecart azu17 = AbstractMinecart.createMinecart(bjt5, double6, double7 + double9, double8, ((MinecartItem)bek.getItem()).type);
if (bek.hasCustomHoverName()) {
azu17.setCustomName(bek.getHoverName());
}
bjt5.addFreshEntity(azu17);
bek.shrink(1);
return bek;
}
@Override
protected void playSound(final BlockSource fl) {
fl.getLevel().levelEvent(1000, fl.getPos(), 0);
}
};
}
}