Frage von ACCNummer1, 22

Minecraft [1.7.10] Forge Programming - Vanilla Texture überschreiben?

Ich habe seit längerem vor, einen Glassblock zu erstellen, wie der beispielsweise von der Mod "Ztones" existiert. Dabei hatte ich ein Problem dass in meiner anderen Frage bereits erklärt wurde. https://www.gutefrage.net/frage/minecraft-forge-modding-1710---transparenter-blo... Jetzt habe ich das Problem gelöst, in dem ich einfach von der Klasse BlockGlass geerbt habe. Problem an der Sache ist nun wieder, dass ich, wenn ich das Spiel starte, die Glass-Textur habe, jedoch aber nicht mehr die von meinem Block. Meine Frage damit wäre, wie kann ich die Textur ändern?

Code meiner Glass-Klasse (der obere Teil ist der Test vom letzten Mal (letzte Frage), erst nach dem //=========== geht es mit dem bisherigen Code los)

package ultimatevidium;

import java.util.Random;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBreakable;
import net.minecraft.block.BlockGlass;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;

/*public class Blockooglass extends Block{
    protected Blockooglass(Material material) {
        //super(material);
        super(material);
        
        setCreativeTab(CreativeTabs.tabAllSearch);
        setStepSound(Block.soundTypeGlass);
        setBlockTextureName("ultimatevidium:ooglass");
        setBlockName("Blockooglass");
        setLightOpacity(0);
        canRenderInPass(0);
        
    }
    */
    /*
    
    public boolean isOpaqueCube()
    {
        return false;
    }

    public int getRenderBlockPass()
    {
        return 0;
    }
    public boolean renderAsNormalBlock()
    {
        return false;
    }
    */
    
    //+#+#+#+#+#+#+#+#+
    
    /*public boolean renderAsNormalBlock()
    {
        return false;
    }
    */
    /*
    public boolean canRenderInPass()
    {
        return true;
    }*/
    /*
    public int getRenderBlockPass()
    {
        return 1;
    }
    
    public boolean isOpaqueCube()
    {
        return false;
    }*/
    /*
    public boolean shouldSideBeRendered()
    {
        return false;
    }*/
    
    
    
    
    
    /*public boolean shouldSideBeRendered()
    {
        return false;
    }*/
    
    

//===========================================================================================



public class Blockooglass extends BlockGlass {
    public Blockooglass(int par1, Material ooglass, boolean par3)
    {
        super(par2Material, false);
        this.setCreativeTab(CreativeTabs.tabBlock);
       
        setBlockTextureName("ultimatevidium:ooglass");
        setBlockName("Blockooglass");
    }


   // @SideOnly(Side.CLIENT)

    public int getRenderBlockPass()
    {
        return 0;
    }

    public boolean isOpaqueCube()
    {
        return false;
    }

    public boolean renderAsNormalBlock()
    {
        return false;
    }

    protected boolean canSilkHarvest()
    {
        return true;
    }
}
Antwort
von regex9, 10

Versuche mal in Erfahrung zu bringen, wie der Inhalt von BlockGlass aussieht. Dann kannst du nachschauen, wo die Textur gesetzt wird bzw. wie du sie setzen kannst.

Falls notwendig musst du die betreffende Render-Methode von BlockGlass überschreiben (mit vorherigem Aufruf der Render-Methode von BlockGlass selbst) oder du kopierst sie dir in deine Klasse hinein und nimmst Änderungen vor. In letzterem Fall musst du evt. nicht einmal mehr von BlockGlass erben.

Kommentar von ACCNummer1 ,

Danke schonmal für die Antwort.

BlockGlass bringt das mit sich:

public class BlockGlass extends BlockBreakable

{
private static final String __OBFID = "CL_00000249";

public BlockGlass(Material p_i45408_1_, boolean p_i45408_2_)
{
super("glass", p_i45408_1_, p_i45408_2_);
this.setCreativeTab(CreativeTabs.tabBlock);
}

/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random p_149745_1_)
{
return 0;
}

/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
@SideOnly(Side.CLIENT)
public int getRenderBlockPass()
{
return 0;
}

/**
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}

/**
* Return true if a player with Silk Touch can harvest this block directly, and not its normal drops.
*/
protected boolean canSilkHarvest()
{
return true;
}
}

wobei diese Klasse wiederrum von BlockBreakable erbt die wiederum von Blocks erbt, und darin ist die Textur von dem BlockGlass gesetzt wurden.

BlockBreakable:

public class BlockBreakable extends Block

