package com.hypixel.hytale.component.data.unknown; import com.hypixel.hytale.codec.Codec; import com.hypixel.hytale.codec.ExtraInfo; import com.hypixel.hytale.codec.KeyedCodec; import com.hypixel.hytale.codec.builder.BuilderCodec; import com.hypixel.hytale.codec.codecs.map.MapCodec; import com.hypixel.hytale.component.Component; import com.hypixel.hytale.logger.HytaleLogger; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.bson.BsonDocument; import org.bson.BsonValue; public class UnknownComponents implements Component { public static final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass(); public static final String ID = "Unknown"; public static final BuilderCodec CODEC = BuilderCodec.builder(UnknownComponents.class, UnknownComponents::new) .addField( new KeyedCodec<>("Components", new MapCodec<>(Codec.BSON_DOCUMENT, Object2ObjectOpenHashMap::new, false)), (o, map) -> o.unknownComponents = map, o -> o.unknownComponents ) .build(); private Map unknownComponents; public UnknownComponents() { this.unknownComponents = new Object2ObjectOpenHashMap(); } public UnknownComponents(Map unknownComponents) { this.unknownComponents = unknownComponents; } public void addComponent(String componentId, Component component, @Nonnull Codec> codec) { ExtraInfo extraInfo = ExtraInfo.THREAD_LOCAL.get(); BsonValue bsonValue = codec.encode(component, extraInfo); extraInfo.getValidationResults().logOrThrowValidatorExceptions(LOGGER); this.unknownComponents.put(componentId, bsonValue.asDocument()); } public void addComponent(String componentId, @Nonnull TempUnknownComponent component) { this.unknownComponents.put(componentId, component.getDocument()); } public boolean contains(String componentId) { return this.unknownComponents.containsKey(componentId); } @Nullable public > T removeComponent(String componentId, @Nonnull Codec codec) { BsonDocument bsonDocument = this.unknownComponents.remove(componentId); if (bsonDocument == null) { return null; } else { ExtraInfo extraInfo = ExtraInfo.THREAD_LOCAL.get(); T component = (T)codec.decode(bsonDocument, extraInfo); extraInfo.getValidationResults().logOrThrowValidatorExceptions(LOGGER); return component; } } public Map getUnknownComponents() { return this.unknownComponents; } @Nonnull @Override public Component clone() { return new UnknownComponents<>(new Object2ObjectOpenHashMap(this.unknownComponents)); } }