Jump to content

ITextureProvider not working for my block


Qwertygiy

Recommended Posts

I was working on the beginning of a mod that I'm not entirely sure I'm good enough of a modder to complete yet, but I figured I might as well learn as I go. However, I got stopped almost as soon as I got started because my new ores won't load their texture.

 

mod_KBIMynTek:

 

 

package net.minecraft.src;

import java.util.Random;
import java.util.Map;
import java.io.File;
import java.io.IOException;
import net.minecraft.src.forge.*;
import net.minecraft.src.KBI.MynTek.*;

public class mod_KBIMynTek extends NetworkMod
{

public static int ore1ID;
public static boolean generateCopper;
public static boolean generateTin;
public static Configuration config;
public static Block ore;

public static void initProps()
    {

        File file = new File(ModLoader.getMinecraftInstance().getMinecraftDir() + "/config/KBI");
        file.mkdir();
        File newFile = new File(ModLoader.getMinecraftInstance().getMinecraftDir() + "/config/KBI/MynTek.cfg");

        /* Some basic debugging will go a long way */
        try
        {
            newFile.createNewFile();
            System.out.println("Successfully created/read Configuration file for MynTek");
        }
        catch (IOException e)
        {
            System.out.println("Could not create Configuration file for MynTek. Reason:");
            System.out.println(e);
        }

        config = new Configuration(newFile);
        config.load();

	ore1ID = config.getOrCreateIntProperty("Metal Ore ID", "block", 3300).getInt(3300);
	generateCopper = config.getOrCreateBooleanProperty("Generate Copper Ore", "block", true).getBoolean(true);
	generateTin = config.getOrCreateBooleanProperty("Generate Tin Ore", "block", true).getBoolean(true);

	config.save();
    }

public static void defineItems()
{
	ore = new OreBlock(ore1ID, 0).setStepSound(Block.soundStoneFootstep).setHardness(3.0F).setResistance(15.0F).setBlockName("KBIore");
}

public String Version()
    {
        return "KBI MynTek v0.0.1";
    }


    public String getVersion()
    {
        return "1.2.5.";
    }

public mod_KBIMynTek()
{
	MinecraftForgeClient.preloadTexture("/KBI/MynTekBlocks.png");

	initProps();
	defineItems();

	ModLoader.registerBlock(ore, net.minecraft.src.KBI.MynTek.OreItem.class);

	ModLoader.addLocalization("KBICopperOre.name", "Copper Ore");
	ModLoader.addLocalization("KBITinOre.name", "Tin Ore");

	MinecraftForge.registerOre("oreCopper", new ItemStack(ore, 1, 0));
	MinecraftForge.registerOre("oreTin", new ItemStack(ore, 1, 1));

	MinecraftForge.setBlockHarvestLevel(ore, 0, "pickaxe", 1); //needs stone
	MinecraftForge.setBlockHarvestLevel(ore, 1, "pickaxe", 1);
}

@Override
    public void generateSurface(World world, Random random, int chunkX, int chunkZ)
    {
	WorldGen.generateOres(world, random, chunkX, chunkZ);
                 // located in /KBI/MynTek
    }

public void load() 
{
MinecraftForgeClient.preloadTexture("/KBI/MynTek/Blocks.png");
}

@Override
public boolean clientSideRequired() {
	return true;
}

@Override
public boolean serverSideRequired() {
	return false;
}

}

 

 

 

/KBI/MynTek/OreBlock:

 

 

package net.minecraft.src.KBI.MynTek;
import java.util.ArrayList;
import java.util.Random;
import net.minecraft.src.forge.*;
import net.minecraft.src.*;

public class OreBlock extends Block
    implements ITextureProvider
{

protected int metaData; //not really metadata; I should change the variable name to something else
protected int ID;

    public OreBlock(int i, int j)
    {
        super(i, j, Material.rock);
	metaData = j;
	ID = i;
    }
    
    public int idDropped(int md, Random random, int fortune)
    {
	return ID;
    }

    public int damageDropped(int i)
    {
	return i;
    }

public static int getHeight(Random rand, int top, int bottom)
{
	int check = rand.nextInt(top);
	if(check >= bottom)
	{
		return check;
	}
	else
	{
		return getHeight(rand, top, bottom);
	}
}

public int quantityDropped(Random random)
{
	return 1;
}

    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
	return j; // + metaData;
    }

    public String getTextureFile()
    {
        return "/KBI/MynTekBlocks.png";
    }
    
    public void addCreativeItems(ArrayList arraylist)
    {
        arraylist.add(new ItemStack(mod_KBIMynTek.ore, 1, 0));
	arraylist.add(new ItemStack(mod_KBIMynTek.ore, 1, 1));
    }
}

 

 

 

I've tried renaming it, repositioning it, and still it shows the white-and-black no-texture-loaded texture when I start the client via MCP. I cannot figure out how it is different from my previous mod which DOES work. What am I doing wrong?

Link to comment
Share on other sites

To the first; okay, I did try that but it wasn't working. Like I said I tweaked stuff around.

 

To the second; alright, I still have a lot of researching and repetitive code to write -- my ores are biome-specific as they are in the real world.

 

To the third; I use @Override where it's used in the code I'm learning from, but I think I read somewhere that it really doesn't matter; what's the difference between using it and not?

Link to comment
Share on other sites

first i see is that u preload 2 diffrent textures both are block sprites. can it be that u missplelled in gettexturefile your path?

 

little tip use

public static final String blockTxtPath = "YOUR/PATH/HERE";

 

and in getTextureFile

return mod_YOURMODNAME.blockTxtPath;

 

so you just need to write the path 1 time down and prevent misspellings

Developing CocktailsMod :)

Link to comment
Share on other sites

