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