BlockBasedTestInstance.java

net.minecraft.gametest.framework.BlockBasedTestInstance

信息

  • 全限定名:net.minecraft.gametest.framework.BlockBasedTestInstance
  • 类型:public class
  • 包:net.minecraft.gametest.framework
  • 源码路径:src/main/java/net/minecraft/gametest/framework/BlockBasedTestInstance.java
  • 起始行号:L18
  • 继承:GameTestInstance
  • 职责:

    TODO

字段/常量

  • CODEC
    • 类型: MapCodec<BlockBasedTestInstance>
    • 修饰符: public static final
    • 源码定位: L19
    • 说明:

      TODO

内部类/嵌套类型

构造器

public BlockBasedTestInstance(TestData<Holder<TestEnvironmentDefinition<?>>> testData) @ L23

  • 构造器名:BlockBasedTestInstance
  • 源码定位:L23
  • 修饰符:public

参数:

  • testData: TestData<Holder<TestEnvironmentDefinition<?>>>

说明:

TODO

方法

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

public void run(GameTestHelper helper) @ L27

  • 方法名:run
  • 源码定位:L27
  • 返回类型:void
  • 修饰符:public

参数:

  • helper: GameTestHelper

说明:

TODO

private void forAllTriggeredTestBlocks(GameTestHelper helper, TestBlockMode mode, Consumer<TestBlockEntity> action) @ L52

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

参数:

  • helper: GameTestHelper
  • mode: TestBlockMode
  • action: Consumer

说明:

TODO

private BlockPos findStartBlock(GameTestHelper helper) @ L62

  • 方法名:findStartBlock
  • 源码定位:L62
  • 返回类型:BlockPos
  • 修饰符:private

参数:

  • helper: GameTestHelper

说明:

TODO

private List<BlockPos> findTestBlocks(GameTestHelper helper, TestBlockMode mode) @ L75

  • 方法名:findTestBlocks
  • 源码定位:L75
  • 返回类型:List
  • 修饰符:private

参数:

  • helper: GameTestHelper
  • mode: TestBlockMode

说明:

TODO

public MapCodec<BlockBasedTestInstance> codec() @ L86

  • 方法名:codec
  • 源码定位:L86
  • 返回类型:MapCodec
  • 修饰符:public

参数:

说明:

TODO

protected MutableComponent typeDescription() @ L91

  • 方法名:typeDescription
  • 源码定位:L91
  • 返回类型:MutableComponent
  • 修饰符:protected

参数:

说明:

TODO

代码

public class BlockBasedTestInstance extends GameTestInstance {
    public static final MapCodec<BlockBasedTestInstance> CODEC = RecordCodecBuilder.mapCodec(
        i -> i.group(TestData.CODEC.forGetter(GameTestInstance::info)).apply(i, BlockBasedTestInstance::new)
    );
 
    public BlockBasedTestInstance(TestData<Holder<TestEnvironmentDefinition<?>>> testData) {
        super(testData);
    }
 
    @Override
    public void run(GameTestHelper helper) {
        BlockPos startPos = this.findStartBlock(helper);
        TestBlockEntity blockEntity = helper.getBlockEntity(startPos, TestBlockEntity.class);
        blockEntity.trigger();
        helper.onEachTick(
            () -> {
                List<BlockPos> acceptBlocks = this.findTestBlocks(helper, TestBlockMode.ACCEPT);
                if (acceptBlocks.isEmpty()) {
                    helper.fail(Component.translatable("test_block.error.missing", TestBlockMode.ACCEPT.getDisplayName()));
                }
 
                boolean acceptTriggered = acceptBlocks.stream()
                    .map(pos -> helper.getBlockEntity(pos, TestBlockEntity.class))
                    .anyMatch(TestBlockEntity::hasTriggered);
                if (acceptTriggered) {
                    helper.succeed();
                } else {
                    this.forAllTriggeredTestBlocks(helper, TestBlockMode.FAIL, failEntity -> helper.fail(Component.literal(failEntity.getMessage())));
                    this.forAllTriggeredTestBlocks(helper, TestBlockMode.LOG, TestBlockEntity::trigger);
                }
            }
        );
    }
 
    private void forAllTriggeredTestBlocks(GameTestHelper helper, TestBlockMode mode, Consumer<TestBlockEntity> action) {
        for (BlockPos failBlock : this.findTestBlocks(helper, mode)) {
            TestBlockEntity blockEntity = helper.getBlockEntity(failBlock, TestBlockEntity.class);
            if (blockEntity.hasTriggered()) {
                action.accept(blockEntity);
                blockEntity.reset();
            }
        }
    }
 
    private BlockPos findStartBlock(GameTestHelper helper) {
        List<BlockPos> testBlocks = this.findTestBlocks(helper, TestBlockMode.START);
        if (testBlocks.isEmpty()) {
            helper.fail(Component.translatable("test_block.error.missing", TestBlockMode.START.getDisplayName()));
        }
 
        if (testBlocks.size() != 1) {
            helper.fail(Component.translatable("test_block.error.too_many", TestBlockMode.START.getDisplayName()));
        }
 
        return testBlocks.getFirst();
    }
 
    private List<BlockPos> findTestBlocks(GameTestHelper helper, TestBlockMode mode) {
        List<BlockPos> blocks = new ArrayList<>();
        helper.forEveryBlockInStructure(pos -> {
            BlockState state = helper.getBlockState(pos);
            if (state.is(Blocks.TEST_BLOCK) && state.getValue(TestBlock.MODE) == mode) {
                blocks.add(pos.immutable());
            }
        });
        return blocks;
    }
 
    @Override
    public MapCodec<BlockBasedTestInstance> codec() {
        return CODEC;
    }
 
    @Override
    protected MutableComponent typeDescription() {
        return Component.translatable("test_instance.type.block_based");
    }
}

引用的其他类