Jump to content

making custom ores


dualinfinities

Recommended Posts

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.

Link to comment
Share on other sites

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 :P

 

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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;

    }

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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) {

    }
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.