Вопрос Ошибка со сбором дропов

Версия Minecraft
1.16.X

Artur001

Пользователь
Сообщения
17
Дарова кенты
Пишу плагин на кастомные чары, и на моменте написания магнетизма столкнулся с такой проблемой:
когда я ломаю блок, на который прикреплён редстоуновый факел (ну или любой другой предмет по типу повторителей, табличек, кнопок и т.д), то в дропы попадает только вскопанный блок (ну и следовательно добавляется ко мне в инвентарь), а факел просто пропадает.
При этом, если на инструменте нет магнетизма и факел и сам блок выпадают (тоесть факел не испаряется).
 
Дарова кенты
Пишу плагин на кастомные чары, и на моменте написания магнетизма столкнулся с такой проблемой:
когда я ломаю блок, на который прикреплён редстоуновый факел (ну или любой другой предмет по типу повторителей, табличек, кнопок и т.д), то в дропы попадает только вскопанный блок (ну и следовательно добавляется ко мне в инвентарь), а факел просто пропадает.
При этом, если на инструменте нет магнетизма и факел и сам блок выпадают (тоесть факел не испаряется).
Прежде чем просить о помощи с кодом, опубликуй его хотя-бы ради приличия, желательно на github
 
Java:
package me.artix001.miceenchantments.enchantments.magnetism;

import me.artix001.miceenchantments.manager.NBTManager;
import me.artix001.miceenchantments.utils.DropUtil;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;

import java.util.List;

public class MagnetismListener implements Listener {
private final MagnetismEnchantment magnetismEnchantment;
private final NBTManager nbtManager;

public MagnetismListener(MagnetismEnchantment magnetismEnchantment, NBTManager nbtManager) {
this.magnetismEnchantment = magnetismEnchantment;
this.nbtManager = nbtManager;
    }

@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
        Player player = event.getPlayer();
        ItemStack tool = player.getInventory().getItemInMainHand();

int magnetismLevel = nbtManager.getEnchantmentLevel(tool, magnetismEnchantment);
if (magnetismLevel <= 0) return;

        Block block = event.getBlock();
event.setDropItems(false);
List<ItemStack> drops = DropUtil.collectBlockDrops(block, tool, player, magnetismEnchantment, nbtManager);

 for (ItemStack drop : drops) {
if (player.getInventory().firstEmpty() != -1) {
                player.getInventory().addItem(drop);
} else {
                player.getWorld().dropItemNaturally(player.getLocation(), drop);
            }
        }
    }
}

package me.artix001.miceenchantments.utils;

import me.artix001.miceenchantments.enchantments.magnetism.MagnetismEnchantment;
import me.artix001.miceenchantments.manager.NBTManager;
import org.bukkit.block.Block;
import org.bukkit.block.Container;
import org.bukkit.block.DoubleChest;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player;
import org.bukkit.inventory.DoubleChestInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

import java.util.ArrayList;
import java.util.List;

public class DropUtil {

public static List<ItemStack> getContainerDrops(Block block) {
List<ItemStack> drops = new ArrayList<>();
if (!(block.getState() instanceof Container container)) {
 return drops;
        }

if (container instanceof ShulkerBox) {
 return drops;
        }

        Inventory inventory = container.getInventory();
if (inventory instanceof DoubleChestInventory doubleChestInv) {
            DoubleChest doubleChest = doubleChestInv.getHolder();
if (doubleChest != null) {
                Container left = (Container) doubleChest.getLeftSide();
 boolean isLeftSide = block.equals(left.getBlock());
int startSlot = isLeftSide ? 0 : inventory.getSize() / 2;
int endSlot = startSlot + inventory.getSize() / 2;

for (int i = startSlot; i < endSlot; i++) {
                    ItemStack item = inventory.getItem(i);
if (item != null) {
                        drops.add(item.clone());
inventory.setItem(i, null);
                    }
                }
            }
} else {
 for (ItemStack item : inventory.getContents()) {
if (item != null) {
                    drops.add(item.clone());
                }
            }
            inventory.clear();
        }
 return drops;
    }

public static List<ItemStack> collectBlockDrops(Block block, ItemStack tool, Player player, MagnetismEnchantment magnetismEnchantment, NBTManager nbtManager) {
List<ItemStack> drops = new ArrayList<>();

if (block.getState() instanceof ShulkerBox) {
            drops.addAll(block.getDrops(tool));
} else {
drops.addAll(getContainerDrops(block));
            drops.addAll(block.getDrops(tool));
        }

 int magnetismLevel = nbtManager.getEnchantmentLevel(tool, magnetismEnchantment);
if (magnetismLevel > 0) {
 for (ItemStack drop : drops) {
if (player.getInventory().firstEmpty() != -1) {
                    player.getInventory().addItem(drop);
} else {
                    player.getWorld().dropItemNaturally(player.getLocation(), drop);
                }
            }
 return new ArrayList<>();
        }

 return drops;
    }
}
Объединено

Прежде чем просить о помощи с кодом, опубликуй его хотя-бы ради приличия, желательно на github
мне лень на гитхаб
 
Последнее редактирование:
Назад
Сверху Снизу