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