plugins replanter les plantations lorsqu'elles sont cassés

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

yanc0

Aventurier
12 Juillet 2024
4
0
1
17
Bonsoir,
je ne sais pas comment faire pour que quand je casse une plantation il y est une graine qui se plante automatiquement.
voici mon code:
Crops crops = (Crops) block.getState().getData();
if (crops.getState() == CropState.RIPE) {
block.setType(Material.SEEDS);
}
 
Dernière édition:
Bonjour,

Tu peux essayer ceci pour faire des champs infinis :
Java:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
    Player p = e.getPlayer();
    Block b = e.getBlock();
    
    if(b.getBlockData() instanceof Ageable data) {
        // Dans tous les cas, on empêche de détruire la pousse
        e.setCancelled(true);
        
        // Si la pousse est mûre, on drop les drops
        if(data.getAge() == data.getMaximumAge()) {
            List<ItemStack> drops = new ArrayList<>(b.getDrops(p.getInventory().getItemInMainHand(), p));
            
            // On permet à d'autres plugins de modifier/empêcher les drops
            BlockDropItemEvent ev = new BlockDropItemEvent(b, b.getState(), p, drops);
            p.getServer().getPluginManager().callEvent(ev);
            if(!ev.isCancelled()) {
                // Drop les drops
                for(ItemStack stack : ev.getItems()) {
                    b.getWorld().dropItemNaturally(b.getLocation(), stack);
                }
                
                // Réinitialise la pousse
                if(data.isSupported(b)) {
                    data.setAge(0);
                    b.setBlockData(data);
                }
            }
        }
    }
}

Cordialement,
ShE3py
 
Bonjour,

Tu peux essayer ceci pour faire des champs infinis :
Java:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
    Player p = e.getPlayer();
    Block b = e.getBlock();
   
    if(b.getBlockData() instanceof Ageable data) {
        // Dans tous les cas, on empêche de détruire la pousse
        e.setCancelled(true);
       
        // Si la pousse est mûre, on drop les drops
        if(data.getAge() == data.getMaximumAge()) {
            List<ItemStack> drops = new ArrayList<>(b.getDrops(p.getInventory().getItemInMainHand(), p));
           
            // On permet à d'autres plugins de modifier/empêcher les drops
            BlockDropItemEvent ev = new BlockDropItemEvent(b, b.getState(), p, drops);
            p.getServer().getPluginManager().callEvent(ev);
            if(!ev.isCancelled()) {
                // Drop les drops
                for(ItemStack stack : ev.getItems()) {
                    b.getWorld().dropItemNaturally(b.getLocation(), stack);
                }
               
                // Réinitialise la pousse
                if(data.isSupported(b)) {
                    data.setAge(0);
                    b.setBlockData(data);
                }
            }
        }
    }
}

Cordialement,
ShE3py
getBlockData(), getMaximumAge(), isSupported, setBlockData() ,BlockDropItemEvent ne fonctionnent pas, et je ne sais pas comment régler ça.
 
Essaye ceci :
Java:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
    Player p = e.getPlayer();
    Block b = e.getBlock();
    BlockState state = b.getState();
    MaterialData data = state.getData();
   
    if(data instanceof Crops) {
        Crops crops = (Crops) data;
       
        // Dans tous les cas, on empêche de détruire la pousse
        e.setCancelled(true);
       
        // Si la pousse est mûre, on drop les drops
        if(crops.getState() == CropState.RIPE) {
            Iterable<ItemStack> drops = b.getDrops(p.getInventory().getItemInMainHand());
            for(ItemStack stack : drops) {
                b.getWorld().dropItemNaturally(b.getLocation(), stack);
            }
           
            // Réinitialise la pousse
            crops.setState(CropState.SEEDED);
            state.setData(crops);
            state.update();
        }
    }
}
 
Essaye ceci :
Java:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
    Player p = e.getPlayer();
    Block b = e.getBlock();
    BlockState state = b.getState();
    MaterialData data = state.getData();
  
    if(data instanceof Crops) {
        Crops crops = (Crops) data;
      
        // Dans tous les cas, on empêche de détruire la pousse
        e.setCancelled(true);
      
        // Si la pousse est mûre, on drop les drops
        if(crops.getState() == CropState.RIPE) {
            Iterable<ItemStack> drops = b.getDrops(p.getInventory().getItemInMainHand());
            for(ItemStack stack : drops) {
                b.getWorld().dropItemNaturally(b.getLocation(), stack);
            }
          
            // Réinitialise la pousse
            crops.setState(CropState.SEEDED);
            state.setData(crops);
            state.update();
        }
    }
}
ça marche à la perfection, merci beaucoup d'avoir pris le temps de m'aider !