Volver al índice

src/main/java/ar/com/companeros/decision/ObservationSnapshot.java

package ar.com.companeros.decision;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

/** Datos copiados y acotados; nunca una entidad viva ni el mapa entero del servidor. */
public record ObservationSnapshot(UUID worldId, String dimension, int x, int y, int z,
        float health, int hunger, Map<String, Integer> inventory, String currentGoal,
        List<String> observations, List<String> memories, List<String> untrustedMessages) {
    public ObservationSnapshot {
        Objects.requireNonNull(worldId); Objects.requireNonNull(dimension); Objects.requireNonNull(currentGoal);
        inventory = Map.copyOf(inventory); observations = List.copyOf(observations);
        memories = List.copyOf(memories); untrustedMessages = List.copyOf(untrustedMessages);
        if (dimension.length() > 128 || currentGoal.length() > 512 || !Float.isFinite(health)
                || health < 0 || hunger < 0 || hunger > 20 || inventory.size() > 128
                || inventory.entrySet().stream().anyMatch(e -> e.getKey().length() > 128 || e.getValue() < 0))
            throw new IllegalArgumentException("Estado observado fuera de límite");
        bound(observations, 32, 512); bound(memories, 16, 2048); bound(untrustedMessages, 16, 2304);
    }

    private static void bound(List<String> values, int size, int chars) {
        if (values.size() > size || values.stream().anyMatch(value -> value.length() > chars))
            throw new IllegalArgumentException("Observación textual fuera de límite");
    }
}