Rewrite Meteor system to be fully json (#914)

Also cleans up some other JSON stuff
This commit is contained in:
Nicholas Ignoffo 2016-09-12 19:54:46 -07:00
parent 0bb2fa6002
commit d1455920ec
11 changed files with 261 additions and 196 deletions

View file

@ -1,61 +1,50 @@
package WayofTime.bloodmagic.meteor;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import lombok.AllArgsConstructor;
import net.minecraft.block.Block;
import lombok.Getter;
import lombok.Setter;
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;
@AllArgsConstructor
public class MeteorHolder
@Getter
public class Meteor
{
public static Random rand = new Random();
public ResourceLocation resourceKey;
public int metaKey = 0;
public List<MeteorComponent> components = new ArrayList<MeteorComponent>();
private static final Random RAND = new Random();
public float explosionStrength = 1;
public int radius = 1;
private final ItemStack catalystStack;
private final List<MeteorComponent> components;
private final float explosionStrength;
private final int radius;
private final int maxWeight;
public int maxWeight = 1000;
@Setter
public int version;
public ItemStack getKeyStack(int meta)
public Meteor(ItemStack catalystStack, List<MeteorComponent> components, float explosionStrength, int radius, int maxWeight)
{
Item item = Utils.getItem(resourceKey);
if (item != null)
{
return new ItemStack(item, 1, meta);
} else
{
Block block = Utils.getBlock(resourceKey);
if (block != null)
{
return new ItemStack(block, 1, meta);
}
}
return null;
this.catalystStack = catalystStack;
this.components = components;
this.explosionStrength = explosionStrength;
this.radius = radius;
this.maxWeight = maxWeight;
}
public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock)
{
world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), explosionStrength, true, true);
for (int i = -radius; i <= radius; i++)
for (int i = -getRadius(); i <= getRadius(); i++)
{
for (int j = -radius; j <= radius; j++)
for (int j = -getRadius(); j <= getRadius(); j++)
{
for (int k = -radius; k <= radius; k++)
for (int k = -getRadius(); k <= getRadius(); k++)
{
if (i * i + j * j + k * k > (radius + 0.5) * (radius + 0.5))
if (i * i + j * j + k * k > (getRadius() + 0.5) * (getRadius() + 0.5))
{
continue;
}
@ -75,9 +64,9 @@ public class MeteorHolder
public IBlockState getRandomOreFromComponents(IBlockState fillerBlock)
{
int goal = rand.nextInt(maxWeight);
int goal = RAND.nextInt(getMaxWeight());
for (MeteorComponent component : components)
for (MeteorComponent component : getComponents())
{
goal -= component.getWeight();
if (goal < 0)

View file

@ -0,0 +1,115 @@
package WayofTime.bloodmagic.meteor;
import WayofTime.bloodmagic.ConfigHandler;
import WayofTime.bloodmagic.gson.Serializers;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.lang3.tuple.Pair;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MeteorConfigHandler
{
private static final Map<String, Meteor> DEFAULT_METEORS = new HashMap<String, Meteor>();
private static File meteorDir;
public static void init(File meteorDirectory)
{
meteorDir = meteorDirectory;
handleMeteors(true);
}
public static void handleMeteors(boolean checkNewVersion)
{
// Clear the meteors so that reloading in-game can be done
MeteorRegistry.meteorMap.clear();
List<Pair<String, Meteor>> defaultMeteors = getDefaultMeteors();
try
{
// Create defaults if the folder doesn't exist
if (!meteorDir.exists() && meteorDir.mkdir())
{
for (Pair<String, Meteor> meteor : defaultMeteors)
{
String json = Serializers.GSON.toJson(meteor.getRight());
FileWriter writer = new FileWriter(new File(meteorDir, meteor.getLeft() + ".json"));
writer.write(json);
writer.close();
}
}
// Collect all meteors from the files
File[] meteorFiles = meteorDir.listFiles((FileFilter) FileFilterUtils.suffixFileFilter(".json"));
if (meteorFiles == null)
return;
List<Pair<String, Meteor>> meteors = new ArrayList<Pair<String, Meteor>>();
// Filter names so we can compare to defaults
for (File meteorFile : meteorFiles)
{
Meteor meteor = Serializers.GSON.fromJson(new FileReader(meteorFile), Meteor.class);
meteors.add(Pair.of(FilenameUtils.removeExtension(meteorFile.getName()), meteor));
}
if (checkNewVersion && ConfigHandler.getConfig().getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them"))
{
// Check defaults for new version
for (Pair<String, Meteor> meteor : meteors)
{
Meteor defaultMeteor = DEFAULT_METEORS.get(meteor.getLeft());
if (defaultMeteor != null && defaultMeteor.version > meteor.getRight().version)
{
String json = Serializers.GSON.toJson(defaultMeteor);
File meteorFile = new File(meteorDir, meteor.getLeft() + ".json");
new PrintWriter(meteorFile).close(); // Clear the file
FileWriter fileWriter = new FileWriter(meteorFile);
fileWriter.write(json); // Write the new contents
fileWriter.close();
meteors.set(meteors.indexOf(meteor), Pair.of(meteor.getLeft(), defaultMeteor));
}
}
}
// Finally, register all of our meteors
for (Pair<String, Meteor> meteor : meteors)
MeteorRegistry.registerMeteor(meteor.getRight().getCatalystStack(), meteor.getRight());
} catch (Exception e)
{
e.printStackTrace();
}
ConfigHandler.getConfig().save();
}
private static List<Pair<String, Meteor>> getDefaultMeteors()
{
List<Pair<String, Meteor>> holders = new ArrayList<Pair<String, Meteor>>();
// Iron
List<MeteorComponent> ironMeteorList = new ArrayList<MeteorComponent>();
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"));
Meteor ironMeteor = new Meteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5, 1000);
ironMeteor.setVersion(2);
holders.add(Pair.of("IronMeteor", ironMeteor));
DEFAULT_METEORS.put("IronMeteor", ironMeteor);
return holders;
}
}

View file

@ -6,17 +6,15 @@ 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
{
public static Map<ItemStackWrapper, MeteorHolder> meteorMap = new HashMap<ItemStackWrapper, MeteorHolder>();
public static Map<ItemStackWrapper, Meteor> meteorMap = new HashMap<ItemStackWrapper, Meteor>();
public static void registerMeteor(ItemStack stack, MeteorHolder holder)
public static void registerMeteor(ItemStack stack, Meteor holder)
{
ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack);
if (wrapper != null)
@ -27,10 +25,7 @@ public class MeteorRegistry
public static void registerMeteor(ItemStack stack, List<MeteorComponent> componentList, float explosionStrength, int radius, int maxWeight)
{
ResourceLocation resource = Utils.getResourceForItem(stack);
MeteorHolder holder = new MeteorHolder(resource, stack.getItemDamage(), componentList, explosionStrength, radius, maxWeight);
Meteor holder = new Meteor(stack, componentList, explosionStrength, radius, maxWeight);
registerMeteor(stack, holder);
}
@ -40,7 +35,7 @@ public class MeteorRegistry
return wrapper != null && meteorMap.containsKey(wrapper);
}
public static MeteorHolder getMeteorForItem(ItemStack stack)
public static Meteor getMeteorForItem(ItemStack stack)
{
ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack);
return wrapper != null ? meteorMap.get(wrapper) : null;
@ -48,7 +43,7 @@ public class MeteorRegistry
public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock)
{
MeteorHolder holder = getMeteorForItem(stack);
Meteor holder = getMeteorForItem(stack);
if (holder != null)
{
holder.generateMeteor(world, pos, fillerBlock);