DefaultDispenseItemBehavior.java

net.minecraft.core.dispenser.DefaultDispenseItemBehavior

信息

  • 全限定名:net.minecraft.core.dispenser.DefaultDispenseItemBehavior
  • 类型:public class
  • 包:net.minecraft.core.dispenser
  • 源码路径:src/main/java/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java
  • 起始行号:L11
  • 实现:DispenseItemBehavior
  • 职责:

    TODO

字段/常量

  • DEFAULT_ACCURACY
    • 类型: int
    • 修饰符: private static final
    • 源码定位: L12
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

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

public final ItemStack dispense(BlockSource source, ItemStack dispensed) @ L14

  • 方法名:dispense
  • 源码定位:L14
  • 返回类型:ItemStack
  • 修饰符:public final

参数:

  • source: BlockSource
  • dispensed: ItemStack

说明:

TODO

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

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

参数:

  • source: BlockSource
  • dispensed: ItemStack

说明:

TODO

public static void spawnItem(Level level, ItemStack itemStack, int accuracy, Direction direction, Position position) @ L30

  • 方法名:spawnItem
  • 源码定位:L30
  • 返回类型:void
  • 修饰符:public static

参数:

  • level: Level
  • itemStack: ItemStack
  • accuracy: int
  • direction: Direction
  • position: Position

说明:

TODO

protected void playSound(BlockSource source) @ L51

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

参数:

  • source: BlockSource

说明:

TODO

protected void playAnimation(BlockSource source, Direction direction) @ L55

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

参数:

  • source: BlockSource
  • direction: Direction

说明:

TODO

private static void playDefaultSound(BlockSource source) @ L59

  • 方法名:playDefaultSound
  • 源码定位:L59
  • 返回类型:void
  • 修饰符:private static

参数:

  • source: BlockSource

说明:

TODO

private static void playDefaultAnimation(BlockSource source, Direction direction) @ L63

  • 方法名:playDefaultAnimation
  • 源码定位:L63
  • 返回类型:void
  • 修饰符:private static

参数:

  • source: BlockSource
  • direction: Direction

说明:

TODO

protected ItemStack consumeWithRemainder(BlockSource source, ItemStack dispensed, ItemStack remainder) @ L67

  • 方法名:consumeWithRemainder
  • 源码定位:L67
  • 返回类型:ItemStack
  • 修饰符:protected

参数:

  • source: BlockSource
  • dispensed: ItemStack
  • remainder: ItemStack

说明:

TODO

private void addToInventoryOrDispense(BlockSource source, ItemStack itemStack) @ L77

  • 方法名:addToInventoryOrDispense
  • 源码定位:L77
  • 返回类型:void
  • 修饰符:private

参数:

  • source: BlockSource
  • itemStack: ItemStack

说明:

TODO

代码

public class DefaultDispenseItemBehavior implements DispenseItemBehavior {
    private static final int DEFAULT_ACCURACY = 6;
 
    @Override
    public final ItemStack dispense(BlockSource source, ItemStack dispensed) {
        ItemStack result = this.execute(source, dispensed);
        this.playSound(source);
        this.playAnimation(source, source.state().getValue(DispenserBlock.FACING));
        return result;
    }
 
    protected ItemStack execute(BlockSource source, ItemStack dispensed) {
        Direction direction = source.state().getValue(DispenserBlock.FACING);
        Position position = DispenserBlock.getDispensePosition(source);
        ItemStack itemStack = dispensed.split(1);
        spawnItem(source.level(), itemStack, 6, direction, position);
        return dispensed;
    }
 
    public static void spawnItem(Level level, ItemStack itemStack, int accuracy, Direction direction, Position position) {
        double spawnX = position.x();
        double spawnY = position.y();
        double spawnZ = position.z();
        if (direction.getAxis() == Direction.Axis.Y) {
            spawnY -= 0.125;
        } else {
            spawnY -= 0.15625;
        }
 
        ItemEntity itemEntity = new ItemEntity(level, spawnX, spawnY, spawnZ, itemStack);
        RandomSource random = level.getRandom();
        double pow = random.nextDouble() * 0.1 + 0.2;
        itemEntity.setDeltaMovement(
            random.triangle(direction.getStepX() * pow, 0.0172275 * accuracy),
            random.triangle(0.2, 0.0172275 * accuracy),
            random.triangle(direction.getStepZ() * pow, 0.0172275 * accuracy)
        );
        level.addFreshEntity(itemEntity);
    }
 
    protected void playSound(BlockSource source) {
        playDefaultSound(source);
    }
 
    protected void playAnimation(BlockSource source, Direction direction) {
        playDefaultAnimation(source, direction);
    }
 
    private static void playDefaultSound(BlockSource source) {
        source.level().levelEvent(1000, source.pos(), 0);
    }
 
    private static void playDefaultAnimation(BlockSource source, Direction direction) {
        source.level().levelEvent(2000, source.pos(), direction.get3DDataValue());
    }
 
    protected ItemStack consumeWithRemainder(BlockSource source, ItemStack dispensed, ItemStack remainder) {
        dispensed.shrink(1);
        if (dispensed.isEmpty()) {
            return remainder;
        } else {
            this.addToInventoryOrDispense(source, remainder);
            return dispensed;
        }
    }
 
    private void addToInventoryOrDispense(BlockSource source, ItemStack itemStack) {
        ItemStack remainder = source.blockEntity().insertItem(itemStack);
        if (!remainder.isEmpty()) {
            Direction direction = source.state().getValue(DispenserBlock.FACING);
            spawnItem(source.level(), remainder, 6, direction, DispenserBlock.getDispensePosition(source));
            playDefaultSound(source);
            playDefaultAnimation(source, direction);
        }
    }
}

引用的其他类