Zum Inhalt

MetaRegistry

MetaRegistry<K> es el registro central para crear y gestionar MetaKeys. Es thread-safe y mantiene el mapeo entre MetaKeys y sus funciones de inicialización.

Clase MetaRegistry

Ubicación: com.hypixel.hytale.server.core.meta.MetaRegistry.java

public class MetaRegistry<K> implements IMetaRegistry<K> {
    private final Map<String, MetaRegistryEntry> parameterMapping;
    private final List<MetaRegistryEntry> suppliers;
    private final ReentrantReadWriteLock lock;

    // Registrar MetaKey no persistente
    public <T> MetaKey<T> registerMetaObject(Function<K, T> function);

    // Registrar MetaKey persistente
    public <T> MetaKey<T> registerMetaObject(
        Function<K, T> function,
        boolean persistent,
        String keyName,
        Codec<T> codec
    );

    // Crear nuevo objeto meta
    public <T> T newMetaObject(MetaKey<T> key, K parent);

    // Iterar metadatos de un store
    public void forEachMetaEntry(IMetaStore<K> store,
                                 MetaEntryConsumer consumer);

    // Obtener MetaKey por nombre de codec
    @Nullable
    public PersistentMetaKey<?> getMetaKeyForCodecKey(String codecKey);
}

Registro de MetaKeys

MetaKey No Persistente

MetaRegistry<Entity> registry = new MetaRegistry<>();

// Simple con valor por defecto
MetaKey<Integer> HEALTH = registry.registerMetaObject(
    entity -> 100
);

// Con lógica compleja
MetaKey<Double> MAX_SPEED = registry.registerMetaObject(
    entity -> {
        EntityType type = entity.getType();
        return type.getDefaultSpeed();
    }
);

MetaKey Persistente

// Con serialización
MetaKey<String> PLAYER_NAME = registry.registerMetaObject(
    player -> "Unknown",    // Valor por defecto
    true,                   // Persistente
    "player_name",         // Nombre único para serialización
    Codec.STRING           // Codec para serializar/deserializar
);

// Con codec personalizado
MetaKey<PlayerStats> STATS = registry.registerMetaObject(
    player -> new PlayerStats(),
    true,
    "player_stats",
    PlayerStats.CODEC
);

Thread Safety

El MetaRegistry usa ReentrantReadWriteLock para sincronización:

// MetaRegistry.java:16
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

public <T> MetaKey<T> registerMetaObject(...) {
    lock.writeLock().lock();
    try {
        // Registro seguro
        MetaKey<T> key = new MetaKey<>(suppliers.size());
        suppliers.add(new MetaRegistryEntry<>(function, key));
        return key;
    } finally {
        lock.writeLock().unlock();
    }
}

Ejemplos Prácticos

Registro Global de Entidades

public class EntityMeta {
    public static final MetaRegistry<Entity> REGISTRY =
        new MetaRegistry<>();

    // Datos temporales
    public static final MetaKey<Long> SPAWN_TIME =
        REGISTRY.registerMetaObject(e -> System.currentTimeMillis());

    public static final MetaKey<Boolean> IS_AGGRESSIVE =
        REGISTRY.registerMetaObject(e -> false);

    // Datos persistentes
    public static final MetaKey<String> CUSTOM_NAME =
        REGISTRY.registerMetaObject(
            e -> "",
            true,
            "custom_name",
            Codec.STRING
        );

    public static final MetaKey<Integer> LEVEL =
        REGISTRY.registerMetaObject(
            e -> 1,
            true,
            "level",
            Codec.INT
        );
}

Uso en Sistema de Plugins

public class MyPlugin {
    private static final MetaRegistry<Player> PLAYER_META =
        new MetaRegistry<>();

    public static final MetaKey<PlayerData> DATA =
        PLAYER_META.registerMetaObject(
            player -> new PlayerData(),
            true,
            "myplugin_data",
            PlayerData.CODEC
        );

    public void onPlayerJoin(Player player) {
        PlayerData data = player.getMetaObject(DATA);
        data.incrementLoginCount();
    }
}

Mejores Prácticas

✅ Hacer

  1. Crear un registry por tipo

    MetaRegistry<Entity> entityMeta = new MetaRegistry<>();
    MetaRegistry<Player> playerMeta = new MetaRegistry<>();
    MetaRegistry<World> worldMeta = new MetaRegistry<>();
    

  2. Registrar todas las keys al inicio

    static {
        KEY1 = REGISTRY.registerMetaObject(...);
        KEY2 = REGISTRY.registerMetaObject(...);
    }
    

  3. Usar nombres únicos para keys persistentes

    "plugin_name:key_name"  // Evita colisiones
    

❌ No Hacer

  1. No registrar keys dinámicamente
  2. No compartir registries entre tipos incompatibles
  3. No duplicar nombres de keys persistentes

Siguiente


¿Preguntas? Consulta FAQ