Skip to content

Type Handles

TypeHandle 是 NGT 可序列化的类型身份。

端口、变量、常量、options、图标、颜色、默认值和值编辑器都使用它。Handle 存储一个稳定的字符串 id,然后通过 TypeHandleHelpers 解析运行时 Java 类型和编辑器元数据。

创建 Handles

普通 Java 类型使用 fromType(...)

java
TypeHandle floatType = TypeHandleHelpers.fromType(Float.class);
TypeHandle directionType = TypeHandleHelpers.fromType(Direction.class);

Primitive class 会转换为 wrapper,因此 float.classFloat.class 会解析为同一种 handle。

当图需要一个不能干净映射到 Java class 的命名类型,或者你需要稳定的自定义 id 时,使用 customType(...)

java
TypeHandle damageType = TypeHandleHelpers.customType(
        DamageProfile.class,
        "mymod:damage_profile",
        "Damage Profile"
);

uniqueId 必须保持稳定。它会序列化到图数据、端口、变量、常量和 options 中。

TypeHandle API

方法用途
getIdentification()序列化 id 字符串。
getName()解析后的类型名;自定义 handle 返回自定义 id。
getFriendlyName()UI 中显示的人类可读名称。
resolve()运行时 Java Type
getIcon()该类型的 UI 图标。
getTypeColor()端口和类型 UI 使用的颜色。
getDefaultValue()默认值 supplier 的结果。
resolveConfigurable()值编辑器工厂。
isAssignableFrom(TypeHandle)类型兼容性辅助方法。
isCustomTypeHandle()是否来自自定义注册。

内置 Handles

内置 handles 位于 TypeHandles

Handle用途
BOOLBoolean 值。
FLOAT, DOUBLE, INT, LONG数值。
STRING文本值。
COLOR带颜色 configurator 的整数颜色。
DIRECTIONMinecraft direction。
BLOCK, ITEM, FLUIDMinecraft registry 值。
ENTITY_TYPEEntity type 值。
ITEM_STACK, FLUID_STACKStack 值。
EXECUTION_FLOW仅用于流程的端口。
SUBGRAPH内部子图标记。
MISSING_PORT图迁移后缺失端口的占位。

TypeHandles.init() 会在 LDLib2 common 初始化期间调用。

注册元数据

创建 handle 后,使用 TypeHandleHelpers 注册元数据。

java
TypeHandle profileType = TypeHandleHelpers.customType(
        DamageProfile.class,
        "mymod:damage_profile",
        "Damage Profile"
);

TypeHandleHelpers.setCustomColor(profileType, 0xFFFFAA33);
TypeHandleHelpers.setCustomIcon(profileType, MyIcons.DAMAGE);
TypeHandleHelpers.setCustomDefaultValue(profileType, DamageProfile::empty);

当颜色和图标都需要设置时,使用 setCustomColorAndIcon(...)

java
TypeHandleHelpers.setCustomColorAndIcon(profileType, 0xFFFFAA33, MyIcons.DAMAGE);

注册 Configurator

Configurator 控制常量、输入端口值、options 和变量默认值如何编辑。

java
TypeHandleHelpers.setCustomConfigurable(profileType, (value, type) ->
        IConfigurable.create(group -> {
            group.addConfigurator(new DamageProfileConfigurator(
                    "",
                    value::getValue,
                    value::setValue,
                    value.forceUpdate()
            ));
        })
);

如果没有注册自定义 configurable,ITypeConfigurable.DEFAULT 会尝试为解析出的 Java 类型使用 LDLib2 Configurable accessor。Enums 会自动使用 enum selector。

一次性的 UI 覆盖可以直接设置在 option 或输入端口上:

java
context.addInputPort("amount", Float.class)
        .withConfigurable(myPortConfigurable)
        .build();

context.addOption("mode", Mode.class)
        .withConfigurable(myOptionConfigurable);

Constants

Constants 是由 TypeHandle 支持的类型化值。

它们用于:

  • constant nodes,
  • 输入端口内嵌值,
  • 节点 options,
  • 变量默认值。

Handle 决定值编辑器、默认值、类型颜色和图标。单个 option 和输入端口可以覆盖默认 configurator 或 codec:

java
context.addInputPort("amount", Float.class)
        .withDefaultValue(1f)
        .withCodec(Codec.FLOAT)
        .build();

对于不应保存的运行时值,使用 withoutSerialization()

图类型列表

图定义使用 type handles 控制编辑器选项。

java
@Override
public @Nullable List<TypeHandle> getSupportTypes() {
    return List.of(TypeHandles.FLOAT, TypeHandles.COLOR, TypeHandles.BOOL);
}

@Override
public @Nullable List<TypeHandle> getLibrarySupportTypes() {
    return List.of(TypeHandles.FLOAT, TypeHandles.COLOR);
}

@Override
public @Nullable List<TypeHandle> getVariableSupportTypes() {
    return List.of(TypeHandles.FLOAT, TypeHandles.BOOL);
}

getSupportTypes() 是基础列表。getLibrarySupportTypes() 控制 Item Library 中的 constant nodes。getVariableSupportTypes() 控制 Blackboard 变量选项。

Released under the MIT License.