package dmillerw.menu.data.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import dmillerw.menu.data.click.ClickAction; import dmillerw.menu.data.click.ClickActionCommand; import dmillerw.menu.data.click.ClickActionKey; import dmillerw.menu.data.menu.MenuItem; import dmillerw.menu.data.menu.RadialMenu; import dmillerw.menu.handler.LogHandler; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import java.io.*; import java.util.Map; /** * @author dmillerw */ public class MenuLoader { private static final Gson GSON; static { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); builder.registerTypeAdapter(ItemStack.class, new ItemStackSerializer()); builder.registerTypeAdapter(ClickAction.IClickAction.class, new ClickActionSerializer()); GSON = builder.create(); } public static void load(File file) { try { JsonElement element = GSON.fromJson(new FileReader(file), JsonElement.class); if (!element.isJsonObject()) { LogHandler.error("Failed to load menu.json! Improperly formatted file!"); return; } for (Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) { MenuItem[] array = RadialMenu.getArray(entry.getKey()); if (!entry.getValue().isJsonObject()) { LogHandler.error(String.format("Failed to load %s category! Improperly formatted!", entry.getKey())); continue; } for (Map.Entry<String, JsonElement> entry1 : entry.getValue().getAsJsonObject().entrySet()) { String key = entry1.getKey(); JsonElement data = entry1.getValue(); try { int id = Integer.valueOf(key); if (id < RadialMenu.MAX_ITEMS) { array[id] = GSON.fromJson(data, MenuItem.class); MenuItem item = array[id]; if (item.icon.isEmpty()) { LogHandler.warn(String.format("Menu item in slot %s is looking for an item that no longer exists", String.valueOf(id))); MenuItem newItem = new MenuItem(item.title, new ItemStack(Blocks.STONE), item.clickAction); array[id] = newItem; } if (item.clickAction == null) { LogHandler.error(String.format("Menu item in slot %s is missing a click action. It will be reset!", String.valueOf(id))); array[id] = null; } else { if ((item.clickAction instanceof ClickActionCommand && ((ClickActionCommand) item.clickAction).command.isEmpty())) { LogHandler.warn(String.format("Menu item in slot %s is defined as a command action, but is missing a command. It will be reset!", String.valueOf(id))); array[id] = null; } else if (item.clickAction instanceof ClickActionKey && ((ClickActionKey) item.clickAction).getKeyBinding() == null) { LogHandler.warn(String.format("Menu item in slot %s is defined as a key action, but is missing a keybinding. It will be reset!", String.valueOf(id))); array[id] = null; } } } } catch (NumberFormatException ex) { LogHandler.warn("Menu item found with invalid key. Ignoring."); } } RadialMenu.replaceArray(entry.getKey(), array); } } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void save(File file) { if (file.exists()) { file.delete(); } JsonObject object = new JsonObject(); for (String category : RadialMenu.getCategories()) { JsonObject object1 = new JsonObject(); MenuItem[] array = RadialMenu.getArray(category); for (int i = 0; i < RadialMenu.MAX_ITEMS; i++) { if (array[i] != null) { object1.add(String.valueOf(i), GSON.toJsonTree(array[i])); } } object.add(category, object1); } try { FileWriter writer = new FileWriter(file); writer.append(GSON.toJson(object)); writer.close(); } catch (IOException ex) { ex.printStackTrace(); } } }