{
private boolean field_149996_a;
private String field_149995_b;
private static final String __OBFID = "CL_00000254";

protected BlockBreakable(String p_i45411_1_, Material p_i45411_2_, boolean p_i45411_3_)
{
super(p_i45411_2_);
this.field_149996_a = p_i45411_3_;
this.field_149995_b = p_i45411_1_;
}

/**
* Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube()
{
return false;
}

/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_)
{
Block block = p_149646_1_.getBlock(p_149646_2_, p_149646_3_, p_149646_4_);

if (this == Blocks.glass || this == Blocks.stained_glass)
{
if (p_149646_1_.getBlockMetadata(p_149646_2_, p_149646_3_, p_149646_4_) != p_149646_1_.getBlockMetadata(p_149646_2_ - Facing.offsetsXForSide[p_149646_5_], p_149646_3_ - Facing.offsetsYForSide[p_149646_5_], p_149646_4_ - Facing.offsetsZForSide[p_149646_5_]))
{
return true;
}

if (block == this)
{
return false;
}
}

return !this.field_149996_a && block == this ? false : super.shouldSideBeRendered(p_149646_1_, p_149646_2_, p_149646_3_, p_149646_4_, p_149646_5_);
}

@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister p_149651_1_)
{
this.blockIcon = p_149651_1_.registerIcon(this.field_149995_b);
}
}

Block:

blockRegistry.addObject(20, "glass", (new BlockGlass(Material.glass, false)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("glass").setBlockTextureName("glass"));

Wieso kann man eigtl nicht sagen das man einfach die Textur überschrieben haben möchte?

Wenn du evtl eine Lösung in form eines kurzen Codestückes hättest, wäre es sehr nett, falls nicht wäre eine etwas ausführlichere Anweisung sehr freundlich :) (Ich bin gerade dabei Java zu lernen (learning by doing).)

Danke schonmal im vorraus :)

Kommentar von regex9 ,

Der Codeschnipsel aus der Blocks-Klasse muss (abgeändert auf deine Textur) in deine Klasse mit hinein. In welchem Kontext steht der Codeschnipsel?

a) Im Konstruktor: Dann sollte er bei dir auch im Konstruktor aufgerufen werden

b) In einer Methode: Wenn diese nicht private ist, kannst du sie überschreiben.

Kommentar von ACCNummer1 ,

Der Code in dem bereich ist verkürzt wie folgt:

 public static void registerBlocks()

{
blockRegistry.addObject(0, "air", (new BlockAir()).setBlockName("air"));
blockRegistry.addObject(1, "stone", (new BlockStone()).setHardness(1.5F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stone").setBlockTextureName("stone"));
  blockRegistry.addObject(20, "glass", (new BlockGlass(Material.glass, false)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("glass").setBlockTextureName("glass"));
}

Ich schätze mal es wäre damit eine Methode (Korrigiere mich bitte wenn ich falsch liege :D) Stellt sich nur die Frage wie ich das ganze jetzt überschrieben kann.

Kommentar von regex9 ,

Ähm- warte mal. Du weißt nicht, was eine Methode ist? Bevor du nun weiter werkelst, solltest du schleunigst die Grundlagen von Java lernen.

Diese Methode kannst du nicht überschreiben, sie ist statisch. Finde erst einmal heraus, wo sie aufgerufen wird. Praktisch musst du ihre Änderung, die sie ausführt, überschreiben. Dies muss aber zeitlich nach ihrer Ausführung geschehen. Entferne dann einfach das Objekt (glass) von blockRegistry, und füge es neu hinzu. Sollte blockRegistry allerdings eine lokale Variable sein oder gekapselt, musst du andere Umwege suchen.

Oder du schaust einmal in die Dokumentation der API, wie du in deiner Klasse Texturen setzen kannst.

Antwort
von Star4Fun, 13

Ich glaube das war so:
@Override
public void registerBlockIcons(IIconRegister par1IconRegister){}

Kommentar von ACCNummer1 ,

Ui danke. habe jetzt aaber die texture nur löschen können. meine eigene Textur kam dabei aber nicht. (Textur im Spiel fehlt entsprechend)

Hier mal mein Code:

@Override

public void registerBlockIcons(IIconRegister par1IconRegister){setBlockTextureName("ultimatevidium:ooglass");}

Muss ich die textur anders einsetzen?

Kommentar von Star4Fun ,

Hast du es inzwischen gelöst sonst antworte ich dir nachher am PC

Keine passende Antwort gefunden?

Fragen Sie die Community