Flandre923
611 words
3 minutes
沉浸工艺多方块01-多方块的注册流程

01多方块结构的注册流程#

IEMultiblocks​类是多方块的注册的位置#

// 通过`IEMultiblocks`下的register方法进行注册。 private static <T extends IMultiblock> T register(T multiblock) { IE_MULTIBLOCKS.add(multiblock); // MultiblockHandler.registerMultiblock(multiblock); return multiblock; }

可以看到注册要求传入是一个IMultiblock接口的实现,IMultiblock就是一个多方块结构的接口,代表了多方块结构的行为。

public static final List<IMultiblock> IE_MULTIBLOCKS = new ArrayList<>();

这是一个存储IMultiblock的List,注册时候就将你的multiblock存储这个List。

同时调用MultiblockHandler.registerMultiblock(multiblock);

IEMultiblocks​类主要做的事情就这两件了,然后其他的逻辑在MultiblockHandler.registerMultiblock​中进行。

MultiblockHandler#

public static synchronized void registerMultiblock(IMultiblock multiblock) { multiblocks.add(multiblock); byUniqueName.put(multiblock.getUniqueName(), multiblock); }
static List<IMultiblock> multiblocks = new ArrayList<>(); static Map<ResourceLocation, IMultiblock> byUniqueName = new HashMap<>();

可以看到registerMultiblock​方法做的事情也很简单,就是将你传入的IMultiblock多方块结构对象存储到List(multiblocks)中和Map(byUniqueName)中

到此位置就注册了一个多方块结构。

下面我们来看注册的构造方法的流程,这里用粉碎机作为例子#

public class CrusherMultiblock extends IETemplateMultiblock { public CrusherMultiblock() { super(new ResourceLocation(ImmersiveEngineering.MODID, "multiblocks/crusher"), CrusherLogic.MASTER_OFFSET, new BlockPos(2, 1, 2), new BlockPos(5, 3, 3), IEMultiblockLogic.CRUSHER); } }
public abstract class IETemplateMultiblock extends TemplateMultiblock { private final MultiblockRegistration<?> logic; public IETemplateMultiblock( ResourceLocation loc, BlockPos masterFromOrigin, BlockPos triggerFromOrigin, BlockPos size, MultiblockRegistration<?> logic ) { super(loc, masterFromOrigin, triggerFromOrigin, size, ImmutableMap.of()); this.logic = logic; }
public abstract class TemplateMultiblock implements IMultiblock public TemplateMultiblock(ResourceLocation loc, BlockPos masterFromOrigin, BlockPos triggerFromOrigin, BlockPos size, Map<Block, TagKey<Block>> tags) { this(loc, masterFromOrigin, triggerFromOrigin, size, ImmutableList.of( // 调用自身构造函数,并传入额外的匹配条件 (expected, found, world, pos) -> { // 创建一个匿名函数用于匹配检查 TagKey<Block> tag = tags.get(expected.getBlock()); // 从 tags map 中获取预期的方块标签 if(tag != null) { if(found.is(tag)) { // 检查实际方块是否属于该标签 return Result.allow(2); // 允许放置,权重为2 (具体权重意义可能取决于代码) } else { return Result.deny(2); // 拒绝放置,权重为2 } } else { return Result.DEFAULT; // 没有找到预期的标签,使用默认行为 } } )); public TemplateMultiblock(ResourceLocation loc, BlockPos masterFromOrigin, BlockPos triggerFromOrigin, BlockPos size, List<MatcherPredicate> additionalPredicates) { this.loc = loc; // 设置模板的资源定位 this.masterFromOrigin = masterFromOrigin; // 设置主方块相对于原点的偏移位置 this.triggerFromOrigin = triggerFromOrigin; // 设置触发器方块相对于原点的偏移位置 this.size = size; // 设置模板的尺寸 this.additionalPredicates = additionalPredicates; // 设置额外的匹配条件 } }

可以看到对于IMultiblock​的实现类,所有的多方块结构的机器是IMultiblock​接口的具体实现,其中TemplateMultiblock​定义了各种字段。

沉浸工艺多方块01-多方块的注册流程
https://fuwari.vercel.app/posts/imm/01多方块结构的注册流程/
Author
Flandre923
Published at
2024-08-10