BoatDispenseItemBehavior.java

net.minecraft.core.dispenser.BoatDispenseItemBehavior

信息

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

    TODO

字段/常量

  • defaultDispenseItemBehavior

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

      TODO

  • type

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

      TODO

内部类/嵌套类型

构造器

public BoatDispenseItemBehavior(EntityType<?extends AbstractBoat> type) @ L18

  • 构造器名:BoatDispenseItemBehavior
  • 源码定位:L18
  • 修饰符:public

参数:

  • type: EntityType<?extends AbstractBoat>

说明:

TODO

方法

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

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

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

参数:

  • source: BlockSource
  • dispensed: ItemStack

说明:

TODO

protected void playSound(BlockSource source) @ L55

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

参数:

  • source: BlockSource

说明:

TODO

代码

public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
    private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
    private final EntityType<? extends AbstractBoat> type;
 
    public BoatDispenseItemBehavior(EntityType<? extends AbstractBoat> type) {
        this.type = type;
    }
 
    @Override
    public ItemStack execute(BlockSource source, ItemStack dispensed) {
        Direction direction = source.state().getValue(DispenserBlock.FACING);
        ServerLevel level = source.level();
        Vec3 center = source.center();
        double justOutsideDispenser = 0.5625 + this.type.getWidth() / 2.0;
        double spawnX = center.x() + direction.getStepX() * justOutsideDispenser;
        double spawnY = center.y() + direction.getStepY() * 1.125F;
        double spawnZ = center.z() + direction.getStepZ() * justOutsideDispenser;
        BlockPos frontPos = source.pos().relative(direction);
        double yOffset;
        if (level.getFluidState(frontPos).is(FluidTags.WATER)) {
            yOffset = 1.0;
        } else {
            if (!level.getBlockState(frontPos).isAir() || !level.getFluidState(frontPos.below()).is(FluidTags.WATER)) {
                return this.defaultDispenseItemBehavior.dispense(source, dispensed);
            }
 
            yOffset = 0.0;
        }
 
        AbstractBoat boat = this.type.create(level, EntitySpawnReason.DISPENSER);
        if (boat != null) {
            boat.setInitialPos(spawnX, spawnY + yOffset, spawnZ);
            EntityType.<AbstractBoat>createDefaultStackConfig(level, dispensed, null).accept(boat);
            boat.setYRot(direction.toYRot());
            level.addFreshEntity(boat);
            dispensed.shrink(1);
        }
 
        return dispensed;
    }
 
    @Override
    protected void playSound(BlockSource source) {
        source.level().levelEvent(1000, source.pos(), 0);
    }
}

引用的其他类