Création de Bloc : Direction + RedStonne

  • Auteur de la discussion Auteur de la discussion Mack
  • Date de début Date de début

Mack

Architecte en herbe
3 Juin 2011
123
5
124
Mack a dit:
Bon, j'ai finalement réussis mes problème de la page précédente.
Mais maintenant, j'en ai une autre :
Comment faire pour utiliser une planche de sprite ?
Parce que pour l'instant, j'ai une image par objets ...
J'ai pas beaucoup d'objet, mais bon, j'aimerai bien tout mettre sur une seule image.

De plus, j'ai une seconde question :
Comment faire pour que le bloc s'oriente comme un piston ?
En gros, suivant comment le joueur place le bloc, je voudrais que ce dernier s'oriente de certaine façon. ( En gros, c'est vraiment comme le piston que je voudrais ... )
J'ai beau chercher, je trouve pas ...
Dans le même genre, comment faire pour donner une texture "custom" à un bloc à l'interrieur de celui ci ?
En gros, comment faire pour qu'une seule de ses faces et un côté custom ?
Si on le veux pas custom il suffit de faire un truc comme ça :
Code:
 public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
        if(i == 1)
        {
            return 1;
        }
        else
        {
            return blockIndexInTexture;
        }
    }
Et le bloc du dessus est pas le même, mais il doit resté dans Terrain.png. Comment faire pour prendre l'image à autre part ?
Et comment savoir quelle est la direction du bloc ?

Et autre question :
Comment faire pour activer des trucs seulement si le bloc et parcourut par du courant ?
Enfin, plus exactement, je voudrais faire que si le bloc reçoit du courant redstone, un truc se passe une seule fois. Et dès que le courant passe plus, un au truc se passe ( Une seule fois aussi. )
J'ai bien essayer un truc du genre :
Code:
public void updateTick(World world, int i, int j, int k, Random random)
	{
		super.updateTick(world, i, j, k, random);
		int id_bloc = world.getBlockId(i, j-1, k);
		if (world.isBlockIndirectlyGettingPowered(i, j, k))
		{
			if ( id_bloc == 0 )
			{
				int block = 203;//Block.wood.blockID;
				world.setBlockWithNotify(i,j-1,k,block);
				if ( world.isAirBlock(i,j-2,k) )
				{
					world.setBlockWithNotify(i,j-2,k,block);
					
					if ( world.isAirBlock(i,j-3,k) )
					{
						world.setBlockWithNotify(i,j-3,k,block);
					}
				}
			}
		}
		else
		{
			if ( id_bloc == 203 )
			{
				int block = 0;

				world.setBlockWithNotify(i,j-1,k,block);
				
				id_bloc = world.getBlockId(i, j-2, k);
				if ( id_bloc == 203 )
				{
					world.setBlockWithNotify(i,j-2,k,block);
					
					id_bloc = world.getBlockId(i, j-3, k);
					if ( id_bloc == 203 )
					{
						world.setBlockWithNotify(i,j-3,k,block);
					}
				}
			}
		}
	}
Mais y a rien qui se passe ...

Merci d'avance.
 
Bon, ça avance petit à petit, et j'ai finalement réussis à faire tourner mon bloc comme je le voulais.
Mais maintenant, j'me retrouve avec un problème plutôt important :
Comment faire pour trouver dans quelle direction mon bloc est tourné ?
J'ai bien essayer d'attribuer une variable direction à mon bloc, et de lui donner la direction du bloc, mais voici les problèmes que ça pose :
- La variable est universel : C'est la même pour tout les blocs ...
- Elle n'est pas sauvegarder, du coup, il suffit de quitter le jeu pour que le bloc serve plus à rien ...

Donc voila le code de mon bloc :
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode 

package net.minecraft.src;
import java.util.Random;
import java.util.ArrayList;

// Referenced classes of package net.minecraft.src:
//            Block, Material

