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多方块结构的注册流程/