AutoSmelt



  • Salut,  J'aimerais faire un "addon" a une pioche afin de cuire directement n'importe quel minerais modée ou non Le problème c'est que je ne vois pas comment faire
    J'ai vite fais regarder le code de TConstruct mais bon je me perd un peu
    Si quelqu'un a une idée 😃


  • Administrateurs

    Salut,
    Le sujet a déjà été traité sur le forum mais la personne a surement mit un titre à la con car je ne retrouve pas le sujet –'

    En gros avec la fonction :
    ItemStack result = FurnaceRecipes.instance().getSmeltingResult(new ItemStack(minerai));
    Tu peux get le résultat de la cuisson.
    Si le résultat n'est pas nul c'est que le bloc peut être cuit.

    La modification du drop peut être faite via BlockEvent.HarvestDropsEvent ou directement dans ta pioche dans la fonction onBlockDestroyed.



  • Il faut que tu obtiennes le résultat de la cuison via les recipes (vanilla si peut être cuit avec four normal, et sinon avec la classe de récipes custom du mod), ou plus simplement…....................
    ...........SilkTuch.

    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk



  • Tu souhaites uniquement que des minérais MODDÉS soient cuits directement. Qu'aucun minérai vanilla (stone aussi ?) ne soient cuits ? Si il s'agit uniquement de minérais moddés, je suis en train de faire des tests, on verra bien si je trouve quelque chose pour te mettre sur la piste 😃



  • Non plaigon 😃 Tout les minerais y compris les modée



  • Bon je t'ai déjà rapidement fait ceci pour les minérais vanilla UNIQUEMENT :

    public class ItemTestPickaxe extends ItemPickaxe
    {
    public ItemTestPickaxe()
    {
    super(ToolMaterial.EMERALD);
    MinecraftForge.EVENT_BUS.register(this);
    }
    
    @Override
    public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase entity)
    {
    if((double)block.getBlockHardness(world, x, y, z) != 0.0D)
    {
    stack.damageItem(1, entity);
    }
    this.dropSmeltOre(block, x, y, z, (EntityPlayer)entity);
    return true;
    }
    
    private void dropSmeltOre(Block block, int x, int y, int z, EntityPlayer player)
    {
    if(block instanceof BlockOre)
    {
    System.out.println(block.getUnlocalizedName());
    ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(new ItemStack(block));
    System.out.println(result.getDisplayName());
    if(!player.worldObj.isRemote && result != null)
    player.worldObj.spawnEntityInWorld(new EntityItem(player.worldObj, x, y, z, result));
    }
    }
    
    @SubscribeEvent
    public void onOreDestroyed(BlockEvent.HarvestDropsEvent event)
    {
    if(event.block instanceof BlockOre)
    event.drops.clear();
    }
    }
    

    Maintenant je regarde pour les mods ajoutant de nouveaux minérais …

    ATTENTION :
    Après m'en être rendu compte, je viens de me rendre compte que j'ai fait une petite bêtise dans mon code, que tu pourras régler (pas compliqué ...). Si tu mines des BlockOre, tels que les minérais de redstone ou encore de lapis, mon code adapté pour d'autres minérais ayant besoin d'être cuits, feront spawn qu'une seule redstone ou qu'un seul lapis. Donc en fait il faudrait que tu retravailles avec des conditions l'event pour modifier la quantité du drop, ou tout simplement l'arraylist drops, je pense que c'est faisable en rajoutant ton itemstack avec une quantité (un des integer en paramètre du constructeur ItemStack) random comme le fait MC. Si tu n'y arrives pas, je t'aiderai (comme d'hab j'ai envie de dire) 😛



  • La solution de robin ne convient pas ?



  • Si si elle convient, mais maintenant il faut trouver un moyen de get les ores rajoutés par des mods. Si il s'agit de simples block extends BlockOre alors ma solution est déjà adaptée, du moins j'espère que les nouvelles recettes de cuisson marcheront aussi….Je sais pas faut que je vois. Si en revanche, les moddeurs de mod,s rajoutant de nouveaux minérais, les ont simplement extends Block, alors là ça pose un peu + problème. Il faut soit voir si ils contiennent un ore dans leur unlocalizedName(), soit encore une fois se servir des recettes de cuisson avec la classe FurnaceRecipes.



  • Et genre ça ? :

    
    package fr.Mosca421.Arthania;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import java.util.ArrayList;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.enchantment.EnchantmentHelper;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.FurnaceRecipes;
    import net.minecraft.world.World;
    import net.minecraftforge.event.world.BlockEvent;
    import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;
    
    public class BlockEventManager
    {
      boolean hasSilkTouch;
    
      @SubscribeEvent
      public void onEvent(BlockEvent.HarvestDropsEvent event)
      {
        Item breaker = null;
        if ((event.harvester != null) && (event.harvester.getCurrentEquippedItem() != null) && (event.harvester.getCurrentEquippedItem().getItem() != null))
        {
          breaker = event.harvester.getCurrentEquippedItem().getItem();
          this.hasSilkTouch = EnchantmentHelper.getSilkTouchModifier(event.harvester);
        }
        ItemStack a = new ItemStack(breaker);
        if ((event.drops != null) && (event.drops.size() != 0))
        {
          String check = ((ItemStack)event.drops.get(0)).toString();
          if ((!check.contains("sand")) && (!check.contains("stonebrick")) && (!check.contains("hellrock")) && (!check.contains("clay")) && (!check.contains("stonebricksmooth")) && (!check.contains("cactus")) && (!check.contains("stonebrick"))) {
            for (int x = event.drops.size() - 1; x >= 0; x–) {
              if (FurnaceRecipes.smelting().getSmeltingResult((ItemStack)event.drops.get(x)) != null)
              {
                ItemStack thisItem = FurnaceRecipes.smelting().getSmeltingResult((ItemStack)event.drops.get(x));
                if ((breaker == Arthania.CobaltPickaxe) && (breaker != null) && (this.hasSilkTouch != true))          {
                  event.drops.remove(x);
                  event.drops.add(thisItem.copy());
                }
              }
            }
          }
        }
      }
    }
    
    

    Et je voudrais savoir, comment faire pour casser sur du 3x3 avec se qu'il y a au dessus qui est pris en compte ?



  • @'Plaigon':

    Si si elle convient, mais maintenant il faut trouver un moyen de get les ores rajoutés par des mods. Si il s'agit de simples block extends BlockOre alors ma solution est déjà adaptée, du moins j'espère que les nouvelles recettes de cuisson marcheront aussi….Je sais pas faut que je vois. Si en revanche, les moddeurs de mod,s rajoutant de nouveaux minérais, les ont simplement extends Block, alors là ça pose un peu + problème. Il faut soit voir si ils contiennent un ore dans leur unlocalizedName(), soit encore une fois se servir des recettes de cuisson avec la classe  FurnaceRecipes.

    Pour le lapis/redstone, fait le drop normalement si le result est null. (Return false)



  • Pas de soucis pour la redstone, elle n'extends pas BlockOre, mais a sa classe à part. Du coup ça ne rentrera même pas dans la condition



  • Il n'y a pas de différence sans modifier le lapis drop normalement
    Edit : Le message ne sert a rien enfaite xD
    Je remarque se que j'ai mis juste au dessus je sais pa ssi c'est passer inaperçu :
    Comment casser du 3x3 avec le code que j'ai mis pris en compte ?



  • Tu feras attention dans ton code, plusieurs choses sont un peu inutiles, notamment des null check : le .getItem() != null au début, le event.drops.size != o (inutile car avant tu check si la liste des drops n'est pas null ,soit l'un soit l'autre) et puis ta boucle à la fin, pourquoi initialises-tu ton index x à event.drops.size - 1 ? J'ai pas compris 😕
    Sinon pour le reste, j'ai un peu survolé, mais ça m'a l'air bon 😃

    Pour ton problème de casser des blocks sur une zone 3x3, tu ne souhaites donc pas casser sur l'axe des z, en profondeur ? Il te suffit juste de jouer avec les coordonnées du block, x…Cherche et teste un peu, on peut pas t'aider sur ça, de simples additions et soustractions, là ^^'



  • Je gere les addition enfin je crois (4+5 = 10 ?) Mais c'est surtout quesque j'utilise pour casser les blocs (les 9 en 3x3)



  • La solution de robin permet de faire cuire tous les blocks possibles, je vois pas où est le problème.



  • Ah oui ok bon bah sa devrait marcher alors.


  • Administrateurs

    Comme ceci :

        @SubscribeEvent
        public void onOreDestroyed(BlockEvent.HarvestDropsEvent event)
        {
            if(event.harvester != null && event.harvester.getCurrentEquippedItem() != null && event.harvester.getCurrentEquippedItem().getItem() == ClassPrincipale.pickaxe)
            {
                for(ItemStack drop : event.drops)
                {
                    ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(drop);
                    if(result != null)
                    {
                        event.drops.remove(drop);
                        event.drops.add(result);
                    }
                }
            }
        }
    

    Tu prends en compte tout les cas possible. Y comprit les buches qui se transformerons en charbon de bois, le stone en stone au lieu de la cobble, etc …

    La coloration de la balise java a prit des vacances ? Problème réglé, visiblement https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js renvoie un 404, le nouveau est ici : https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js
    J'ai changé le code du thème, normalement ça fonctionne à nouveau comme il faut. (ctrl + F5 si ce n'est pas le cas).



  • Robin Ton code a un problème: Le jeux crash Exception ticking world
    Sur cette ligne :
    if(event.harvester.getCurrentEquippedItem() != null && event.harvester.getCurrentEquippedItem().getItem() == Arthania.CobaltPickaxe)
    il drop plus et crash



  • Envoi le rapport de crash complet


  • Administrateurs

    NPE ? Si oui, c'est harvester qui est null. J'ai modifié le code.