The file was originally located at "/KBI/MynTek/Blocks.png" and then when I thought that perhaps it could only read sprite files from one folder in, I changed it to "/KBI/MynTekBlocks.png" but must have forgotten to change the "extra" call inside load() in addition to the call in the constructor. It is the same inside both the block file and the main mod file -- I copied and pasted it back and forth and quadruple-checked the path and everything.

 

I have confirmed that it is not an issue with MCP's startclient.bat not including the file; I reobfuscated it and tested it in my normal Minecraft setup with the same results. I didn't really think that it was the issue but it was worth ruling out.

Link to comment
Share on other sites

I'm suspecting that maybe my image is not in a supported format even though it's png. I just tried "/terrain.png" and it worked fine. So I think maybe Forge and Minecraft can't read my image properly.

 

EDIT: Nope, I replaced it with a terrain image from another mod and it still wouldn't read it.

Link to comment
Share on other sites

Okay, I've gotten a slight success.

 

Instead of including it in the MCP-built minecraft.jar, I need to put the image inside a new folder in the MCP-built /mods directory for it to work when using startclient.bat. Not sure how everything will work when I finally export it out of MCP and into a usable ZIP file, but it'll work for now.

Link to comment
Share on other sites

To the third; I use @Override where it's used in the code I'm learning from, but I think I read somewhere that it really doesn't matter; what's the difference between using it and not?

 

if you put it, you get an error if youve put an out of place capital letter or parameter

Link to comment
Share on other sites

Did you create the folders inside of minecraft.jar in /<MCPDIR>/jars/bin/ ?

It needs to find the texture file there to make it work.

 

Oh, and this is the 1337th post in this board.  ;D

So, what would happen if I did push that shiny red button over there? ... Really? ... Can I try it? ... Damn.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Post logs as per https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/ They may have information that will answer these questions.
    • I was left reeling when a glitch on a cryptocurrency exchange caused me to lose $166,000 worth of my hard-earned savings. It felt like my entire world had crumbled in the blink of an eye, leaving me with a sense of hopelessness. Determined not to give up, I delved into research on recovery options, unsure of what to expect. That's when I stumbled upon I was left reeling when a glitch on a cryptocurrency exchange caused me to lose $166,000 worth of my hard-earned savings. It felt like my entire world had crumbled in the blink of an eye, leaving me with a sense of hopelessness. Determined not to give up, I delved into research on recovery options, unsure of what to expect. That's when I stumbled upon DIGITAL HACK RECOVERY, a beacon of hope in my darkest hour. Despite my initial doubts, I decided to take a leap of faith and give them a shot as a final lifeline. The experts at DIGITAL HACK RECOVERY proved to be masters of their craft, guiding me through their exclusive process with precision and expertise. Utilizing cutting-edge blockchain analysis methods, they were able to track down the elusive trail of my missing funds and identify the exact point of failure. Their forensic talents were unparalleled as they tirelessly combed through the intricate web of blockchain data to locate my cryptocurrency. With each step they took, they kept me informed of their progress, never wavering in their belief that my funds could be rescued. After several painstaking weeks, DIGITAL HACK RECOVERY finally located and restored my $166,000 worth of cryptocurrency. I was awestruck that they were able to salvage what I had thought was lost forever. The whole experience restored my faith in the crypto space and proved that even in the worst situations, recovery is possible with the right experts on your side. I will be forever grateful to DIGITAL HACK RECOVERY for giving me back my life savings when I needed it most. Their tireless efforts and technical mastery turned what could have been a devastating loss into an uplifting success story. Book a time with DIGITAL HACK RECOVERY through: digital hack recovery @ techie . com &  +12018871705
    • public class ParticleReboundRecipe implements Recipe<CraftingContainer> { private List<ParticleReboundIngredient> inputs; private ParticleReboundFuel fuel; private ItemStack output; public ParticleReboundRecipe(List<ParticleReboundIngredient> inputs, ParticleReboundFuel fuel, ItemStack output) { this.inputs = inputs; this.fuel = fuel; this.output = output; } // TODO: Implement interface ... // TODO: Move to separate file if desired public record ParticleReboundIngredient(Ingredient ingredient, int count) { public static final Codec<ParticleReboundIngredient> CODEC = RecordCodecBuilder.create( builder -> builder.group( Ingredient.CODEC.fieldOf("ingredient").forGetter((i) -> i.ingredient), Codec.INT.fieldOf("count").forGetter(i -> i.count) ).apply(builder, ParticleReboundIngredient::new) ); } // TODO: Move to separate file if desired public record ParticleReboundFuel(String tag) { public static final Codec<ParticleReboundFuel> CODEC = RecordCodecBuilder.create( builder -> builder.group(Codec.STRING.fieldOf("tag").forGetter(f -> f.tag)).apply(builder, ParticleReboundFuel::new) ); public boolean isFuel(ItemStack stack) { // TODO: Check if fuel item matches the tag } } public class Serializer implements RecipeSerializer<ParticleReboundRecipe> { public static final Codec<ParticleReboundRecipe> CODEC = RecordCodecBuilder.create( builder -> builder.group( ParticleReboundIngredient.CODEC.listOf().fieldOf("inputs").forGetter(r -> r.inputs), ParticleReboundFuel.CODEC.fieldOf("fuel").forGetter(r -> r.fuel), ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output) ).apply(builder, ParticleReboundRecipe::new) ); @Override public @NotNull Codec<ParticleReboundRecipe> codec() { return CODEC; } // TODO: The rest ... } }   ?
    • I'm sure load and SaveAdditional are what you are looking for, probably. Mind sharing your BE class code? You also need to override onLoad method if you haven't
  • Topics

×
×
  • Create New...

Important Information

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