From 826ab1cf3a01dadae2a5d5a204fa557f7134eac6 Mon Sep 17 00:00:00 2001 From: Giovanni Harting Date: Mon, 5 Dec 2016 20:34:02 +0100 Subject: [1.2] Material rework (#60) * Developement tests for nbt data in traits * Lot of trait changes and better balancing * Traits reworked a bit, new traits added. * First correction of NBT Data in Trait (Soulbound). Is shown twice. Still needs corrections. * Few fixes in traits and new trait "catcher" * Small fix, needs workaround * fixed some catch issues * Fixed Catcher and Reviving Traits, new Trait: Souleater. Updated build.gradle for new TiC Version. * Splitted SoulEater to get the bad touch to an extra trait "Cursed". Added method for using nbt more easily. Changed declaration names of fluids * Some minor changes in Traits, Registry and Utils. * Iron_nugget is replaced with oreDict Item when not loaded via TAIGA. * Beginning of new material integration. Lot of names changed, lot more work to do here. Many null pointer exceptions and no changes of values up to now. * Some Small changes in names, registry and recipes * Some weird stuff I don't remember :D * fixed some things I missed while merging * Rollback to something * More Stuff * fixed some merging stuff * Fixed some misspelled names. Actually working with lots of restrictions. * Rearranged alloys, tried to add blocks / ingots for non-tinker-materials, but they won't work. * Again tried to fix the melting issue, but non-tinker materials still are not able to be casted as a block, ingot or nugget... * Fixed integration of materials without tools. * changed IMC to direct lib calls * removed more IMC, removed redundant code * some reformatting * Alloy integration reworked, needs to be balanced. * updated deps, renamed some func's, added duplicate material check * some more renaming * some reformatting, fixed wrong import, fixed string cmp's * Added images for blocks, ingots, nuggets and dust. Json changes do not work yet. * some reformatting * Removed old json files. Placeholder needed. * Fixed block json, items not working yet. * Fixed my own derp (missing json files) * Reduced materials to ensure unique traits for most of them. Still 30 though, but reduced by 20 more :'( RIP * Changed some generator stuff, not working properly right now! * rewrote offset generation, added some debug command, fixed some stuff * fixed on-surface-generation, made dependencies more flexible * reverted gen-weight back to its normal value * Meteor generator implemented. * fixed generating on ground * optimized a thing * Replaced Uru with Osram, replaced Meteorite with Uru, added Meteorite again for Hull-Material and late game alloy. * Some changes in generation of ores, not ready yet. * Added Cobble Meteorite. Added debug command. Implemented rest of ore generation. Some minor fixes left for generation including balancing. * Some changes for ore generation. Added 2 separate Generic Blocks for meteorite and their cobble variant. * some cleanup in Generator class, added meteor world save handler * Added Textures. Added blockstates and item models. Fixed fluid rendering. * renamed world save data file to be little more specific, removed a unused method * some preps for the upcoming release * First attempt of well balancing material stats. Renamed TiberiumX to Triberium. * Final changes... ready for beta testing * Added missing alloys. * Corrected balancing of ore generation. Still WIP * removed some last debug out * one last reformat --- .../java/com/sosnitzka/taiga/util/FuelHandler.java | 24 --- .../java/com/sosnitzka/taiga/util/Generator.java | 203 +++++++++++++++++++-- .../com/sosnitzka/taiga/util/StateMatcher.java | 2 - src/main/java/com/sosnitzka/taiga/util/Utils.java | 150 ++++++++++----- 4 files changed, 295 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/com/sosnitzka/taiga/util/FuelHandler.java (limited to 'src/main/java/com/sosnitzka/taiga/util') 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) { + 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 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 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 validSurface = new HashSet(); + List 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) { + 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 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); + } + } } -- cgit v1.2.3