summaryrefslogtreecommitdiff
path: root/src/main/java/com/sosnitzka/taiga/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/sosnitzka/taiga/util')
-rw-r--r--src/main/java/com/sosnitzka/taiga/util/FuelHandler.java24
-rw-r--r--src/main/java/com/sosnitzka/taiga/util/Generator.java203
-rw-r--r--src/main/java/com/sosnitzka/taiga/util/StateMatcher.java2
-rw-r--r--src/main/java/com/sosnitzka/taiga/util/Utils.java150
4 files changed, 295 insertions, 84 deletions
diff --git a/src/main/java/com/sosnitzka/taiga/util/FuelHandler.java b/src/main/java/com/sosnitzka/taiga/util/FuelHandler.java
deleted file mode 100644
index 1db610f..0000000
--- a/src/main/java/com/sosnitzka/taiga/util/FuelHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.sosnitzka.taiga.util;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fml.common.IFuelHandler;
-
-import static com.sosnitzka.taiga.Items.*;
-import static slimeknights.tconstruct.TConstruct.random;
-
-public class FuelHandler implements IFuelHandler {
-
- @Override
- public int getBurnTime(ItemStack fuel) {
- if (fuel.getItem().equals(lignite)) {
- return 200 * 6;
- }
- if (fuel.getItem().equals(fuel_brick)) {
- return 200 * 50;
- }
- if (fuel.getItem().equals(glimmercoal)) {
- return (random.nextInt(20) + 40) * 200;
- }
- return 0;
- }
-}
diff --git a/src/main/java/com/sosnitzka/taiga/util/Generator.java b/src/main/java/com/sosnitzka/taiga/util/Generator.java
index e7aed53..3e6a694 100644
--- a/src/main/java/com/sosnitzka/taiga/util/Generator.java
+++ b/src/main/java/com/sosnitzka/taiga/util/Generator.java
@@ -1,41 +1,214 @@
package com.sosnitzka.taiga.util;
-import com.sosnitzka.taiga.world.ZWorldGenMinable;
+import com.google.common.collect.Lists;
+import com.sosnitzka.taiga.world.MeteorWorldSaveData;
+import com.sosnitzka.taiga.world.WorldGenMinable;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
+import net.minecraft.world.biome.Biome;
+import net.minecraftforge.oredict.OreDictionary;
+import java.util.HashSet;
+import java.util.List;
import java.util.Random;
+import java.util.Set;
+
+import static com.sosnitzka.taiga.util.Utils.nextInt;
public class Generator {
- public static void generateOre(IBlockState state, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
- generateOre(state, Blocks.STONE.getDefaultState(), null, null, random, x, z, world, chance, minY, maxY, minSize, maxSize);
+ public static void generateOre(boolean center, IBlockState state, IBlockState replace, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
+ if (center) {
+ generateOreDense(state, replace, random, x, z, world, chance, minY, maxY, minSize, maxSize, null);
+ } else {
+ generateOre(state, replace, null, null, random, x, z, world, chance, minY, maxY, minSize, maxSize, null);
+ }
}
- public static void generateNetherOre(IBlockState state, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
- generateOre(state, Blocks.NETHERRACK.getDefaultState(), null, null, random, x, z, world, chance, minY, maxY, minSize, maxSize);
- }
- public static void generateEndOre(IBlockState state, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
- generateOre(state, Blocks.END_STONE.getDefaultState(), null, null, random, x, z, world, chance, minY, maxY, minSize, maxSize);
+ public static void generateOre(IBlockState state, IBlockState replace, IProperty property, Comparable comparable, Random random, int chunkX, int chunkZ, World world, int chance, int minY, int maxY, int minSize, int maxSize, List<Biome> biome) {
+ int size = minSize + random.nextInt(maxSize - minSize);
+ int height = maxY - minY;
+ for (int i = 0; i < chance; i++) {
+ int posX = chunkX + random.nextInt(16);
+ int posY = random.nextInt(height) + minY;
+ int posZ = chunkZ + random.nextInt(16);
+ BlockPos cPos = new BlockPos(posX, posY, posZ);
+ if (biome == null || biome.contains(world.getBiome(cPos))) {
+ new WorldGenMinable(state, size, StateMatcher.forState(replace, property, comparable)).generate(world, random, new BlockPos(posX, posY, posZ));
+ }
+ }
}
- public static void generateOre(IBlockState state, IBlockState replace, Random random, int chunkX, int chunkZ, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
- generateOre(state, replace, null, null, random, chunkX, chunkZ, world, chance, minY, maxY, minSize, maxSize);
+ public static void generateOreDescending(List<IBlockState> replaceBlockList, IBlockState replacementBlock, Random random, int chunkX, int chunkZ, World world, int count, int minY, int maxY, int chance) {
+ if (random.nextFloat() < (float) (0.01 * chance))
+ generateOreDescending(replaceBlockList, replacementBlock, random, chunkX, chunkZ, world, count, minY, maxY);
}
- public static void generateOre(IBlockState state, IBlockState replace, IProperty property, Comparable comparable, Random random, int chunkX, int chunkZ, World world, int chance, int minY, int maxY, int minSize, int maxSize) {
- int size = minSize + random.nextInt(maxSize - minSize);
- int height = maxY - minY;
+ public static void generateOreDescending(List<IBlockState> replaceBlockList, IBlockState replacementBlock, Random random, int chunkX, int chunkZ, World world, int count, int minY, int maxY) {
+ for (int i = 0; i < count; i++) {
+ int posX = chunkX + random.nextInt(16);
+ int posZ = chunkZ + random.nextInt(16);
+ BlockPos cPos = new BlockPos(posX, maxY, posZ);
+ if (replaceBlockList.contains(world.getBlockState(cPos)) && replaceBlockList.contains(world.getBlockState(cPos.up()))) {
+ continue;
+ }
+ if (replaceBlockList.contains(world.getBlockState(cPos)) && !replaceBlockList.contains(world.getBlockState(cPos.up())))
+ world.setBlockState(cPos, replacementBlock);
+ while (!replaceBlockList.contains(world.getBlockState(cPos.down())) && cPos.getY() > minY) {
+ cPos = cPos.down();
+ }
+ if (replaceBlockList.contains(world.getBlockState(cPos.down())))
+ world.setBlockState(cPos.down(), replacementBlock);
+ }
+ }
+
+ public static void generateOreBottom(IBlockState replacedBlock, IBlockState replacementBlock, Random random, int chunkX, int chunkZ, World world, int chance, int spread, int maxY) {
for (int i = 0; i < chance; i++) {
int posX = chunkX + random.nextInt(16);
- int posY = random.nextInt(height) + minY;
+ int posY = 0;
int posZ = chunkZ + random.nextInt(16);
- new ZWorldGenMinable(state, size, StateMatcher.forState(replace, property, comparable)).generate(world, random, new BlockPos(posX, posY, posZ));
+ BlockPos cPos = new BlockPos(posX, posY, posZ);
+ if (Blocks.AIR.getDefaultState().equals(world.getBlockState(cPos))) {
+ while (world.getBlockState(cPos).equals(Blocks.AIR.getDefaultState()) && cPos.getY() < maxY) {
+ cPos = cPos.up();
+ }
+ if (world.getBlockState(cPos).equals(replacedBlock)) {
+ world.setBlockState(cPos.up(random.nextInt(spread)), replacementBlock);
+ }
+ }
+ }
+ }
+
+ public static void generateCube(boolean fly, IBlockState centerBlock, IBlockState hullBlock, Random random, int chunkX, int chunkZ, World world, int count, int chance, int minY, int maxY, int maxS) {
+ for (int i = 0; i < count; i++) {
+ if (random.nextFloat() < 0.01 * chance) {
+ int outer = nextInt(random, 1, maxS);
+ int inner = random.nextInt(2);
+ int posX = chunkX + random.nextInt(16);
+ int posY = nextInt(random, minY, maxY);
+ int posZ = chunkZ + random.nextInt(16);
+ BlockPos cPos = new BlockPos(posX, posY, posZ);
+ if (!fly) {
+ if (world.getBlockState(cPos).equals(Blocks.AIR.getDefaultState()) && world.getBlockState(cPos.down()).equals(Blocks.AIR.getDefaultState())) {
+ // we are in mid air, go down
+ while (world.getBlockState(cPos.down()).equals(Blocks.AIR.getDefaultState())) {
+ cPos = cPos.down();
+ }
+ }
+ }
+ cPos.down((random.nextInt(4) + 2) * outer);
+ for (int x = -inner; x <= inner; x++) {
+ for (int y = -inner; y <= inner; y++) {
+ for (int z = -inner; z <= inner; z++) {
+ if (!world.getBlockState(cPos).equals(Blocks.AIR.getDefaultState()))
+ continue;
+ world.setBlockState(new BlockPos(cPos.getX() + x, cPos.getY() + y, cPos.getZ() + z), centerBlock);
+ }
+ }
+ }
+ for (int x = -outer; x <= outer; x++) {
+ for (int y = -outer; y <= outer; y++) {
+ for (int z = -outer; z <= outer; z++) {
+ BlockPos nPos = new BlockPos(cPos.getX() + x, cPos.getY() + y, cPos.getZ() + z);
+ if (world.getBlockState(nPos).equals(centerBlock) || !world.getBlockState(nPos).equals(Blocks.AIR.getDefaultState()))
+ continue;
+ world.setBlockState(nPos, hullBlock);
+ }
+ }
+ }
+
+ }
+ }
+ }
+
+
+ public static void generateMeteor(IBlockState centerBlock, IBlockState hullBlock, Random random, int chunkX, int chunkZ, World world, int count, int chance, int minY, int maxY) {
+ Set<Item> validSurface = new HashSet<Item>();
+ List<String> oredictentries = Lists.newArrayList("dirt", "grass", "stone", "sand", "gravel", "cobblestone", "sandstone");
+ for (String e : oredictentries) {
+ for (ItemStack stack : OreDictionary.getOres(e)) {
+ validSurface.add(stack.getItem());
+ }
+ }
+
+ for (int i = 0; i < count; i++) {
+ if (random.nextFloat() < 0.01 * chance) {
+ int r = nextInt(random, 1, 5);
+ int posX = chunkX + random.nextInt(16);
+ int posY = nextInt(random, minY, maxY);
+ int posZ = chunkZ + random.nextInt(16);
+ BlockPos cPos = new BlockPos(posX, posY, posZ);
+ if (world.getBlockState(cPos).equals(Blocks.AIR.getDefaultState()) && world.getBlockState(cPos.down()).equals(Blocks.AIR.getDefaultState())) {
+ // we are in mid air, go down
+ while (world.getBlockState(cPos.down()).equals(Blocks.AIR.getDefaultState())) {
+ cPos = cPos.down();
+ }
+ }
+ if (!validSurface.contains(Item.getItemFromBlock(world.getBlockState(cPos.down()).getBlock())))
+ continue;
+ cPos.down((random.nextInt(3) + 1) * r);
+
+ MeteorWorldSaveData saveData = MeteorWorldSaveData.getForWorld(world);
+ saveData.addPos(cPos);
+ saveData.markDirty();
+
+ int t = 1;
+ if (r > 3) t = random.nextInt(r - 1);
+ for (int x = -t; x <= t; x++) {
+ for (int y = -t; y <= t; y++) {
+ for (int z = -t; z <= t; z++) {
+ if (MathHelper.sqrt_double(x * x + y * y + z * z) > t) {
+ continue;
+ }
+ world.setBlockState(new BlockPos(cPos.getX() + x, cPos.getY() + y, cPos.getZ() + z), centerBlock);
+ }
+ }
+ }
+ for (int x = -r; x <= r; x++) {
+ for (int y = -r; y <= r; y++) {
+ for (int z = -r; z <= r; z++) {
+ if (MathHelper.sqrt_double(x * x + y * y + z * z) > r) {
+ continue;
+ }
+ BlockPos nPos = new BlockPos(cPos.getX() + x, cPos.getY() + y, cPos.getZ() + z);
+ if (world.getBlockState(nPos).equals(centerBlock))
+ continue;
+ world.setBlockState(nPos, hullBlock);
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ public static void generateOreDense(IBlockState state, IBlockState replace, Random random, int chunkX, int chunkZ, World world, int chance, int minY, int maxY, int minSize, int maxSize, List<Biome> biome) {
+ int size = minSize + random.nextInt(maxSize - minSize);
+ int height = maxY - minY;
+ BlockPos cPos;
+ for (int i = 0; i < chance; i += 5) {
+ for (int j = 0; j <= 2; j++) {
+ cPos = new BlockPos(chunkX + random.nextInt(16), minY + height * j / 5 + random.nextInt(height * 3 / 5), chunkZ + random.nextInt(16));
+ if (biome == null || biome.contains(world.getBiome(cPos))) {
+ new WorldGenMinable(state, size, StateMatcher.forState(replace, null, null)).generate(world, random, cPos);
+ }
+ }
+ for (int j = 0; j <= 1; j++) {
+ int x = chunkX + random.nextInt(16);
+ int y = chunkZ + random.nextInt(16);
+ cPos = new BlockPos(x, minY + height * 4 / 9 + random.nextInt(height / 9), y);
+ if (biome == null || biome.contains(world.getBiome(cPos))) {
+ new WorldGenMinable(state, size, StateMatcher.forState(replace, null, null)).generate(world, random, cPos);
+ }
+ }
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/util/StateMatcher.java b/src/main/java/com/sosnitzka/taiga/util/StateMatcher.java
index b473be5..87a4949 100644
--- a/src/main/java/com/sosnitzka/taiga/util/StateMatcher.java
+++ b/src/main/java/com/sosnitzka/taiga/util/StateMatcher.java
@@ -64,8 +64,6 @@ public class StateMatcher implements Predicate<IBlockState> {
IBlockState bState = world.getBlockState(blockPos);
if (bState.getBlock() == this.state.getBlock() && bState.getValue(property) == value) {
- // Check if a replacable block is near origin block - show pos in console
- // System.out.println(String.format("Found block with desired state! (%s), Block: %s, try #%s, y=%s", i, Y));
return true;
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/util/Utils.java b/src/main/java/com/sosnitzka/taiga/util/Utils.java
index 57c74cf..a2872e4 100644
--- a/src/main/java/com/sosnitzka/taiga/util/Utils.java
+++ b/src/main/java/com/sosnitzka/taiga/util/Utils.java
@@ -1,20 +1,33 @@
package com.sosnitzka.taiga.util;
+import com.sosnitzka.taiga.Items;
+import com.sosnitzka.taiga.TAIGA;
+import com.sun.istack.internal.Nullable;
import net.minecraft.block.Block;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
-import net.minecraftforge.fml.common.event.FMLInterModComms;
+import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.registry.GameRegistry;
+import org.apache.commons.lang3.StringUtils;
+import slimeknights.tconstruct.library.MaterialIntegration;
+import slimeknights.tconstruct.library.TinkerRegistry;
+import slimeknights.tconstruct.library.materials.*;
+
+import java.lang.reflect.Field;
+import java.util.Random;
+
+import static com.sosnitzka.taiga.TAIGA.proxy;
public class Utils {
public static String PREFIX_INGOT = "ingot";
public static String PREFIX_NUGGET = "nugget";
public static String PREFIX_ORE = "ore";
public static String PREFIX_BLOCK = "block";
+ public static String PREFIX_DUST = "dust";
/**
* Registers the block and its corresponding item (block as item in inventory)
@@ -28,6 +41,7 @@ public class Utils {
/**
* Registers the fluid and its bucket item
+ *
* @param fluid the fluid
*/
public static void registerFluid(Fluid fluid) {
@@ -35,51 +49,101 @@ public class Utils {
FluidRegistry.addBucketForFluid(fluid);
}
- public static void registerTinkerAlloys(Fluid alloy, int out, Fluid first, int inOne, Fluid second, int inTwo) {
- NBTTagList tagList = new NBTTagList();
- NBTTagCompound fluid = new NBTTagCompound();
- fluid.setString("FluidName", alloy.getName());
- fluid.setInteger("Amount", out);
- tagList.appendTag(fluid);
- fluid = new NBTTagCompound();
- fluid.setString("FluidName", first.getName());
- fluid.setInteger("Amount", inOne);
- tagList.appendTag(fluid);
- fluid = new NBTTagCompound();
- fluid.setString("FluidName", second.getName());
- fluid.setInteger("Amount", inTwo);
- tagList.appendTag(fluid);
-
- NBTTagCompound message = new NBTTagCompound();
- message.setTag("alloy", tagList);
- FMLInterModComms.sendMessage("tconstruct", "alloy", message);
- }
- public static void registerTinkerAlloys(Fluid alloy, int out, Fluid first, int inOne, Fluid second, int inTwo, Fluid third, int inThree) {
- NBTTagList tagList = new NBTTagList();
- NBTTagCompound fluid = new NBTTagCompound();
- fluid.setString("FluidName", alloy.getName());
- fluid.setInteger("Amount", out);
- tagList.appendTag(fluid);
- fluid = new NBTTagCompound();
- fluid.setString("FluidName", first.getName());
- fluid.setInteger("Amount", inOne);
- tagList.appendTag(fluid);
- fluid = new NBTTagCompound();
- fluid.setString("FluidName", second.getName());
- fluid.setInteger("Amount", inTwo);
- tagList.appendTag(fluid);
- fluid = new NBTTagCompound();
- fluid.setString("FluidName", third.getName());
- fluid.setInteger("Amount", inThree);
- tagList.appendTag(fluid);
-
- NBTTagCompound message = new NBTTagCompound();
- message.setTag("alloy", tagList);
- FMLInterModComms.sendMessage("tconstruct", "alloy", message);
+ public static void registerTinkerAlloy(FluidStack output, FluidStack... inputs) {
+ if (inputs.length >= 2 && output != null) {
+ TinkerRegistry.registerAlloy(output, inputs);
+ }
}
public static boolean isNight(int time) {
return time > 12500;
}
+
+ public static double round2(double d) {
+ return (Math.round(d * 100.0) / 100.0);
+ }
+
+ public static void integrateMaterial(String oreSuffix, @Nullable Material material, Fluid fluid, int headDura, float headSpeed, float headAttack, float handleMod, int handleDura, int extra, int headLevel, float draw, float range, int bdamage) {
+ integrateMaterial(oreSuffix, material, fluid, headDura, headSpeed, headAttack, handleMod, handleDura, extra, headLevel, new BowMaterialStats(draw, range, bdamage), false, true);
+ }
+
+ public static void integrateMaterial(String oreSuffix, @Nullable Material material, Fluid fluid, int headDura, float headSpeed, float headAttack, float handleMod, int handleDura, int extra, int headLevel, BowMaterialStats bowstats) {
+ integrateMaterial(oreSuffix, material, fluid, headDura, headSpeed, headAttack, handleMod, handleDura, extra, headLevel, bowstats, false, true);
+ }
+
+ public static void integrateMaterial(String oreSuffix, @Nullable Material material, Fluid fluid, int headDura, float headSpeed, float headAttack, float handleMod, int handleDura, int extra, int headLevel, BowMaterialStats bowstats, boolean craft, boolean cast) {
+ if (material != null) {
+ if (TinkerRegistry.getMaterial(material.identifier) != Material.UNKNOWN)
+ return;
+
+ TinkerRegistry.addMaterialStats(material, new HeadMaterialStats(headDura, headSpeed, headAttack, headLevel));
+ TinkerRegistry.addMaterialStats(material, new HandleMaterialStats(handleMod, handleDura));
+ TinkerRegistry.addMaterialStats(material, new ExtraMaterialStats(extra));
+ TinkerRegistry.addMaterialStats(material, bowstats);
+
+ Item item = null;
+ Field[] items = Items.class.getDeclaredFields();
+ for (Field i : items) {
+ if (i.getName().equals(StringUtils.uncapitalize(oreSuffix) + "Ingot")) {
+ Item r = null;
+ try {
+ r = (Item) i.get(i.getType());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ item = r;
+ }
+ }
+
+ material.setFluid(fluid).setCraftable(craft).setCastable(cast).addItem(item, 1, Material.VALUE_Ingot);
+ material.setRepresentativeItem(item);
+ proxy.setRenderInfo(material);
+ }
+
+ MaterialIntegration integration = new MaterialIntegration(material, fluid, oreSuffix);
+ integration.integrate();
+ TAIGA.integrateList.add(integration);
+ }
+
+ public static void integrateOre(String oreSuffix, Fluid fluid) {
+ integrateMaterial(oreSuffix, null, fluid, -1, -1, -1, -1, -1, -1, -1, new BowMaterialStats(0.1f, 0.1f, -1f), true, true);
+ }
+
+ public static int nextInt(Random random, int min, int max) {
+ return random.nextInt((max - min) + 1) + min;
+ }
+
+ public static class GeneralNBTData {
+
+ public int killcount;
+ public float health;
+ public int brokenblocks;
+ public float bonus;
+ public int curse;
+ public String name;
+ public float radius;
+
+ public static GeneralNBTData read(NBTTagCompound tag) {
+ GeneralNBTData data = new GeneralNBTData();
+ data.killcount = tag.getInteger("killcount");
+ data.brokenblocks = tag.getInteger("brokenblocks");
+ data.health = tag.getFloat("health");
+ data.bonus = tag.getFloat("bonus");
+ data.curse = tag.getInteger("curse");
+ data.name = tag.getString("name");
+ data.radius = tag.getFloat("radius");
+ return data;
+ }
+
+ public void write(NBTTagCompound tag) {
+ tag.setInteger("killcount", killcount);
+ tag.setInteger("brokenblocks", brokenblocks);
+ tag.setFloat("health", health);
+ tag.setFloat("bonus", bonus);
+ tag.setInteger("curse", curse);
+ tag.setString("name", name);
+ tag.setFloat("radius", radius);
+ }
+ }
}