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¶
-
Crear un registry por tipo
-
Registrar todas las keys al inicio
-
Usar nombres únicos para keys persistentes
❌ No Hacer¶
- No registrar keys dinámicamente
- No compartir registries entre tipos incompatibles
- No duplicar nombres de keys persistentes
Siguiente¶
- MetaKey: Identificadores de metadatos
- IMetaStore: Almacenamiento de metadatos
- Overview: Visión general
¿Preguntas? Consulta FAQ