Signal redstone


  • Moddeurs confirmés Modérateurs

    Salut les amis j'ai une question:

    voila je suis en train de créer un petit mod pour mon serveur mais j'ai un problème: quand on est dans le bloc (le bloc a la propriété traversable tu bloc de portail) j'aimerai que le bloc envoi un signal de redstone dans le bloc en dessous de lui (comme les plaques de pression).



  • 
    public void onEntityCollidedWithBlock(World par1World, int par2, int par3,
    int par4, Entity par5Entity) {
    //ton action
    }
    
    

    Dans le code du block en question


  • Moddeurs confirmés Modérateurs

    ok merci 🙂

    edit: mais genre pour faire en sorte que ça émette un signal de redstone dans le block en dessous comment faire?



  • Uniquement le block du dessous ?

    Et pour émettre un signal de redstone, regarde le block de redstone, ou la torche, qui n'émet pas en dessous ( Tu inverse la fonction )


  • Moddeurs confirmés Modérateurs

    je ne trouve pas dans le code de la torche de redstone.


  • Moddeurs confirmés Modérateurs

    je me permet de up le message


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    Regarde le code de la plaque de pression, c'est BlockBasePressurePlate.java


  • Moddeurs confirmés Modérateurs

    je n'arrive pas a trouver …



  • en effet, y a la fonction qui indique aux blocs alentours le changement de bloc mais je vois rien non plus qui gère la partie redstone, ou bien j'ai pas comrpis le fonctionnement.


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    A moins que je me trompe, c'est ces deux méthodes pour le courant de redstone:

    
    /**
    * Returns true if the block is emitting indirect/weak redstone power on the specified side. If isBlockNormalCube
    * returns true, standard redstone propagation rules will apply instead and this will not be called. Args: World, X,
    * Y, Z, side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block.
    */
    public int isProvidingWeakPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    {
    return this.getPowerSupply(par1IBlockAccess.getBlockMetadata(par2, par3, par4));
    }
    
    /**
    * Returns true if the block is emitting direct/strong redstone power on the specified side. Args: World, X, Y, Z,
    * side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block.
    */
    public int isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    {
    return par5 == 1 ? this.getPowerSupply(par1IBlockAccess.getBlockMetadata(par2, par3, par4)) : 0;
    }
    

  • Moddeurs confirmés Modérateurs

    cela ne marche pas…



  • Au vu des commentaires qui y sont liés, je pense que cela en fait partie, mais qu'il en manque un bout, peut être le bout dont je parlais plus tôt?


  • Moddeurs confirmés Rédacteurs Administrateurs

    BlockPresurePlate.java, il y a tout ce que tu as besoin.


  • Moddeurs confirmés Modérateurs

    public void onEntityCollidedWithBlock(World par1World, int par2, int par3,
    int par4, Entity par5Entity) {
    //ton action
    public int isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    {
    return par5 == 1 ? this.getPowerSupply(par1IBlockAccess.getBlockMetadata(par2, par3, par4)) : 0;
    }
    }
    

    ce serai sa?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Et les autres fonctions qui vont avec.
    En fait la plaque de pression a deux metadata, un lorsqu'elle est activé, et un lorsqu'elle est désactivé. Si son metadata est 2, elle envoie un signale de redstone.


  • Moddeurs confirmés Modérateurs

    J'intègre les metadata au onEntityCollidedWithBlock?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Dans la classe de ton bloc, ajoute tout ça :

    public int isProvidingWeakPower(IBlockAccess par1IBlockAccess, int x, int y, int z, int par5)
    {
    return this.getPowerSupply(par1IBlockAccess.getBlockMetadata(x, y, z));
    }
    
    public void breakBlock(World world, int x, int y, int z, int par5, int par6)
    {
    if(this.getPowerSupply(par6) > 0)
    {
    this.notifyChange(world, x, y, z);
    }
    
    super.breakBlock(world, x, y, z, par5, par6);
    }
    
    protected void notifyChange(World world, int x, int y, int z)
    {
    world.notifyBlocksOfNeighborChange(x, y, z, this.blockID);
    world.notifyBlocksOfNeighborChange(x, y - 1, z, this.blockID);
    }
    
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
    {
    if(!world.isRemote)
    {
    int l = this.getPowerSupply(world.getBlockMetadata(x, y, z));
    
    if(l == 0)
    {
    this.setStateIfMobInteractsWithPlate(world, x, y, z, l);
    }
    }
    }
    
    protected void setStateIfMobInteractsWithPlate(World world, int x, int y, int z, int par5)
    {
    int i1 = this.getPlateState(world, x, y, z);
    boolean flag = par5 > 0;
    boolean flag1 = i1 > 0;
    
    if(par5 != i1)
    {
    world.setBlockMetadataWithNotify(x, y, z, this.getMetaFromWeight(i1), 2);
    this.notifyChange(world, x, y, z);
    world.markBlockRangeForRenderUpdate(x, y, z, x, y, z);
    }
    
    if(!flag1 && flag)
    {
    world.playSoundEffect((double)x + 0.5D, (double)y + 0.1D, (double)z + 0.5D, "random.click", 0.3F, 0.5F);
    }
    else if(flag1 && !flag)
    {
    world.playSoundEffect((double)x + 0.5D, (double)y + 0.1D, (double)z + 0.5D, "random.click", 0.3F, 0.6F);
    }
    
    if(flag1)
    {
    world.scheduleBlockUpdate(x, y, z, this.blockID, this.tickRate(world));
    }
    }
    
    public void updateTick(World world, int x, int y, int z, Random rand)
    {
    if(!world.isRemote)
    {
    int l = this.getPowerSupply(world.getBlockMetadata(x, y, z));
    
    if(l > 0)
    {
    this.setStateIfMobInteractsWithPlate(world, x, y, z, l);
    }
    }
    }
    
    public int tickRate(World world)
    {
    return 20;
    }
    
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
    {
    return null;
    }
    
    protected int getPowerSupply(int metadata)
    {
    return metadata == 1 ? 15 : 0;
    }
    
    protected int getMetaFromWeight(int metadata)
    {
    return metadata > 0 ? 1 : 0;
    }
    
    protected int getPlateState(World world, int x, int y, int z)
    {
    List list = world.getEntitiesWithinAABBExcludingEntity((Entity)null, this.getSensitiveAABB(x, y, z));
    
    //List list = world.getEntitiesWithinAABB(EntityLivingBase.class, this.getSensitiveAABB(x, y, z));
    
    //List list = world.getEntitiesWithinAABB(EntityPlayer.class, this.getSensitiveAABB(x, y, z));
    
    if(list != null && !list.isEmpty())
    {
    Iterator iterator = list.iterator();
    
    while(iterator.hasNext())
    {
    Entity entity = (Entity)iterator.next();
    
    if(!entity.doesEntityNotTriggerPressurePlate())
    {
    return 15;
    }
    }
    }
    
    return 0;
    }
    
    protected AxisAlignedBB getSensitiveAABB(int x, int y, int z)
    {
    float f = 0.125F;
    return AxisAlignedBB.getAABBPool().getAABB((double)((float)x + f), (double)y, (double)((float)z + f), (double)((float)(x + 1) - f), (double)y + 0.25D, (double)((float)(z + 1) - f));
    }
    
    public int isProvidingStrongPower(IBlockAccess blockAccess, int x, int y, int z, int side)
    {
    return side == 1 ? this.getPowerSupply(blockAccess.getBlockMetadata(x, y, z)) : 0;
    }
    

    Je viens de tester, ça fonctionne exactement comme la plaque de pression.


  • Moddeurs confirmés Modérateurs

    Merci je testerai ça demain

    EDIT: Çà marche merci ❤


  • Moddeurs confirmés Modérateurs

    Par contre pour mon autre post sur le rendu du portail (http://www.minecraftforgefrance.fr/showthread.php?tid=444&pid=4750#pid4750) on ma parlez d'un rendu TESR mais je n'ai aucune idée comment le réaliser (il peut ajuster la "taille" de la texture?)


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il y a un tutoriel sur le site pour les rendus TESR. Dans la fonction qui rend le bloc, il suffirait de mettre un GL11.glScale(x, y, z) pour agrandir.


Log in to reply