Ошибка "вызвано: java.lang.StackOverflowError" приводит к ошибке моего плагина Minecraft Java - PullRequest
0 голосов
/ 04 июля 2019

Ну, я пытаюсь сделать из этого плохого мальчика: https://cdn.discordapp.com/attachments/545206963185647637/596098096853942272/javaw_E4cv3bfjGE.png

Превратить в предмет:

https://cdn.discordapp.com/attachments/545206963185647637/596098385040113673/javaw_sorHX2JM5s.png

При этом гражданеисчезнет и превратится в предмет.Элементом является ItemStack, который затем сериализуется (см. Классы ниже), который затем добавляется в файл .json, где UUID пользователя присоединяется к сериализованному ItemStack.Затем я могу, когда пользователь щелкает правой кнопкой мыши по элементу, десериализовать элемент и проверить, соответствует ли он какому-либо из десериализованных элементов.

Контроллер элемента (просто класс для его инициации)

public class ItemController {

    public ItemController(){

    }

    public void giveItem(Player player, NPC npc){
        ItemStack item = ItemBuilder.buildItem(Material.NETHER_STAR,
                ChatUtil.colorize("&6&lGuard Skull"),
                1,
                ChatUtil.colorize(
                        "&6&lID: &e" + npc.getId() + "\n" +
                        "&6&lOwned by:&e " + player.getName() + "\n" +
                        "&6&lName: &e" + npc.getFullName()
                )
        );
        item.setDurability((short) npc.getId());
        player.getInventory().addItem(item);
        HandlerManager.getSerializer().addItem(player, item);
        HandlerManager.getSerializer().disinit();
        HandlerManager.getSerializer().init();
        GuardNPC.getInstance().getItemLoggerConfig().save();
    }
}
public class ItemList {
    @Getter Player player;

    public ItemList(Player player){
        this.player = player;
    }

    @Getter private HashMap<Player, String> serialzedItems;
    @Getter private HashMap<Player, ItemStack> items;
    @Getter private HashMap<Player, ItemStack> allitems;

    public ItemList serialize() {
        if (serialzedItems == null)
            serialzedItems = new HashMap<>();
        items.entrySet().forEach(e -> {
            serialzedItems.put(e.getKey(), ItemSerializer.itemStackToBase64(e.getValue()));
        });
        return this;
    }

    public ItemList deserialize() {
        if (items == null)
            items = new HashMap<>();
        if (serialzedItems != null && !serialzedItems.isEmpty()) {
            serialzedItems.entrySet().forEach(entry -> items.put(entry.getKey(), ItemSerializer.itemStackFromBase64(entry.getValue())));
        }
        return this;
    }

    public void addItem(Player player, ItemStack item){
        if (items == null)
            items = new HashMap<>();
        if (serialzedItems == null)
            serialzedItems = new HashMap<>();
        items.put(player, item);
        serialzedItems.put(player, ItemSerializer.itemStackToBase64(item));
    }
    public void removeItem(Player player, ItemStack item){
        items.remove(item, player);
        serialzedItems.remove(player, ItemSerializer.itemStackToBase64(item));
    }

}


Обработчик для ItemList

public class Serializer extends Handler{

    public Serializer() {
        super(false);
    }
    private List<ItemList> items;
    public void init(){
        items = GsonUtil.loadObject(new TypeToken<List<ItemList>>() {
        }, GuardNPC.getInstance().getItemLoggerConfig().getFile());
        if (items == null)
            items = new ArrayList<>();
        items.forEach(itemList -> itemList.deserialize());
    }
    public void disinit() {
        items.forEach(itemList -> itemList.serialize());
        GsonUtil.saveObject(items, GuardNPC.getInstance().getItemLoggerConfig().getFile());
    }

    public ItemList addItem(Player player, ItemStack item) {
        ItemList list;
        if (getItemList(player) == null){
            list = new ItemList(player);
        } else {
            list = getItemList(player);
        }
        list.addItem(player, item);
        items.add(list);

        return list;
    }
    public ItemList getItemList(Player player) {
        Optional<ItemList> o = items.stream().filter(itemList -> itemList.getPlayer().equals(player)).findAny();
        return o.isPresent() ? o.get() : null;
    }

}

Использование сериализации GSon:

public class GsonUtil {

    private static Gson gson = new GsonBuilder().setPrettyPrinting().create();

    public static void saveObject(Object object, File file) {
        try {
            Writer writer = new FileWriter(file);
            writer.write(gson.toJson(object));
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static <T> T loadObject(TypeToken<T> token, File file) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            return gson.fromJson(br, token.getType());
        } catch (IOException e) {
        }
        return null;
    }
}

Событие, когда я нажимаю NPC


public class EventNPCPlayerRightClick implements Listener{

    @EventHandler
    public void onClick(NPCRightClickEvent e){
        Player player = e.getClicker();
        NPC npc = e.getNPC();
        int id = npc.getId();
        UUID uuid = player.getUniqueId();
        if(GuardNPC.getInstance().getNpcController().isOwner(player, npc)){
            npc.despawn();
            GuardNPC.getInstance().getItemController().giveItem(player, npc);
            return;
        } else if(GuardNPC.getInstance().getDebuggedPlayers().contains(player)){
            GuardNPC.getInstance().getNpcController().addNPC(npc, player);
            npc.despawn();
            GuardNPC.getInstance().getItemController().giveItem(player, npc);
            return;
        }


    }
}

Ошибка:https://pastebin.com/M2TWv9NF

...