package jas.spawner.refactor.configsloader; import jas.common.JASLog; import jas.common.helper.GsonHelper; import jas.spawner.modern.spawner.TagConverter; import jas.spawner.modern.spawner.creature.handler.parsing.keys.Key; import jas.spawner.refactor.configsloader.ConfigLoader.VersionedFile; import jas.spawner.refactor.entities.LivingHandlerBuilder; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Map.Entry; import com.google.common.base.Optional; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; public class LivingHandlerLoader implements VersionedFile { private String version; private Optional<HashMap<String, LivingHandlerBuilder>> handlerIdToBuilder; private LivingHandlerLoader() { handlerIdToBuilder = Optional.absent(); version = Serializer.FILE_VERSION; } public LivingHandlerLoader(Collection<LivingHandlerBuilder> handlers) { HashMap<String, LivingHandlerBuilder> map = new HashMap<String, LivingHandlerBuilder>(); for (LivingHandlerBuilder livingHandlerBuilder : handlers) { map.put(livingHandlerBuilder.getLivingHandlerID(), livingHandlerBuilder); } handlerIdToBuilder = Optional.of(map); version = Serializer.FILE_VERSION; } public Optional<Collection<LivingHandlerBuilder>> getHandlers() { return handlerIdToBuilder.isPresent() ? Optional.of(handlerIdToBuilder.get().values()) : Optional .<Collection<LivingHandlerBuilder>> absent(); } @Override public String getVersion() { return version; } public static class Serializer implements JsonSerializer<LivingHandlerLoader>, JsonDeserializer<LivingHandlerLoader> { // Hack to provide backwards compatability: read contents from LivingGroups and move them to LivingHandler public static HashMap<String, List<String>> livingGroupContents = new HashMap<String, List<String>>(); public static final String FILE_VERSION = "3.0"; public final String FILE_VERSION_KEY = "FILE_VERSION"; public final String HANDLERS_KEY = "LIVING_HANDLERS"; public final String MODID_KEY = "MOD_ID"; public final String SPAWN_TAG_KEY = "SPAWN_TAG"; public final String POSTSPAWN_KEY = "POST_SPAWN_TAG"; public final String WEIGHT_KEY = "WEIGHT"; public final String PASSIVE_SPAWN_KEY = "PASSIVE_PACKSIZE"; public final String CHUNK_SPAWN_KEY = "CHUNK_PACKSIZE"; private String currentVersion; @Override public JsonElement serialize(LivingHandlerLoader src, Type typeOfSrc, JsonSerializationContext context) { JsonObject endObject = new JsonObject(); endObject.addProperty(FILE_VERSION_KEY, FILE_VERSION); JsonObject livingHandlers = new JsonObject(); for (LivingHandlerBuilder builder : src.handlerIdToBuilder.get().values()) { JsonObject handler = new JsonObject(); if (!"".equals(builder.getModID())) { handler.addProperty(POSTSPAWN_KEY, builder.getModID()); } if (!"".equals(builder.getCanSpawn()) && builder.getCanSpawn().isPresent()) { handler.addProperty(SPAWN_TAG_KEY, builder.getCanSpawn().get()); } if (!"".equals(builder.getPostSpawn()) && builder.getPostSpawn().isPresent()) { handler.addProperty(POSTSPAWN_KEY, builder.getPostSpawn().get()); } if (!"".equals(builder.getWeight()) && builder.getWeight().isPresent()) { handler.addProperty(WEIGHT_KEY, builder.getWeight().get()); } if (!"".equals(builder.getPassivePackSize()) && builder.getPassivePackSize().isPresent()) { handler.addProperty(PASSIVE_SPAWN_KEY, builder.getPassivePackSize().get()); } if (!"".equals(builder.getChunkPackSize()) && builder.getChunkPackSize().isPresent()) { handler.addProperty(CHUNK_SPAWN_KEY, builder.getChunkPackSize().get()); } livingHandlers.add(builder.getLivingHandlerID(), handler); } endObject.add(HANDLERS_KEY, livingHandlers); return endObject; } @Override public LivingHandlerLoader deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { LivingHandlerLoader saveObject = new LivingHandlerLoader(); JsonObject endObject = GsonHelper.getAsJsonObject(json); currentVersion = GsonHelper.getMemberOrDefault(endObject, FILE_VERSION_KEY, FILE_VERSION); JsonElement handlerElement = endObject.get(HANDLERS_KEY); if (handlerElement != null && handlerElement.isJsonObject()) { JsonObject handlesr = handlerElement.getAsJsonObject(); saveObject.handlerIdToBuilder = Optional.of(new HashMap<String, LivingHandlerBuilder>()); for (Entry<String, JsonElement> entry : handlesr.entrySet()) { String handlerId = entry.getKey(); JsonObject handler = GsonHelper.getAsJsonObject(entry.getValue()); LivingHandlerBuilder builder = getBuilder(handler, handlerId); saveObject.handlerIdToBuilder.get().put(builder.getLivingHandlerID(), builder); } } saveObject.version = currentVersion; return saveObject; } private LivingHandlerBuilder getBuilder(JsonObject handler, String handlerId) { LivingHandlerBuilder builder = new LivingHandlerBuilder(handlerId); builder.setModID(GsonHelper.getMemberOrDefault(handler, MODID_KEY, LivingHandlerBuilder.defaultFileName)); builder.setCanSpawn(GsonHelper .getMemberOrDefault(handler, SPAWN_TAG_KEY, "!(modspawn || sp.clearBounding)")); builder.setPostSpawn(GsonHelper.getMemberOrDefault(handler, POSTSPAWN_KEY, "")); builder.setWeight(GsonHelper.getMemberOrDefault(handler, WEIGHT_KEY, "")); builder.setPassivePackSize(GsonHelper.getMemberOrDefault(handler, PASSIVE_SPAWN_KEY, "")); builder.setChunkPackSize(GsonHelper.getMemberOrDefault(handler, CHUNK_SPAWN_KEY, "")); return builder; } } }