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

    • Add crash-reports with sites like https://paste.ee/ Maybe an issue with blur, essentials or cumulus_menus
    • Add the crash-report or latest.log (logs-folder) with sites like https://paste.ee/ and paste the link to it here  
    • I have a problem, I am trying to put two different effects to two different armors but when I run it only the emerald armor effect works. This is the code public class ModArmorItem extends ArmorItem{ private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP = (new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>()) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true)) .put(ModArmorMaterials.OBSIDIAN, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build(); public ModArmorItem(ArmorMaterial pMaterial, Type pType, Properties pProperties) { super(pMaterial, pType, pProperties); } @Override public void onArmorTick(ItemStack stack, Level world, Player player){ if (!world.isClientSide()) { if (hasFullSuitOfArmorOn(player)) { evaluateArmorEffects(player); } } } private void evaluateArmorEffects(Player player) { for (Map.Entry<ArmorMaterial,MobEffectInstance> entry : MATERIAL_TO_EFFECT_MAP.entrySet()){ ArmorMaterial mapArmorMaterial = entry.getKey(); MobEffectInstance mapStatusEffect = entry.getValue(); if (hasCorrectArmorOn(mapArmorMaterial, player)) { addStatusEffectForMaterial(player, mapArmorMaterial, mapStatusEffect); } } } private void addStatusEffectForMaterial(Player player, ArmorMaterial mapArmorMaterial, MobEffectInstance mapStatusEffect) { boolean hasPlayerEffect = player.hasEffect(mapStatusEffect.getEffect()); if (hasCorrectArmorOn(mapArmorMaterial, player) && !hasPlayerEffect) { player.addEffect(new MobEffectInstance(mapStatusEffect)); } } private boolean hasCorrectArmorOn(ArmorMaterial material, Player player) { for (ItemStack armorStack : player.getInventory().armor){ if (!(armorStack.getItem() instanceof ArmorItem)) { return false; } } ArmorItem helmet = ((ArmorItem)player.getInventory().getArmor(3).getItem()); ArmorItem breastplace = ((ArmorItem)player.getInventory().getArmor(2).getItem()); ArmorItem leggins = ((ArmorItem)player.getInventory().getArmor(1).getItem()); ArmorItem boots = ((ArmorItem)player.getInventory().getArmor(0).getItem()); return helmet.getMaterial() == material && breastplace.getMaterial() == material && leggins.getMaterial() == material && boots.getMaterial() == material; } private boolean hasFullSuitOfArmorOn(Player player){ ItemStack helmet = player.getInventory().getArmor(3); ItemStack breastplace = player.getInventory().getArmor(2); ItemStack leggins = player.getInventory().getArmor(1); ItemStack boots = player.getInventory().getArmor(0); return !helmet.isEmpty() && !breastplace.isEmpty() && !leggins.isEmpty() && !boots.isEmpty(); } } Also when I place two effects on the same armor, the game crashes. Here is the crash file. The code is the same, only this part is different   private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP = (new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>()) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true)) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build(); I hope you guys can help me. Thanks.
  • Topics

×
×
  • Create New...

Important Information

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