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

...komplette Frage anzeigen

2 Antworten

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.

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

0
@ACCNummer1

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.

1
@regex9

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.

0
@ACCNummer1

Ä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.

0

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

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?

0

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

0

Was möchtest Du wissen?