MinecartDispenseItemBehavior.java

net.minecraft.core.dispenser.MinecartDispenseItemBehavior

信息

  • 全限定名:net.minecraft.core.dispenser.MinecartDispenseItemBehavior
  • 类型:public class
  • 包:net.minecraft.core.dispenser
  • 源码路径:src/main/java/net/minecraft/core/dispenser/MinecartDispenseItemBehavior.java
  • 起始行号:L17
  • 继承:DefaultDispenseItemBehavior
  • 职责:

    TODO

字段/常量

  • defaultDispenseItemBehavior

    • 类型: DefaultDispenseItemBehavior
    • 修饰符: private final
    • 源码定位: L18
    • 说明:

      TODO

  • entityType

    • 类型: EntityType<?extends AbstractMinecart>
    • 修饰符: private final
    • 源码定位: L19
    • 说明:

      TODO

内部类/嵌套类型

构造器

public MinecartDispenseItemBehavior(EntityType<?extends AbstractMinecart> entityType) @ L21

  • 构造器名:MinecartDispenseItemBehavior
  • 源码定位:L21
  • 修饰符:public

参数:

  • entityType: EntityType<?extends AbstractMinecart>

说明:

TODO

方法

下面的方法块按源码顺序生成。

public ItemStack execute(BlockSource source, ItemStack dispensed) @ L25

  • 方法名:execute
  • 源码定位:L25
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • source: BlockSource
  • dispensed: ItemStack

说明:

TODO

private static RailShape getRailShape(BlockState blockFront) @ L71

  • 方法名:getRailShape
  • 源码定位:L71
  • 返回类型:RailShape
  • 修饰符:private static

参数:

  • blockFront: BlockState

说明:

TODO

protected void playSound(BlockSource source) @ L75

  • 方法名:playSound
  • 源码定位:L75
  • 返回类型:void
  • 修饰符:protected

参数:

  • source: BlockSource

说明:

TODO

代码

public class MinecartDispenseItemBehavior extends DefaultDispenseItemBehavior {
    private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
    private final EntityType<? extends AbstractMinecart> entityType;
 
    public MinecartDispenseItemBehavior(EntityType<? extends AbstractMinecart> entityType) {
        this.entityType = entityType;
    }
 
    @Override
    public ItemStack execute(BlockSource source, ItemStack dispensed) {
        Direction direction = source.state().getValue(DispenserBlock.FACING);
        ServerLevel level = source.level();
        Vec3 center = source.center();
        double spawnX = center.x() + direction.getStepX() * 1.125;
        double spawnY = Math.floor(center.y()) + direction.getStepY();
        double spawnZ = center.z() + direction.getStepZ() * 1.125;
        BlockPos front = source.pos().relative(direction);
        BlockState blockFront = level.getBlockState(front);
        double yOffset;
        if (blockFront.is(BlockTags.RAILS)) {
            if (getRailShape(blockFront).isSlope()) {
                yOffset = 0.6;
            } else {
                yOffset = 0.1;
            }
        } else {
            if (!blockFront.isAir()) {
                return this.defaultDispenseItemBehavior.dispense(source, dispensed);
            }
 
            BlockState blockBelow = level.getBlockState(front.below());
            if (!blockBelow.is(BlockTags.RAILS)) {
                return this.defaultDispenseItemBehavior.dispense(source, dispensed);
            }
 
            if (direction != Direction.DOWN && getRailShape(blockBelow).isSlope()) {
                yOffset = -0.4;
            } else {
                yOffset = -0.9;
            }
        }
 
        Vec3 spawnPos = new Vec3(spawnX, spawnY + yOffset, spawnZ);
        AbstractMinecart minecart = AbstractMinecart.createMinecart(
            level, spawnPos.x, spawnPos.y, spawnPos.z, this.entityType, EntitySpawnReason.DISPENSER, dispensed, null
        );
        if (minecart != null) {
            level.addFreshEntity(minecart);
            dispensed.shrink(1);
        }
 
        return dispensed;
    }
 
    private static RailShape getRailShape(BlockState blockFront) {
        return blockFront.getBlock() instanceof BaseRailBlock railBlock ? blockFront.getValue(railBlock.getShapeProperty()) : RailShape.NORTH_SOUTH;
    }
 
    @Override
    protected void playSound(BlockSource source) {
        source.level().levelEvent(1000, source.pos(), 0);
    }
}

引用的其他类