public class BlockHerse extends Block
{
    protected BlockHerse(int i, int j)
    {
        super(i, j, Material.ground);
    }
    public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l)
    {
        return super.shouldSideBeRendered(iblockaccess, i, j, k, l);
    }

    public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
    {
        int l = func_31039_c(world, i, j, k, (EntityPlayer)entityliving);
        world.setBlockMetadataWithNotify(i, j, k, l);
    }
private static int func_31039_c(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
        if(MathHelper.abs((float)entityplayer.posX - (float)i) < 2.0F && MathHelper.abs((float)entityplayer.posZ - (float)k) < 2.0F)
        {
            double d = (entityplayer.posY + 1.8200000000000001D) - (double)entityplayer.yOffset;
            if(d - (double)j > 2D)
            {
		direction = 1;
                return 1;
            }
            if((double)j - d > 0.0D)
            {
		    direction = 0;
                return 0;
            }
        }
        int l = MathHelper.floor_double((double)((entityplayer.rotationYaw * 4F) / 360F) + 0.5D) & 3;
        if(l == 0)
        {
	direction = 2;
            return 2;
        }
        if(l == 1)
        {
		direction = 5;
            return 5;
        }
        if(l == 2)
        {
	direction = 3;
            return 3;
        }
	direction =  l != 3 ? 0 : 4;
        return l != 3 ? 0 : 4;
    }


  public static int func_31044_d(int i)
    {
        return i & 7;
    }
    public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k)
    {
        int l = iblockaccess.getBlockMetadata(i, j, k);
	    setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    }
    public void setBlockBoundsForItemRender()
    {
        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    }

    public void getCollidingBoundingBoxes(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, ArrayList arraylist)
    {
        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
        super.getCollidingBoundingBoxes(world, i, j, k, axisalignedbb, arraylist);
    }
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k)
    {
        return super.getCollisionBoundingBoxFromPool(world, i, j, k);
    }

    public boolean isOpaqueCube()
    {
        return false;
    }

    public boolean renderAsNormalBlock()
    {
        return false;
    }

    public int getRenderType()
    {
        return 0;
    }
    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
        int k = func_31044_d(j);
	if (k==i)
	{
	return 5;
	}
        if(k > 5)
        {
            return 0;
        }
	return 1;
    }
    public static int direction;
    public void onBlockAdded(World world, int i, int j, int k)
    {
        super.onBlockAdded(world, i, j, k);
    }
   public void onBlockRemoval(World world, int i, int j, int k)
   {
	if (direction == 0)
	{
		j -= 1;
	}
	if (direction == 1)
	{
		j += 1;
	}
	int id_bloc = world.getBlockId(i, j, k);
	if ( id_bloc == 203 )
	{
		int block = 0;
		world.setBlockWithNotify(i,j,k,block);
		
		id_bloc = world.getBlockId(i, j, k);
		if ( id_bloc == 203 )
		{
			world.setBlockWithNotify(i,j,k,block);
			
			id_bloc = world.getBlockId(i, j, k);
			if ( id_bloc == 203 )
			{
				world.setBlockWithNotify(i,j,k,block);
			}
		}
		
	}
  }	
   public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
  {
  	EntityPlayer entity = entityplayer;
	String s;
	s = "Direction : " + direction;
	entity.addChatMessage(s);
	return true;
  }
  
