diff --git a/changelog.txt b/changelog.txt index 8bbc00e6..bc033888 100644 --- a/changelog.txt +++ b/changelog.txt @@ -9,6 +9,7 @@ Version 2.1.0-59 - Fixed the sacrifice range of the altar. - Fixed the Regeneration ritual so that it works on non-players - Added Mimic entry to The Architect. +- Configurified the Meteor Ritual - Modpacks and users can edit all of the major properties of the meteor ritual, including what items need to be dropped onto the ritual as well as what you get in the ritual, radius, etc. The config will refresh if there is a version change unless you set "resyncOnVersionChange" to false. ------------------------------------------------------ Version 2.0.4-58 diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 2673ec71..7e3fd532 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -11,7 +11,12 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.*; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLInterModComms; +import net.minecraftforge.fml.common.event.FMLModIdMappingEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; @@ -27,6 +32,7 @@ import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.registry.ModCompatibility; import WayofTime.bloodmagic.registry.ModEntities; import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.ModMeteors; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.registry.ModRecipes; import WayofTime.bloodmagic.registry.ModRituals; @@ -121,6 +127,7 @@ public class BloodMagic ModRecipes.init(); ModRituals.initRituals(); ModRituals.initImperfectRituals(); + ModMeteors.init(); ModArmourTrackers.init(); ModCompatibility.loadCompat(ICompatibility.InitializationPhase.INIT); NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); @@ -138,7 +145,8 @@ public class BloodMagic } @Mod.EventHandler - public void modMapping(FMLModIdMappingEvent event) { + public void modMapping(FMLModIdMappingEvent event) + { ModCompatibility.loadCompat(ICompatibility.InitializationPhase.MAPPING); } diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index c0823d66..ef635d9b 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,21 +1,27 @@ package WayofTime.bloodmagic; -import WayofTime.bloodmagic.annot.Handler; -import WayofTime.bloodmagic.api.BlockStack; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.util.Utils; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; - -import java.io.File; -import java.util.*; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.BlockStack; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.registry.ModMeteors; +import WayofTime.bloodmagic.util.Utils; @Handler public class ConfigHandler @@ -159,8 +165,18 @@ public class ConfigHandler public static void syncConfig() { + boolean configVersionChanged = false; + String category; + category = "Version"; + Property prop = config.get(category, "Config Version", Constants.Mod.VERSION); + if (!prop.getString().equals(Constants.Mod.VERSION)) + { + configVersionChanged = true; + prop.setValue(Constants.Mod.VERSION); + } + category = "Item/Block Blacklisting"; config.addCustomCategoryComment(category, "Allows disabling of specific Blocks/Items.\nNote that using this may result in crashes. Use is not supported."); config.setCategoryRequiresMcRestart(category, true); @@ -303,6 +319,22 @@ public class ConfigHandler thaumcraftGogglesUpgrade = config.getBoolean("thaumcraftGogglesUpgrade", category + ".thaumcraft", true, "Allows the Living Helmet to be upgraded with Goggles of Revealing in an Anvil."); ignoreCompressionSpamAddedByCompression = config.getBoolean("ignoreCompressionSpamAddedByCompression", category + ".compression", true, "Compression decided to add a storage recipe for every item and block in the game. This will make the Sigil of Compression ignore those recipes so your game will actually load in a decent amount of time."); + category = "Meteors"; + config.addCustomCategoryComment(category, "Meteor settings"); + + String[] defaultMeteors = ModMeteors.getDefaultMeteors(); + boolean resyncMeteorOnVersionChange = config.getBoolean("resyncOnVersionChange", category, true, ""); + Property meteorsProp = config.get(category, "MeteorList", defaultMeteors); + meteorsProp.setComment("These are meteors. Huzzah!"); + if (resyncMeteorOnVersionChange && configVersionChanged) + { + meteorsProp.set(defaultMeteors); + ModMeteors.meteors = defaultMeteors; + } else + { + ModMeteors.meteors = meteorsProp.getStringList(); + } + config.save(); } diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java index 14e294de..70c05988 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java @@ -5,7 +5,11 @@ import java.util.List; import java.util.Random; import lombok.AllArgsConstructor; +import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.util.Utils; @@ -14,13 +18,33 @@ import WayofTime.bloodmagic.util.Utils; public class MeteorHolder { public static Random rand = new Random(); + public ResourceLocation resourceKey; + public int metaKey = 0; public List components = new ArrayList(); - public float explosionStrength; - public int radius; + public float explosionStrength = 1; + public int radius = 1; public int maxWeight = 1000; + public ItemStack getKeyStack() + { + Item item = Utils.getItem(resourceKey); + if (item != null) + { + return new ItemStack(item); + } else + { + Block block = Utils.getBlock(resourceKey); + if (block != null) + { + return new ItemStack(block); + } + } + + return null; + } + public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock) { world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), explosionStrength, true, true); diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index 67d53b61..f39e3be5 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -6,9 +6,11 @@ import java.util.Map; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.ItemStackWrapper; +import WayofTime.bloodmagic.util.Utils; public class MeteorRegistry { @@ -25,7 +27,9 @@ public class MeteorRegistry public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius, int maxWeight) { - MeteorHolder holder = new MeteorHolder(componentList, explosionStrength, radius, maxWeight); + ResourceLocation resource = Utils.getResourceForItem(stack); + + MeteorHolder holder = new MeteorHolder(resource, stack.getItemDamage(), componentList, explosionStrength, radius, maxWeight); registerMeteor(stack, holder); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java b/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java new file mode 100644 index 00000000..cbe6167f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java @@ -0,0 +1,89 @@ +package WayofTime.bloodmagic.registry; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import WayofTime.bloodmagic.meteor.MeteorComponent; +import WayofTime.bloodmagic.meteor.MeteorHolder; +import WayofTime.bloodmagic.meteor.MeteorRegistry; +import WayofTime.bloodmagic.util.Utils; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class ModMeteors +{ + public static String[] meteors = new String[] {}; + + public static void init() + { + Gson gson = new GsonBuilder().create(); + + List properStrings = new ArrayList(); + String currentString = ""; + int leftParenths = 0; + int rightParenths = 0; + + for (String str : meteors) + { + currentString += str; + for (char c : str.toCharArray()) + { + if (c == '{') + { + leftParenths++; + } else if (c == '}') + { + rightParenths++; + } + } + + if (leftParenths == rightParenths) + { + properStrings.add(currentString); + currentString = ""; + leftParenths = 0; + rightParenths = 0; + } + } + + for (String properString : properStrings) + { + MeteorHolder holder = gson.fromJson(properString, MeteorHolder.class); + if (holder != null) + { + MeteorRegistry.registerMeteor(holder.getKeyStack(), holder); + } + } + } + + public static String[] getDefaultMeteors() + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + List holders = new ArrayList(); + + List ironMeteorList = new ArrayList(); + ironMeteorList.add(new MeteorComponent(400, "oreIron")); + ironMeteorList.add(new MeteorComponent(200, "oreCopper")); + ironMeteorList.add(new MeteorComponent(140, "oreTin")); + ironMeteorList.add(new MeteorComponent(70, "oreSilver")); + ironMeteorList.add(new MeteorComponent(80, "oreLead")); + ironMeteorList.add(new MeteorComponent(30, "oreGold")); + ironMeteorList.add(new MeteorComponent(60, "oreLapis")); + ironMeteorList.add(new MeteorComponent(100, "oreRedstone")); + MeteorHolder ironMeteorHolder = new MeteorHolder(Utils.getResourceForItem(new ItemStack(Blocks.IRON_BLOCK)), 0, ironMeteorList, 15, 5, 1000); + + holders.add(ironMeteorHolder); + + String[] meteors = new String[holders.size()]; + for (int i = 0; i < holders.size(); i++) + { + meteors[i] = gson.toJson(holders.get(i), MeteorHolder.class); + } + + return meteors; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index d296003a..1c7757aa 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -1,10 +1,6 @@ package WayofTime.bloodmagic.registry; -import java.util.ArrayList; -import java.util.List; - import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.registry.HarvestRegistry; @@ -13,8 +9,6 @@ import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.imperfect.ImperfectRitual; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.meteor.MeteorComponent; -import WayofTime.bloodmagic.meteor.MeteorRegistry; import WayofTime.bloodmagic.ritual.RitualAltarBuilder; import WayofTime.bloodmagic.ritual.RitualAnimalGrowth; import WayofTime.bloodmagic.ritual.RitualArmourEvolve; @@ -155,18 +149,6 @@ public class ModRituals RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 250, 0.5); RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 25, 0.05); - - List ironMeteorList = new ArrayList(); - ironMeteorList.add(new MeteorComponent(400, "oreIron")); - ironMeteorList.add(new MeteorComponent(200, "oreCopper")); - ironMeteorList.add(new MeteorComponent(140, "oreTin")); - ironMeteorList.add(new MeteorComponent(70, "oreSilver")); - ironMeteorList.add(new MeteorComponent(80, "oreLead")); - ironMeteorList.add(new MeteorComponent(30, "oreGold")); - ironMeteorList.add(new MeteorComponent(60, "oreLapis")); - ironMeteorList.add(new MeteorComponent(100, "oreRedstone")); - - MeteorRegistry.registerMeteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5, 1000); } public static void initImperfectRituals() diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index cc380320..e6bc9c4a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -25,12 +25,14 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -65,6 +67,32 @@ import com.google.common.collect.Iterables; public class Utils { + public static Item getItem(ResourceLocation resource) + { + return Item.REGISTRY.getObject(resource); + } + + public static Block getBlock(ResourceLocation resource) + { + return Block.REGISTRY.getObject(resource); + } + + public static ResourceLocation getResourceForItem(ItemStack stack) + { + if (stack != null) + { + if (stack.getItem() instanceof ItemBlock) + { + return Block.REGISTRY.getNameForObject(((ItemBlock) stack.getItem()).getBlock()); + } else + { + return Item.REGISTRY.getNameForObject(stack.getItem()); + } + } + + return null; + } + public static boolean canPlayerSeeDemonWill(EntityPlayer player) { ItemStack[] mainInventory = player.inventory.mainInventory;