Posted November 11, 20159 yr I'm making a mod to add custom ores for a modpack I'm making, how would I create ores without making a new class for each of the ores (because I have 25+ ores (metallurgy))?
November 11, 20159 yr Author the ores also have to break successively, but I already have that one mostly figured out.
November 11, 20159 yr the ores also have to break successively Meaning? Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 11, 20159 yr Author basically Harder Ores, except I'm trying to get it set up to generate ores from a config. hopefully that's easier than doing it during runtime. WTFOres wasn't what I was looking for, but it had a niceish config.
November 11, 20159 yr how would I create ores without making a new class for each of the ores (because I have 25+ ores (metallurgy))? Well, if you know Java, the answer: "Class != Instance" should be enough. If you don't I can only say - learn what above answer means (google). You can't really write anything "nice" without Java As to config ores - you will need to use forge's Configuration. Load config on startup (preInit). Read some values and use them to change properties of new ore instances or their generators. Again - without java, learning to use Config can be hard. 1.7.10 is no longer supported by forge, you are on your own.
November 11, 20159 yr Aside from the fact that I'd originally needed some slight customization between the different ores (which has become less and less needed) you can do it all through one class. You just need to push enough things into the constructor (or have setters). Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 12, 20159 yr It depends how distinctive these ores and their behaviors are. If you have a very systematic way of programming them, then look into metadata and setting up sets of 16 ingots for 16 ores. Above all of the sets would be an abstract class with all of the common code. Then again, metadata might not work for what you might want to do, but an abstract class can still hold all your common code so that the many ore classes are tiny things. And if your ores sort into a few broad categories with systematic features, you could even have an intermediate layer with ore-category abstract classes. The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.
November 12, 20159 yr Author I have them mostly working, but the method to get the next block is apparently not initializing the value it is passing and I'm not sure if it is the method itself that's the problem, or if it is one of the classes it calls. am I doing something stupid, or just being stupid? public Block GetNextBlock(BlockDIOre inputBlock) { Block outputBlock; DIOreRegistry registry = new DIOreRegistry(); if (registry.densityMap.get(inputBlock) != 0) { for (BlockDIOre currentOre : registry.oreMap.keySet()) { for (BlockDIOre currentOre1 : registry.densityMap.keySet()) { for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) { if (registry.oreMap.get(currentOre).equals(registry.oreMap.get(inputBlock)) && registry.densityMap.get(currentOre1) == registry.densityMap.get(inputBlock) - 1 && registry.baseBlockMap.get(currentOre2) == registry.baseBlockMap.get(inputBlock)) { outputBlock = currentOre; } } } } } else outputBlock = registry.baseBlockMap.get(inputBlock); return outputBlock; }
November 12, 20159 yr I have them mostly working, but the method to get the next block is apparently not initializing the value it is passing and I'm not sure if it is the method itself that's the problem, or if it is one of the classes it calls. am I doing something stupid, or just being stupid? public Block GetNextBlock(BlockDIOre inputBlock) { Block outputBlock; DIOreRegistry registry = new DIOreRegistry(); if (registry.densityMap.get(inputBlock) != 0) { for (BlockDIOre currentOre : registry.oreMap.keySet()) { for (BlockDIOre currentOre1 : registry.densityMap.keySet()) { for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) { if (currentOre.ore.equals(registry.oreMap.get(inputBlock)) && currentOre1.density == registry.densityMap.get(inputBlock) - 1 && currentOre2.baseBlock == registry.baseBlockMap.get(inputBlock)) { outputBlock = currentOre; } } } } } else outputBlock = registry.baseBlockMap.get(inputBlock); return outputBlock; } I do not even know WTF you're doing here. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 12, 20159 yr Author starting to think I don't either, looking at it. trying to replace the ore with a less dense version after it reaches max meta. my setup seems kinda stupid... I register 3 values from the ore constructor to 3 different HashMaps (so I can look them up to replace the ore block) and then look them up in the getNextBlock() method and check them against the current block's values to find the next densest ore. ore is the metal/gem/dust the ore has, density is the number of blocks left before the ore runs out (basically), baseBlock is what block the ore is found in like stone/dirt/gravel.
November 12, 20159 yr Trying to have more than 16 density values is probably messing you up. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 12, 20159 yr nope, density is blocks, not meta. Ok....what are you using meta for, then? Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 12, 20159 yr Author Kinda... Also density? But separate from the density value. I added "= null" to initialize outputBlock, was that really all it was? maybe it had an issue because there wasn't an "else" condition on the inner "if" block. "currentOre" is a BlockDIOre, not the "ore" value.
November 13, 20159 yr Its still a terrible, terrible loop. I'm almost certain there is a collection that would suit your needs better than a HashMap which you aren't even using as a hash map. You're treating them as arrays for no good reason. Because seriously, currentOre.ore.equals(registry.oreMap.get(inputBlock)) //being true could be done by currentOre = registry.oreMap.get(inputBlock) AFAICT. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 13, 20159 yr Author The full class, if that helps at all: package com.dualinfinities.DIOres.block; import com.dualinfinities.DIOres.reference.DIOreRegistry; import com.dualinfinities.DIOres.reference.Names; import com.dualinfinities.DIOres.reference.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.world.World; public class BlockDIOre extends Block { public String ore; public int density; public Block baseBlock; DIOreRegistry registry = new DIOreRegistry(); Names nameClass = new Names(); public BlockDIOre(Material material){ super(material); } public BlockDIOre(String ore, int miningLevel, String miningTool, int oreStyle, int density, Block baseBlock){ this(baseBlock.getMaterial()); this.setCreativeTab(CreativeTabs.tabBlock); this.setBlockName(nameClass.translateValuesToString(this)); this.setDensity(density); this.setOre(ore); this.setBaseBlock(baseBlock); /** * valid tool values are "pickaxe", "shovel", "axe" * */ this.setHarvestLevel(miningTool, miningLevel); this.addToOreMap(this, ore); this.addToDensityMap(this, density); this.addToBaseMap(this, baseBlock); } @Override public String getUnlocalizedName() { return String.format("tile.%s%s", Reference.MOD_ID.toLowerCase() + ":", getUnwrappedUnlocalizedName(super.getUnlocalizedName())); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { blockIcon = iconRegister.registerIcon(String.format("%s", getUnwrappedUnlocalizedName(this.getUnlocalizedName()))); } protected String getUnwrappedUnlocalizedName(String unlocalizedName) { return unlocalizedName.substring(unlocalizedName.indexOf(".") + 1); } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { if (meta < 15) { world.setBlock(x, y, z, this, meta + 1, 0); } else if (meta == 15) { world.setBlock(x, y, z, getNextBlock((BlockDIOre) block), 0, 0); } } public Block getNextBlock(BlockDIOre inputBlock) { Block outputBlock = null; if (registry.densityMap.get(inputBlock) != 0) { for (BlockDIOre currentOre : registry.oreMap.keySet()) { for (BlockDIOre currentOre1 : registry.densityMap.keySet()) { for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) { if (getOre(currentOre).equals(getOre(inputBlock)) && getDensity(currentOre1) == getDensity(inputBlock) - 1 && getBaseBlock(currentOre2) == getBaseBlock(inputBlock) && currentOre == currentOre1 && currentOre1 == currentOre2) { outputBlock = currentOre; } } } } } else outputBlock = registry.baseBlockMap.get(inputBlock); return outputBlock; } public int getDensity(BlockDIOre oreToGet){ return registry.densityMap.get(oreToGet); } public void setDensity(int densityToSet) { this.density = densityToSet; } public String getOre(BlockDIOre oreToGet){ return registry.oreMap.get(oreToGet); } public void setOre(String oreToSet) { this.ore = oreToSet; } public Block getBaseBlock(BlockDIOre baseBlockToGet){ return registry.baseBlockMap.get(baseBlockToGet); } public void setBaseBlock(Block baseBlockToSet) { this.baseBlock = baseBlockToSet; } /** * NYI * */ public void addToOreMap(BlockDIOre blockOre, String ore) { } public void addToDensityMap(BlockDIOre blockOre, int density) { } public void addToBaseMap(BlockDIOre blockOre, Block baseBlock) { } }
November 13, 20159 yr See, your hashmaps are useless. this.addToBaseMap(this, baseBlock); //this serves no purpose If you have the block that is the key in that map ( registry.baseBlockMap.get(theBlock) ), you can just do theBlock.baseBlock and get the same thing. What you should be doing is storing a block1 -> block2 map where block1 is "this" and block2 is the next density (or whatever) down after its mined. Then you just have to create the blocks in the correct order (densest to least dense) adding to the map as you go. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
November 14, 20159 yr Author d'oh. accurate profile blurb is accurate. that's way simpler than the stupid way I was trying to do, thanks for helping me.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.