Cloth Config API (Fabric/Forge/NeoForge)

Cloth Config API (Fabric/Forge/NeoForge)

169M Downloads

`DropdownBoxEntry` not working inside a `AbstractListListEntry`

ChocolateLoverRaj opened this issue ยท 0 comments

commented

I made a custom GUI for an Item, and now I'm trying to make one for List<Item>. There isn't an easy way to do this, so I made a ItemListListEntry class which extends AbstractListListEntry.

The list appears on the config screen, but when I click on the add button or expand the list, the game crashes.

The error:

java.lang.NullPointerException: Cannot invoke "me.shedaniel.clothconfig2.gui.widget.DynamicEntryListWidget.isMouseOver(double, double)" because the return value of "me.shedaniel.clothconfig2.api.AbstractConfigListEntry.getParent()" is null
	at me.shedaniel.clothconfig2.api.AbstractConfigListEntry.isMouseInside(AbstractConfigListEntry.java:67)
	at me.shedaniel.clothconfig2.api.AbstractConfigListEntry.render(AbstractConfigListEntry.java:72)
	at me.shedaniel.clothconfig2.gui.entries.TooltipListEntry.render(TooltipListEntry.java:57)
	at me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.render(DropdownBoxEntry.java:84)
	at net.fabricmc.magic_bowl.ItemListListEntry$ItemListCell.render(ItemListListEntry.java:74)
	at me.shedaniel.clothconfig2.gui.entries.BaseListEntry.render(BaseListEntry.java:287)
	at net.fabricmc.magic_bowl.ItemListListEntry.render(ItemListListEntry.java:94)
	at me.shedaniel.clothconfig2.gui.widget.DynamicEntryListWidget.renderItem(DynamicEntryListWidget.java:494)
	at me.shedaniel.clothconfig2.gui.ClothConfigScreen$ListWidget.renderItem(ClothConfigScreen.java:357)
	at me.shedaniel.clothconfig2.gui.ClothConfigScreen$ListWidget.renderItem(ClothConfigScreen.java:324)
	at me.shedaniel.clothconfig2.gui.widget.DynamicEntryListWidget.renderList(DynamicEntryListWidget.java:489)
	at me.shedaniel.clothconfig2.gui.ClothConfigScreen$ListWidget.renderList(ClothConfigScreen.java:369)
	at me.shedaniel.clothconfig2.gui.widget.DynamicEntryListWidget.render(DynamicEntryListWidget.java:258)
	at me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.render(DynamicNewSmoothScrollingEntryListWidget.java:131)
	at me.shedaniel.clothconfig2.gui.ClothConfigScreen.render(ClothConfigScreen.java:230)
	at net.minecraft.client.render.GameRenderer.render(GameRenderer.java:885)
	at net.minecraft.client.MinecraftClient.render(MinecraftClient.java:1149)
	at net.minecraft.client.MinecraftClient.run(MinecraftClient.java:746)
	at net.minecraft.client.main.Main.main(Main.java:191)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:234)
	at net.fabricmc.loader.launch.knot.Knot.launch(Knot.java:153)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)
	at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)

My ItemListListEntry class:

package net.fabricmc.magic_bowl;

import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.jetbrains.annotations.Nullable;

import me.shedaniel.clothconfig2.gui.entries.AbstractListListEntry;
import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry;
import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.text.Text;

public class ItemListListEntry extends AbstractListListEntry<Item, ItemListListEntry.ItemListCell, ItemListListEntry> {
  public ItemListListEntry(Text fieldName, List<Item> value, boolean defaultExpanded,
      Supplier<Optional<Text[]>> tooltipSupplier, Consumer<List<Item>> saveConsumer, Supplier<List<Item>> defaultValue,
      Text resetButtonKey, boolean requiresRestart, boolean deleteButtonEnabled, boolean insertInFront) {
    super(fieldName, value, defaultExpanded, tooltipSupplier, saveConsumer, defaultValue, resetButtonKey,
        requiresRestart, deleteButtonEnabled, insertInFront, ItemListCell::new);
  }

  public static class ItemListCell
      extends AbstractListListEntry.AbstractListCell<Item, ItemListCell, ItemListListEntry> {

    private DropdownBoxEntry<Item> widget;

    public ItemListCell(@Nullable Item value, ItemListListEntry listListEntry) {
      super(value, listListEntry);
      widget = new DropdownMenuBuilder<Item>(listListEntry.resetWidget.getMessage(), listListEntry.getFieldName(),
          DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(substituteDefault(value)),
          DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).build();
    }

    @Override
    public SelectionType getType() {
      return null;
    }

    @Override
    public void appendNarrations(NarrationMessageBuilder builder) {
      // TODO Auto-generated method stub

    }

    @Override
    public List<? extends Element> children() {
      return widget.children();
    }

    @Override
    public Item getValue() {
      return widget.getValue();
    }

    @Override
    public int getCellHeight() {
      return widget.getItemHeight();
    }

    @Override
    public Optional<Text> getError() {
      return widget.getError();
    }

    @Override
    public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX,
        int mouseY, boolean isHovered, float delta) {
      widget.render(matrices, index, x, y, entryWidth, entryHeight, mouseX, mouseY, isHovered, delta);
    }

    private Item substituteDefault(@Nullable Item value) {
      if (value == null)
        return Items.AIR;
      else
        return value;
    }
  }

  @Override
  public ItemListListEntry self() {
    return this;
  }

  @Override
  public void render(MatrixStack arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7,
      boolean arg8, float arg9) {
    // TODO Auto-generated method stub
    super.render(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
  }
}