public void onNeighborBlockChange(World world, int i, int j, int k, int l)
{
	if (direction == 1 )
	{
		int id_bloc = world.getBlockId(i, j+1, k);
	
		if (world.isBlockIndirectlyGettingPowered(i, j, k))
		{
			if ( id_bloc == 0 )
			{
				int block = 203;//Block.wood.blockID;
				world.setBlockWithNotify(i,j+1,k,block);
				if ( world.isAirBlock(i,j+2,k) )
				{
					world.setBlockWithNotify(i,j+2,k,block);
					
					if ( world.isAirBlock(i,j+3,k) )
					{
						world.setBlockWithNotify(i,j+3,k,block);
					}
				}
			}
		}
		else
		{
			if ( id_bloc == 203 )
			{
				int block = 0;

				world.setBlockWithNotify(i,j+1,k,block);
				
				id_bloc = world.getBlockId(i, j+2, k);
				if ( id_bloc == 203 )
				{
					world.setBlockWithNotify(i,j+2,k,block);
					
					id_bloc = world.getBlockId(i, j+3, k);
					if ( id_bloc == 203 )
					{
						world.setBlockWithNotify(i,j+3,k,block);
					}
				}
			}
		}
	}
	else
	{
			int id_bloc = world.getBlockId(i, j-1, k);
	
		if (world.isBlockIndirectlyGettingPowered(i, j, k))
		{
			if ( id_bloc == 0 )
			{
				int block = 203;//Block.wood.blockID;
				world.setBlockWithNotify(i,j-1,k,block);
				if ( world.isAirBlock(i,j-2,k) )
				{
					world.setBlockWithNotify(i,j-2,k,block);
					
					if ( world.isAirBlock(i,j-3,k) )
					{
						world.setBlockWithNotify(i,j-3,k,block);
					}
				}
			}
		}
		else
		{
			if ( id_bloc == 203 )
			{
				int block = 0;

				world.setBlockWithNotify(i,j-1,k,block);
				
				id_bloc = world.getBlockId(i, j-2, k);
				if ( id_bloc == 203 )
				{
					world.setBlockWithNotify(i,j-2,k,block);
					
					id_bloc = world.getBlockId(i, j-3, k);
					if ( id_bloc == 203 )
					{
						world.setBlockWithNotify(i,j-3,k,block);
					}
				}
			}
		}
	}
}
}
 
Pour stocker des infos particulières comme la direction, chaque bloc possède 4 bits que tu peux assigner pour ce que tu veux à l'aide d'une méthode du genre setEntityMetadata() (le nom est sûrement pas bon), à chercher ^^
 
Effectivement, c'était :
Code:
world.getBlockMetadata( i, j, k);
Pour recuperer, et :
Code:
world.setBlockMetadataWithNotify(i, j, k, l);
Pour stocker.



Par contre, y a un truc que j'avais pas prévu :
Ce bloc créer d'autre bloc ( Incassable, Render
6 ). Mais lorsque le bloc qui va créer les autres n'est pas dans l'axe Y, les blocs créer eux restent tourné dans l'axe Y ...
J'ai bien réussi à donner aux blocs créer une variable direction (
Code:
world.setBlockAndMetadataWithNotify(i-1,j,k,block,direction);
A la création du bloc. Après, j'ai essayer de voir si les directions étaient bonne grâce au tchat et c'est bon. ).
J'me suis donc dit que j'allais faire comme pour l'autre bloc sauf que voila :
L'autre c'est un bloc standard, tandis que celui là utilise un Render ...
Du coup, impossible de lui attribuer des côtés pour données l'illusion d'une rotation ...
J'suppose qu'il suffit de faire un nouveau render avec les 3 rotations, mais je sais pas comment m'y prendre ...


Et autre problème plus petit :
Dans mon Inventaire, mon Bloc qui créer les autres la face différenyes ds autres et en dessous. Du coup on le voit pas. Y a un moyen de faire que la face différente soit au dessus ? ( Seulement dans l'inventaire. )

Merci =P.
 
Ouais effectivement il faut faire soi-même son render il me semble. Tu peux essayer de regarder comment c'est fait dans les blocs de Minecraft qui font la même chose.

Pour ta deuxième question je suppose qu'il y a une méthode spécifique un peu comme pour le render que tu peux overrider, mais je me souviens pas avoir vu exactement comment ça marche. De même, je te suggère de regarder comment c'est fait, en allant voir le code des barrières par exemple.