From 100c6e3dff864d4cff52295a8bce371250636896 Mon Sep 17 00:00:00 2001 From: WanionCane Date: Wed, 13 Jul 2016 00:20:29 -0300 Subject: [PATCH] lot of fixes, thanks johnc94 for the report. --- build.gradle | 2 +- src/main/java/wanion/unidict/Config.java | 11 +- src/main/java/wanion/unidict/UniDict.java | 2 + .../java/wanion/unidict/common/Reference.java | 2 +- .../wanion/unidict/helper/RecipeHelper.java | 6 +- .../integration/CraftingIntegration.java | 2 +- .../unidict/recipe/ForgeResearcher.java | 16 +-- .../wanion/unidict/recipe/IC2Researcher.java | 14 +-- .../unidict/recipe/VanillaResearcher.java | 6 +- .../wanion/unidict/resource/Resource.java | 90 ++++++++++------ .../resource/UniResourceContainer.java | 10 +- .../unidict/resource/UniResourceHandler.java | 102 +++++++----------- src/main/resources/mcmod.info | 2 +- 13 files changed, 139 insertions(+), 126 deletions(-) diff --git a/build.gradle b/build.gradle index dfa6844..6a28030 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" } */ -version = "1.10.2-1.2" +version = "1.10.2-1.2b" group= "wanion.unidict" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "UniDict" diff --git a/src/main/java/wanion/unidict/Config.java b/src/main/java/wanion/unidict/Config.java index aa673b7..c4287f4 100644 --- a/src/main/java/wanion/unidict/Config.java +++ b/src/main/java/wanion/unidict/Config.java @@ -27,7 +27,10 @@ public final class Config { - private Config() {} + private Config() + { + } + // config private static final Configuration config = new Configuration(new File("." + SLASH + "config" + SLASH + Reference.MOD_NAME + ".cfg"), Reference.MOD_VERSION); public static final Set keepOneEntryModBlackSet = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList(config.getStringList("keepOneEntryModBlackList", Configuration.CATEGORY_GENERAL, new String[]{}, "mods listed here will be blacklisted in keepOneEntry.\nmust be the exact modID.")))); @@ -99,6 +102,12 @@ static void init() config.save(); } + public static void saveIfHasChanged() + { + if (config.hasChanged()) + config.save(); + } + public static TObjectLongMap getOwnerOfEveryKindMap(final long kind) { final String kindName = WordUtils.capitalize(Resource.getNameOfKind(kind)); diff --git a/src/main/java/wanion/unidict/UniDict.java b/src/main/java/wanion/unidict/UniDict.java index 4a98738..37bd4b8 100644 --- a/src/main/java/wanion/unidict/UniDict.java +++ b/src/main/java/wanion/unidict/UniDict.java @@ -19,6 +19,7 @@ import org.apache.logging.log4j.Logger; import wanion.unidict.api.UniDictAPI; import wanion.unidict.common.Dependencies; +import wanion.unidict.common.SpecificKindItemStackComparator; import wanion.unidict.integration.IntegrationModule; import wanion.unidict.module.AbstractModule; import wanion.unidict.module.ModuleHandler; @@ -91,6 +92,7 @@ public void postInit(final FMLPostInitializationEvent event) public void loadComplete(final FMLLoadCompleteEvent event) { moduleHandler.startModules(event); + SpecificKindItemStackComparator.nullify(); uniResourceHandler = null; moduleHandler = null; dependencies = null; diff --git a/src/main/java/wanion/unidict/common/Reference.java b/src/main/java/wanion/unidict/common/Reference.java index 34b8e96..df99082 100644 --- a/src/main/java/wanion/unidict/common/Reference.java +++ b/src/main/java/wanion/unidict/common/Reference.java @@ -14,7 +14,7 @@ public final class Reference { public static final String MOD_ID = "UniDict"; public static final String MOD_NAME = MOD_ID; - public static final String MOD_VERSION = "1.10.2-1.2"; + public static final String MOD_VERSION = "1.10.2-1.2b"; public static final char SLASH = separatorChar; public static final String MC_VERSION = "[1.10.2]"; diff --git a/src/main/java/wanion/unidict/helper/RecipeHelper.java b/src/main/java/wanion/unidict/helper/RecipeHelper.java index 695ec74..54fed0b 100644 --- a/src/main/java/wanion/unidict/helper/RecipeHelper.java +++ b/src/main/java/wanion/unidict/helper/RecipeHelper.java @@ -26,7 +26,7 @@ import java.util.List; import java.util.Map; -public class RecipeHelper +public final class RecipeHelper { public static final List recipes = CraftingManager.getInstance().getRecipeList(); private static final char[] DEFAULT_RECIPE_CHARS = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'}; @@ -38,7 +38,7 @@ private RecipeHelper() {} public static Object[] rawShapeToShape(@Nonnull final Object[] objects) { int f = 0; - final char[][] almostTheShape = Arrays.copyOf(SHAPE, 3); + final char[][] almostTheShape = new char[][]{Arrays.copyOf(SHAPE[0], 3), Arrays.copyOf(SHAPE[1], 3), Arrays.copyOf(SHAPE[2], 3)}; final TObjectCharMap thingToCharMap = new TObjectCharHashMap<>(); final Map keyStackMap = new THashMap<>(); boolean done = false; @@ -60,7 +60,7 @@ public static Object[] rawShapeToShape(@Nonnull final Object[] objects) int i = 0; for (final Object object : thingToCharMap.keySet()) { shape[3 + (2 * i)] = thingToCharMap.get(object); - shape[4 + (2 * i++)] = (object instanceof Integer) ? keyStackMap.get(object).copy() : object; + shape[4 + (2 * i++)] = (object instanceof Integer) ? keyStackMap.get(object) : object; } return shape; } diff --git a/src/main/java/wanion/unidict/integration/CraftingIntegration.java b/src/main/java/wanion/unidict/integration/CraftingIntegration.java index b935396..5f8a46a 100644 --- a/src/main/java/wanion/unidict/integration/CraftingIntegration.java +++ b/src/main/java/wanion/unidict/integration/CraftingIntegration.java @@ -53,7 +53,7 @@ public String call() { try { doTheResearch(); - } catch (Exception e) { UniDict.getLogger().error(threadName + e); } + } catch (Exception e) { UniDict.getLogger().error(threadName + e); e.printStackTrace(); } return threadName + "Why so many recipes? I had to deal with a lot of recipes."; } diff --git a/src/main/java/wanion/unidict/recipe/ForgeResearcher.java b/src/main/java/wanion/unidict/recipe/ForgeResearcher.java index 0ca8ea7..e37e3fe 100644 --- a/src/main/java/wanion/unidict/recipe/ForgeResearcher.java +++ b/src/main/java/wanion/unidict/recipe/ForgeResearcher.java @@ -54,12 +54,12 @@ public Class getShapelessRecipeClass() @Override public ShapedOreRecipe getNewShapedRecipe(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler, @Nonnull final UniOreDictionary uniOreDictionary) { - final Object[] newRecipeInputs = new Object[9]; final Object[] recipeInputs = ((ShapedOreRecipe)recipe).getInput(); - String bufferOreName; + final Object[] newRecipeInputs = new Object[9]; for (int i = 0; i < 9; i++) { - Object input = i < recipeInputs.length ? recipeInputs[i] : null; - newRecipeInputs[i] = input != null ? (bufferOreName = uniOreDictionary.getName(input)) != null ? bufferOreName : input : null; + final Object input = i < recipeInputs.length ? recipeInputs[i] : null; + final String bufferOreName = input != null ? uniOreDictionary.getName(input) : null; + newRecipeInputs[i] = input != null ? bufferOreName != null ? bufferOreName : input : null; } return new ShapedOreRecipe(resourceHandler.getMainItemStack(recipe.getRecipeOutput()), RecipeHelper.rawShapeToShape(newRecipeInputs)); } @@ -69,12 +69,12 @@ public ShapedOreRecipe getNewShapedRecipe(@Nonnull final IRecipe recipe, @Nonnul @Override public ShapedOreRecipe getNewShapedFromShapelessRecipe(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler, @Nonnull final UniOreDictionary uniOreDictionary) { - final Object[] newRecipeInputs = new Object[9]; final Object[] recipeInputs = ((ShapelessOreRecipe)recipe).getInput().toArray(); - String bufferOreName; + final Object[] newRecipeInputs = new Object[recipeInputs.length]; for (int i = 0; i < recipeInputs.length; i++) { - Object input = recipeInputs[i]; - newRecipeInputs[i] = (bufferOreName = uniOreDictionary.getName(input)) != null ? bufferOreName : input; + final Object input = i < recipeInputs.length ? recipeInputs[i] : null; + final String bufferOreName = input != null ? uniOreDictionary.getName(input) : null; + newRecipeInputs[i] = input != null ? bufferOreName != null ? bufferOreName : input : null; } return new ShapedOreRecipe(resourceHandler.getMainItemStack(recipe.getRecipeOutput()), RecipeHelper.rawShapeToShape(newRecipeInputs)); } diff --git a/src/main/java/wanion/unidict/recipe/IC2Researcher.java b/src/main/java/wanion/unidict/recipe/IC2Researcher.java index 987fd92..ebb58fc 100644 --- a/src/main/java/wanion/unidict/recipe/IC2Researcher.java +++ b/src/main/java/wanion/unidict/recipe/IC2Researcher.java @@ -68,10 +68,11 @@ public ShapedOreRecipe getNewShapedRecipe(@Nonnull IRecipe recipe, @Nonnull fina { final Object[] newRecipeInputs = new Object[9]; final IRecipeInput[] recipeInputs = ((AdvRecipe)recipe).input; - String bufferOreName; for (int i = 0; i < 9; i++) { - List input = i < recipeInputs.length ? recipeInputs[i].getInputs() : null; - newRecipeInputs[i] = input != null ? ((bufferOreName = uniOreDictionary.getName(input)) != null) ? bufferOreName : input.get(0) : null; + final List input = i < recipeInputs.length && !recipeInputs[i].getInputs().isEmpty() ? recipeInputs[i].getInputs() : null; + final String bufferOreName = input != null ? uniOreDictionary.getName(input) : null; + String secondaryBufferOreName; + newRecipeInputs[i] = input != null ? bufferOreName != null ? bufferOreName : (secondaryBufferOreName = uniOreDictionary.getName(input.get(0))) != null ? secondaryBufferOreName : null : null; } return new ShapedOreRecipe(resourceHandler.getMainItemStack(recipe.getRecipeOutput()), RecipeHelper.rawShapeToShape(newRecipeInputs)); } @@ -82,10 +83,11 @@ public ShapedOreRecipe getNewShapedFromShapelessRecipe(@Nonnull IRecipe recipe, { final Object[] newRecipeInputs = new Object[9]; final IRecipeInput[] recipeInputs = ((AdvShapelessRecipe)recipe).input; - String bufferOreName; for (int i = 0; i < recipeInputs.length; i++) { - List input = recipeInputs[i].getInputs(); - newRecipeInputs[i] = ((bufferOreName = uniOreDictionary.getName(input)) != null) ? bufferOreName : (input != null) ? input.get(0) : null; + final List input = i < recipeInputs.length && !recipeInputs[i].getInputs().isEmpty() ? recipeInputs[i].getInputs() : null; + final String bufferOreName = input != null ? uniOreDictionary.getName(input) : null; + String secondaryBufferOreName; + newRecipeInputs[i] = input != null ? bufferOreName != null ? bufferOreName : (secondaryBufferOreName = uniOreDictionary.getName(input.get(0))) != null ? secondaryBufferOreName : null : null; } return new ShapedOreRecipe(resourceHandler.getMainItemStack(recipe.getRecipeOutput()), RecipeHelper.rawShapeToShape(newRecipeInputs)); } diff --git a/src/main/java/wanion/unidict/recipe/VanillaResearcher.java b/src/main/java/wanion/unidict/recipe/VanillaResearcher.java index eafc2ba..0da6c74 100644 --- a/src/main/java/wanion/unidict/recipe/VanillaResearcher.java +++ b/src/main/java/wanion/unidict/recipe/VanillaResearcher.java @@ -57,10 +57,10 @@ public ShapedOreRecipe getNewShapedRecipe(@Nonnull final IRecipe recipe, @Nonnul { final Object[] newRecipeInputs = new Object[9]; final ItemStack[] recipeInputs = ((ShapedRecipes) recipe).recipeItems; - String bufferOreName; for (int i = 0; i < 9; i++) { - ItemStack input = i < recipeInputs.length ? recipeInputs[i] : null; - newRecipeInputs[i] = input != null ? (bufferOreName = resourceHandler.getContainerName(input)) != null ? bufferOreName : input : null; + final ItemStack input = i < recipeInputs.length ? recipeInputs[i] : null; + final String bufferOreName = resourceHandler.getContainerName(input); + newRecipeInputs[i] = input != null ? bufferOreName != null ? bufferOreName : input : null; } return new ShapedOreRecipe(resourceHandler.getMainItemStack(recipe.getRecipeOutput()), RecipeHelper.rawShapeToShape(newRecipeInputs)); } diff --git a/src/main/java/wanion/unidict/resource/Resource.java b/src/main/java/wanion/unidict/resource/Resource.java index 5f445b9..17999bc 100644 --- a/src/main/java/wanion/unidict/resource/Resource.java +++ b/src/main/java/wanion/unidict/resource/Resource.java @@ -14,6 +14,9 @@ import gnu.trove.map.TObjectLongMap; import gnu.trove.map.hash.TLongObjectHashMap; import gnu.trove.map.hash.TObjectLongHashMap; +import gnu.trove.set.TLongSet; +import gnu.trove.set.hash.TLongHashSet; +import wanion.unidict.Config; import javax.annotation.Nonnull; import java.util.ArrayList; @@ -33,6 +36,7 @@ public class Resource private final TLongObjectMap childrenMap = new TLongObjectHashMap<>(); private long children = 0; private boolean updated; + private boolean sorted = false; public Resource(@Nonnull final String name) { @@ -63,16 +67,6 @@ public UniResourceContainer getChild(final long kind) return childrenMap.get(kind); } - public TLongObjectMap getChildrenMap() - { - return new TUnmodifiableLongObjectMap<>(childrenMap); - } - - Collection getChildrenCollection() - { - return childrenMap.valueCollection(); - } - public Resource filteredClone(final long kinds) { final TLongObjectMap newChildrenMap = new TLongObjectHashMap<>(); @@ -94,15 +88,6 @@ public boolean addChild(@Nonnull final UniResourceContainer child) return true; } - public Resource setSortOfChildren(final boolean sort) - { - childrenMap.forEachValue(child -> { - child.setSort(sort); - return true; - }); - return this; - } - public void updateEntries() { if (updated) @@ -116,6 +101,7 @@ public void updateEntries() children &= ~kindId; childrenIterator.remove(); } + cleanEverything(); } @Override @@ -129,23 +115,46 @@ public String toString() return output.toString(); } - public static void register(@Nonnull final String kindName) + TLongObjectMap getChildrenMap() { - if (nameToKind.containsKey(kindName)) + return new TUnmodifiableLongObjectMap<>(childrenMap); + } + + Resource setSortOfChildren(final boolean sort) + { + childrenMap.forEachValue(child -> { + child.setSort(sort); + return true; + }); + return this; + } + + private void cleanEverything() + { + hideInNEI(); + keepOneEntry(); + } + + private void hideInNEI() + { + if (!Config.autoHideInJEI) return; - final int kind = 1 << totalKindsRegistered++; - nameToKind.put(kindName, kind); - kindToName.put(kind, kindName); + if (!Config.keepOneEntry) { + TLongSet blackSet = new TLongHashSet(); + for (String blackThing : Config.hideInJEIBlackSet) + blackSet.add(Resource.getKindOfName(blackThing)); + for (long kind : childrenMap.keys()) + if (!blackSet.contains(kind)) + childrenMap.get(kind).removeBadEntriesFromNEI(); + } else + childrenMap.valueCollection().forEach(UniResourceContainer::removeBadEntriesFromNEI); } - public static long registerAndGet(@Nonnull final String kindName) + private void keepOneEntry() { - if (nameToKind.containsKey(kindName)) - return nameToKind.get(kindName); - final int kind = 1 << totalKindsRegistered++; - nameToKind.put(kindName, kind); - kindToName.put(kind, kindName); - return kind; + if (!Config.keepOneEntry) + return; + childrenMap.valueCollection().forEach(UniResourceContainer::keepOneEntry); } public static List getResources(@Nonnull final Collection resources, final String... kinds) @@ -203,4 +212,23 @@ public static boolean kindExists(@Nonnull final String... names) return false; return true; } + + static void register(@Nonnull final String kindName) + { + if (nameToKind.containsKey(kindName)) + return; + final int kind = 1 << totalKindsRegistered++; + nameToKind.put(kindName, kind); + kindToName.put(kind, kindName); + } + + static long registerAndGet(@Nonnull final String kindName) + { + if (nameToKind.containsKey(kindName)) + return nameToKind.get(kindName); + final int kind = 1 << totalKindsRegistered++; + nameToKind.put(kindName, kind); + kindToName.put(kind, kindName); + return kind; + } } \ No newline at end of file diff --git a/src/main/java/wanion/unidict/resource/UniResourceContainer.java b/src/main/java/wanion/unidict/resource/UniResourceContainer.java index c6e7050..7d349b5 100644 --- a/src/main/java/wanion/unidict/resource/UniResourceContainer.java +++ b/src/main/java/wanion/unidict/resource/UniResourceContainer.java @@ -50,7 +50,7 @@ public List getEntries() { } void keepOneEntry() { - if (entries.size() == 1) + if (!sort || entries.size() == 1) return; Set keepOneEntryBlackSet = ResourceHandler.keepOneEntryBlackSet; if (!keepOneEntryBlackSet.isEmpty()) { @@ -60,9 +60,11 @@ void keepOneEntry() { } else entries.subList(1, entries.size()).clear(); } - void removeBadEntriesFromNEI() { - if (entries.size() > 1) - entries.subList(1, entries.size()).forEach(UniJEIPlugin::hide); + void removeBadEntriesFromNEI() + { + if (sort) + if (entries.size() > 1) + entries.subList(1, entries.size()).forEach(UniJEIPlugin::hide); } boolean updateEntries() { diff --git a/src/main/java/wanion/unidict/resource/UniResourceHandler.java b/src/main/java/wanion/unidict/resource/UniResourceHandler.java index a28f732..15c9421 100644 --- a/src/main/java/wanion/unidict/resource/UniResourceHandler.java +++ b/src/main/java/wanion/unidict/resource/UniResourceHandler.java @@ -12,8 +12,6 @@ import gnu.trove.map.TLongObjectMap; import gnu.trove.map.hash.THashMap; import gnu.trove.map.hash.TLongObjectHashMap; -import gnu.trove.set.TLongSet; -import gnu.trove.set.hash.TLongHashSet; import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.text.WordUtils; import wanion.unidict.Config; @@ -96,7 +94,10 @@ private void createResources() allTheKinds.add(kindName); } }); - allTheKinds.forEach(Resource::register); + if (!Config.enableSpecificKindSort) + allTheKinds.forEach(Resource::register); + else + allTheKinds.forEach(kind -> new SpecificKindItemStackComparator(Resource.registerAndGet(kind))); basicResourceMap.forEach((resourceName, kinds) -> { final TLongObjectMap kindMap = new TLongObjectHashMap<>(); kinds.forEach(kindName -> { @@ -106,33 +107,37 @@ private void createResources() apiResourceMap.put(resourceName, new Resource(resourceName, kindMap)); }); Config.metalsToUnify.stream().filter(apiResourceMap::containsKey).forEach(resourceName -> resourceMap.put(resourceName, apiResourceMap.get(resourceName).filteredClone(childrenOfMetals).setSortOfChildren(true))); - if (Config.customUnifiedResources.isEmpty()) - return; - final List gemRequires = Arrays.asList("nugget", "block"); - Config.customUnifiedResources.forEach((resourceName, kinds) -> { - if (kinds.contains("gem")) - kinds.addAll(gemRequires); - if (resourceMap.containsKey(resourceName)) { - kinds.forEach(kindName -> { - final String oreDictName = kindName + resourceName; - final long kind = Resource.registerAndGet(kindName); - if (OreDictionary.doesOreNameExist(oreDictName)) - resourceMap.get(resourceName).addChild(new UniResourceContainer(oreDictName, kind).setSortAndGet(true)); - }); - } else { - final TLongObjectMap childrenOfCustomResource = new TLongObjectHashMap<>(); - kinds.forEach(kindName -> { - final String oreDictName = kindName + resourceName; - if (OreDictionary.doesOreNameExist(oreDictName)) { + if (!Config.customUnifiedResources.isEmpty()) { + Config.customUnifiedResources.forEach((resourceName, kinds) -> { + if (resourceMap.containsKey(resourceName)) { + kinds.forEach(kindName -> { + final String oreDictName = kindName + resourceName; final long kind = Resource.registerAndGet(kindName); - if (resourceMap.containsKey(resourceName)) - childrenOfCustomResource.put(kind, new UniResourceContainer(oreDictName, kind).setSortAndGet(true)); - if (!childrenOfCustomResource.isEmpty()) - resourceMap.put(resourceName, new Resource(resourceName, childrenOfCustomResource)); - } - }); - } - }); + if (OreDictionary.doesOreNameExist(oreDictName)) + resourceMap.get(resourceName).addChild(new UniResourceContainer(oreDictName, kind).setSortAndGet(true)); + }); + } else { + final TLongObjectMap childrenOfCustomResource = new TLongObjectHashMap<>(); + kinds.forEach(kindName -> { + final String oreDictName = kindName + resourceName; + if (OreDictionary.doesOreNameExist(oreDictName)) { + final long kind; + if (!Resource.kindExists(kindName)) + if (Config.enableSpecificKindSort) + new SpecificKindItemStackComparator(kind = Resource.registerAndGet(kindName)); + else kind = Resource.registerAndGet(kindName); + else + kind = Resource.getKindOfName(kindName); + if (resourceMap.containsKey(resourceName)) + childrenOfCustomResource.put(kind, new UniResourceContainer(oreDictName, kind).setSortAndGet(true)); + if (!childrenOfCustomResource.isEmpty()) + resourceMap.put(resourceName, new Resource(resourceName, childrenOfCustomResource)); + } + }); + } + }); + } + Config.saveIfHasChanged(); } public void postInit() @@ -143,52 +148,17 @@ public void postInit() for (String customEntry : Config.customUnifiedResources.keySet()) if ((customResource = resourceMap.get(customEntry)) != null) customResource.updateEntries(); + if (Config.keepOneEntry) + OreDictionary.rebakeMap(); resourceHandler.populateIndividualStackAttributes(); for (String blackListedResource : Config.resourceBlackList) { resourceMap.remove(blackListedResource); apiResourceMap.remove(blackListedResource); } - cleanEverything(); - if (Config.enableSpecificKindSort) - SpecificKindItemStackComparator.nullify(); } private void updateEverything() { apiResourceMap.values().forEach(Resource::updateEntries); } - - private void cleanEverything() - { - hideInNEI(); - keepOneEntry(); - } - - private void hideInNEI() - { - if (!Config.autoHideInJEI) - return; - if (!Config.keepOneEntry) { - TLongSet blackSet = new TLongHashSet(); - for (String blackThing : Config.hideInJEIBlackSet) - blackSet.add(Resource.getKindOfName(blackThing)); - for (Resource resource : resourceMap.values()) { - TLongObjectMap childrenMap = resource.getChildrenMap(); - for (long kind : childrenMap.keys()) - if (!blackSet.contains(kind)) - childrenMap.get(kind).removeBadEntriesFromNEI(); - } - } else - for (Resource resource : resourceMap.values()) - resource.getChildrenCollection().forEach(UniResourceContainer::removeBadEntriesFromNEI); - } - - private void keepOneEntry() - { - if (!Config.keepOneEntry) - return; - for (Resource resource : resourceMap.values()) - resource.getChildrenCollection().forEach(UniResourceContainer::keepOneEntry); - OreDictionary.rebakeMap(); - } } \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 9be921a..f7ade02 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "UniDict", "name": "UniDict", "description": "a mod about unifying all the things.", - "version": "1.2", + "version": "1.2b", "mcversion": "${mcversion}", "url": "http://minecraft.curseforge.com/projects/unidict", "updateUrl": "",