浏览代码

2.11

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel 5 年之前
父节点
当前提交
f76ff22fc9
共有 79 个文件被更改,包括 303 次插入76 次删除
  1. 1 1
      gradle.properties
  2. 3 0
      src/main/java/me/shedaniel/clothconfig2/ClothConfigInitializer.java
  3. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/AbstractConfigEntry.java
  4. 4 0
      src/main/java/me/shedaniel/clothconfig2/api/AbstractConfigListEntry.java
  5. 5 2
      src/main/java/me/shedaniel/clothconfig2/api/ConfigBuilder.java
  6. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/ConfigCategory.java
  7. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/ConfigEntryBuilder.java
  8. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/FakeModifierKeyCodeAdder.java
  9. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/Modifier.java
  10. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/ModifierKeyCode.java
  11. 1 0
      src/main/java/me/shedaniel/clothconfig2/api/RunSixtyTimesEverySec.java
  12. 3 0
      src/main/java/me/shedaniel/clothconfig2/api/ScissorsHandler.java
  13. 14 11
      src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigScreen.java
  14. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigTabButton.java
  15. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/ClothRequiresRestartScreen.java
  16. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/AbstractListListEntry.java
  17. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/AbstractTextFieldListListEntry.java
  18. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/BaseListCell.java
  19. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/BaseListEntry.java
  20. 9 5
      src/main/java/me/shedaniel/clothconfig2/gui/entries/BooleanListEntry.java
  21. 7 4
      src/main/java/me/shedaniel/clothconfig2/gui/entries/DoubleListEntry.java
  22. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/DoubleListListEntry.java
  23. 5 2
      src/main/java/me/shedaniel/clothconfig2/gui/entries/DropdownBoxEntry.java
  24. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/EnumListEntry.java
  25. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/FloatListEntry.java
  26. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/FloatListListEntry.java
  27. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerListEntry.java
  28. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerListListEntry.java
  29. 4 1
      src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerSliderEntry.java
  30. 4 1
      src/main/java/me/shedaniel/clothconfig2/gui/entries/KeyCodeEntry.java
  31. 4 1
      src/main/java/me/shedaniel/clothconfig2/gui/entries/LongListEntry.java
  32. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/LongListListEntry.java
  33. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/LongSliderEntry.java
  34. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/MultiElementListEntry.java
  35. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/NestedListListEntry.java
  36. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/SelectionListEntry.java
  37. 4 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/StringListEntry.java
  38. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/StringListListEntry.java
  39. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/SubCategoryListEntry.java
  40. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/TextFieldListEntry.java
  41. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/TextListEntry.java
  42. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/entries/TooltipListEntry.java
  43. 3 0
      src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicNewSmoothScrollingEntryListWidget.java
  44. 3 1
      src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicSmoothScrollingEntryListWidget.java
  45. 5 2
      src/main/java/me/shedaniel/clothconfig2/impl/ConfigBuilderImpl.java
  46. 7 4
      src/main/java/me/shedaniel/clothconfig2/impl/ConfigCategoryImpl.java
  47. 3 0
      src/main/java/me/shedaniel/clothconfig2/impl/ConfigEntryBuilderImpl.java
  48. 2 2
      src/main/java/me/shedaniel/clothconfig2/impl/EasingMethod.java
  49. 1 1
      src/main/java/me/shedaniel/clothconfig2/impl/EasingMethods.java
  50. 7 4
      src/main/java/me/shedaniel/clothconfig2/impl/FakeKeyBindings.java
  51. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/FakeModifierKeyCodeAdderImpl.java
  52. 3 0
      src/main/java/me/shedaniel/clothconfig2/impl/GameOptionsHooks.java
  53. 4 0
      src/main/java/me/shedaniel/clothconfig2/impl/KeyBindingHooks.java
  54. 3 0
      src/main/java/me/shedaniel/clothconfig2/impl/ModifierKeyCodeImpl.java
  55. 1 0
      src/main/java/me/shedaniel/clothconfig2/impl/RunSixtyTimesEverySecImpl.java
  56. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/ScissorsHandlerImpl.java
  57. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/BooleanToggleBuilder.java
  58. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/DoubleFieldBuilder.java
  59. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/DoubleListBuilder.java
  60. 6 3
      src/main/java/me/shedaniel/clothconfig2/impl/builders/DropdownMenuBuilder.java
  61. 5 2
      src/main/java/me/shedaniel/clothconfig2/impl/builders/EnumSelectorBuilder.java
  62. 3 0
      src/main/java/me/shedaniel/clothconfig2/impl/builders/FieldBuilder.java
  63. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/FloatFieldBuilder.java
  64. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/FloatListBuilder.java
  65. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/IntFieldBuilder.java
  66. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/IntListBuilder.java
  67. 6 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/IntSliderBuilder.java
  68. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/KeyCodeBuilder.java
  69. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/LongFieldBuilder.java
  70. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/LongListBuilder.java
  71. 6 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/LongSliderBuilder.java
  72. 5 2
      src/main/java/me/shedaniel/clothconfig2/impl/builders/SelectorBuilder.java
  73. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/StringFieldBuilder.java
  74. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/StringListBuilder.java
  75. 11 8
      src/main/java/me/shedaniel/clothconfig2/impl/builders/SubCategoryBuilder.java
  76. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/TextDescriptionBuilder.java
  77. 4 1
      src/main/java/me/shedaniel/clothconfig2/impl/builders/TextFieldBuilder.java
  78. 3 0
      src/main/java/me/shedaniel/math/impl/PointHelper.java
  79. 0 1
      src/main/resources/fabric.mod.json

+ 1 - 1
gradle.properties

@@ -2,6 +2,6 @@ minecraft_version=1.15.1
 yarn_mappings=1.15.1+build.37
 loader_version=0.7.4+build.177
 fabric_version=0.4.28+build.288-1.15
-mod_version=2.10
+mod_version=2.11
 modmenu_version=1.8.4+build.20
 nec_version=1.2.3+1.15.1

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/ClothConfigInitializer.java

@@ -12,6 +12,8 @@ import me.shedaniel.clothconfig2.impl.EasingMethod.EasingMethodImpl;
 import me.shedaniel.clothconfig2.impl.EasingMethods;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
 import net.fabricmc.api.ClientModInitializer;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
@@ -37,6 +39,7 @@ import java.nio.file.Files;
 import java.util.*;
 import java.util.stream.Collectors;
 
+@Environment(EnvType.CLIENT)
 public class ClothConfigInitializer implements ClientModInitializer {
     
     public static final Logger LOGGER = LogManager.getFormatterLogger("ClothConfig");

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/AbstractConfigEntry.java

@@ -2,10 +2,13 @@ package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.gui.ClothConfigScreen;
 import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public abstract class AbstractConfigEntry<T> extends DynamicElementListWidget.ElementEntry<AbstractConfigEntry<T>> {
     private ClothConfigScreen screen;
     private Supplier<Optional<String>> errorSupplier;

+ 4 - 0
src/main/java/me/shedaniel/clothconfig2/api/AbstractConfigListEntry.java

@@ -1,5 +1,9 @@
 package me.shedaniel.clothconfig2.api;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+
+@Environment(EnvType.CLIENT)
 public abstract class AbstractConfigListEntry<T> extends AbstractConfigEntry<T> {
     private String fieldName;
     private boolean editable = true;

+ 5 - 2
src/main/java/me/shedaniel/clothconfig2/api/ConfigBuilder.java

@@ -2,15 +2,18 @@ package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.impl.ConfigBuilderImpl;
 import me.shedaniel.clothconfig2.impl.ConfigEntryBuilderImpl;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.util.Identifier;
 
 import java.util.function.Consumer;
 
+@Environment(EnvType.CLIENT)
 public interface ConfigBuilder {
     
     @SuppressWarnings("deprecation")
-    public static ConfigBuilder create() {
+    static ConfigBuilder create() {
         return new ConfigBuilderImpl();
     }
     
@@ -18,7 +21,7 @@ public interface ConfigBuilder {
      * @deprecated Use {@link ConfigBuilder#create()}
      */
     @Deprecated
-    public static ConfigBuilder create(Screen parent, String title) {
+    static ConfigBuilder create(Screen parent, String title) {
         return create().setParentScreen(parent).setTitle(title);
     }
     

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/ConfigCategory.java

@@ -1,9 +1,12 @@
 package me.shedaniel.clothconfig2.api;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.util.Identifier;
 
 import java.util.List;
 
+@Environment(EnvType.CLIENT)
 public interface ConfigCategory {
     
     String getCategoryKey();

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/ConfigEntryBuilder.java

@@ -6,6 +6,8 @@ import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.SelectionTopCellEl
 import me.shedaniel.clothconfig2.impl.ConfigEntryBuilderImpl;
 import me.shedaniel.clothconfig2.impl.builders.*;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder.TopCellElementBuilder;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.fabricmc.fabric.mixin.client.keybinding.KeyCodeAccessor;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.options.KeyBinding;
@@ -14,6 +16,7 @@ import net.minecraft.client.util.InputUtil;
 import java.util.List;
 import java.util.function.Function;
 
+@Environment(EnvType.CLIENT)
 public interface ConfigEntryBuilder {
     
     static ConfigEntryBuilder create() {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/FakeModifierKeyCodeAdder.java

@@ -1,12 +1,15 @@
 package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.impl.FakeModifierKeyCodeAdderImpl;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.options.KeyBinding;
 
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public interface FakeModifierKeyCodeAdder {
     FakeModifierKeyCodeAdder INSTANCE = new FakeModifierKeyCodeAdderImpl();
     

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/Modifier.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.api;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.screen.Screen;
 
 import java.util.Objects;
@@ -10,6 +12,7 @@ import java.util.Objects;
  *
  * @author Siphalor
  */
+@Environment(EnvType.CLIENT)
 public class Modifier {
     private short value;
     

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/ModifierKeyCode.java

@@ -2,9 +2,12 @@ package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.impl.ModifierKeyCodeImpl;
 import me.shedaniel.clothconfig2.mixin.MouseHooks;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.util.InputUtil;
 
+@Environment(EnvType.CLIENT)
 public interface ModifierKeyCode {
     static ModifierKeyCode of(InputUtil.KeyCode keyCode, Modifier modifier) {
         return new ModifierKeyCodeImpl().setKeyCodeAndModifier(keyCode, modifier);

+ 1 - 0
src/main/java/me/shedaniel/clothconfig2/api/RunSixtyTimesEverySec.java

@@ -2,6 +2,7 @@ package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.impl.RunSixtyTimesEverySecImpl;
 
+@Deprecated
 public interface RunSixtyTimesEverySec {
     
     void run();

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/api/ScissorsHandler.java

@@ -2,9 +2,12 @@ package me.shedaniel.clothconfig2.api;
 
 import me.shedaniel.clothconfig2.impl.ScissorsHandlerImpl;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 
 import java.util.List;
 
+@Environment(EnvType.CLIENT)
 public interface ScissorsHandler {
     ScissorsHandler INSTANCE = ScissorsHandlerImpl.INSTANCE;
     

+ 14 - 11
src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigScreen.java

@@ -9,6 +9,8 @@ import me.shedaniel.clothconfig2.api.*;
 import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry;
 import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.Element;
@@ -37,6 +39,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 @SuppressWarnings({"deprecation", "rawtypes", "unchecked", "DuplicatedCode"})
+@Environment(EnvType.CLIENT)
 public abstract class ClothConfigScreen extends Screen {
     
     private static final Identifier CONFIG_TEX = new Identifier("cloth-config2", "textures/gui/cloth_config.png");
@@ -44,25 +47,25 @@ public abstract class ClothConfigScreen extends Screen {
     public int nextTabIndex;
     public int selectedTabIndex;
     public double tabsScrollVelocity = 0d;
-    public double tabsScrollProgress = 0d;
+    public double tabsScrollProgress;
     public ListWidget<AbstractConfigEntry<AbstractConfigEntry>> listWidget;
     private KeyCodeEntry focusedBinding;
-    private Screen parent;
-    private LinkedHashMap<String, List<AbstractConfigEntry>> tabbedEntries;
-    private List<Pair<String, Integer>> tabs;
+    private final Screen parent;
+    private final LinkedHashMap<String, List<AbstractConfigEntry>> tabbedEntries;
+    private final List<Pair<String, Integer>> tabs;
     private boolean edited;
     private boolean requiresRestart;
-    private boolean confirmSave;
+    private final boolean confirmSave;
     private AbstractButtonWidget buttonQuit, buttonSave, buttonLeftTab, buttonRightTab;
     private Rectangle tabsBounds, tabsLeftBounds, tabsRightBounds;
-    private String title;
+    private final String title;
     private double tabsMaximumScrolled = -1d;
-    private boolean displayErrors;
-    private List<ClothConfigTabButton> tabButtons;
+    private final boolean displayErrors;
+    private final List<ClothConfigTabButton> tabButtons;
     private boolean smoothScrollingTabs = true;
-    private boolean smoothScrollingList = true;
-    private Identifier defaultBackgroundLocation;
-    private Map<String, Identifier> categoryBackgroundLocation;
+    private boolean smoothScrollingList;
+    private final Identifier defaultBackgroundLocation;
+    private final Map<String, Identifier> categoryBackgroundLocation;
     private boolean transparentBackground = false;
     private boolean editable = true;
     @Nullable private String defaultFallbackCategory = null;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigTabButton.java

@@ -1,7 +1,10 @@
 package me.shedaniel.clothconfig2.gui;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
 
+@Environment(EnvType.CLIENT)
 public class ClothConfigTabButton extends AbstractPressableButtonWidget {
     
     private final int index;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/ClothRequiresRestartScreen.java

@@ -1,11 +1,14 @@
 package me.shedaniel.clothconfig2.gui;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.ConfirmScreen;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.TranslatableText;
 
+@Environment(EnvType.CLIENT)
 public class ClothRequiresRestartScreen extends ConfirmScreen {
     
     public ClothRequiresRestartScreen(Screen parent) {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/AbstractListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
 
@@ -18,6 +20,7 @@ import java.util.stream.Collectors;
  * @see BaseListEntry
  */
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public abstract class AbstractListListEntry<T, C extends AbstractListListEntry.AbstractListCell<T, C, SELF>, SELF extends AbstractListListEntry<T, C, SELF>> extends BaseListEntry<T, C, SELF> {
     
     protected final BiFunction<T, SELF, C> createNewCell;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/AbstractTextFieldListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.TextFieldWidget;
@@ -24,6 +26,7 @@ import java.util.function.Supplier;
  * @see AbstractListListEntry
  */
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public abstract class AbstractTextFieldListListEntry<T, C extends AbstractTextFieldListListEntry.AbstractTextFieldListCell<T, C, SELF>, SELF extends AbstractTextFieldListListEntry<T, C, SELF>> extends AbstractListListEntry<T, C, SELF> {
     
     public AbstractTextFieldListListEntry(String fieldName, List<T> value, boolean defaultExpanded, Supplier<Optional<String[]>> tooltipSupplier, Consumer<List<T>> saveConsumer, Supplier<List<T>> defaultValue, String resetButtonKey, boolean requiresRestart, boolean deleteButtonEnabled, boolean insertInFront, BiFunction<T, SELF, C> createNewCell) {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/BaseListCell.java

@@ -1,10 +1,13 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.AbstractParentElement;
 
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public abstract class BaseListCell extends AbstractParentElement {
     
     private Supplier<Optional<String>> errorSupplier;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/BaseListEntry.java

@@ -5,6 +5,8 @@ import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.clothconfig2.api.QueuedTooltip;
 import me.shedaniel.math.api.Point;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.AbstractButtonWidget;
@@ -32,6 +34,7 @@ import java.util.stream.Collectors;
  * @implNote See <a href="https://stackoverflow.com/questions/7354740/is-there-a-way-to-refer-to-the-current-type-with-a-type-variable">Is there a way to refer to the current type with a type variable?</href> on Stack Overflow.
  */
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public abstract class BaseListEntry<T, C extends BaseListCell, SELF extends BaseListEntry<T, C, SELF>> extends TooltipListEntry<List<T>> {
     
     protected static final Identifier CONFIG_TEX = new Identifier("cloth-config2", "textures/gui/cloth_config.png");

+ 9 - 5
src/main/java/me/shedaniel/clothconfig2/gui/entries/BooleanListEntry.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -13,13 +15,15 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class BooleanListEntry extends TooltipListEntry<Boolean> {
     
-    private AtomicBoolean bool;
-    private ButtonWidget buttonWidget, resetButton;
-    private Consumer<Boolean> saveConsumer;
-    private Supplier<Boolean> defaultValue;
-    private List<Element> widgets;
+    private final AtomicBoolean bool;
+    private final ButtonWidget buttonWidget;
+    private final ButtonWidget resetButton;
+    private final Consumer<Boolean> saveConsumer;
+    private final Supplier<Boolean> defaultValue;
+    private final List<Element> widgets;
     
     @Deprecated
     public BooleanListEntry(String fieldName, boolean bool, Consumer<Boolean> saveConsumer) {

+ 7 - 4
src/main/java/me/shedaniel/clothconfig2/gui/entries/DoubleListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.resource.language.I18n;
 
@@ -8,16 +10,17 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class DoubleListEntry extends TextFieldListEntry<Double> {
     
     private static Function<String, String> stripCharacters = s -> {
         StringBuilder stringBuilder_1 = new StringBuilder();
         char[] var2 = s.toCharArray();
         int var3 = var2.length;
-        
-        for (int var4 = 0; var4 < var3; ++var4)
-            if (Character.isDigit(var2[var4]) || var2[var4] == '-' || var2[var4] == '.')
-                stringBuilder_1.append(var2[var4]);
+    
+        for (char c : var2)
+            if (Character.isDigit(c) || c == '-' || c == '.')
+                stringBuilder_1.append(c);
         
         return stringBuilder_1.toString();
     };

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/DoubleListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,6 +13,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class DoubleListListEntry extends AbstractTextFieldListListEntry<Double, DoubleListListEntry.DoubleListCell, DoubleListListEntry> {
     
     private double minimum, maximum;

+ 5 - 2
src/main/java/me/shedaniel/clothconfig2/gui/entries/DropdownBoxEntry.java

@@ -10,6 +10,8 @@ import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWi
 import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget.Precision;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.AbstractParentElement;
@@ -32,6 +34,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 @SuppressWarnings("deprecation")
+@Environment(EnvType.CLIENT)
 public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
     
     protected ButtonWidget resetButton;
@@ -48,7 +51,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
             selectionElement.topRenderer.setValue(defaultValue.get());
             getScreen().setEdited(true, isRequiresRestart());
         });
-        this.selectionElement = new SelectionElement(this, new Rectangle(0, 0, 150, 20), new DefaultDropdownMenuElement(selections == null ? ImmutableList.of() : ImmutableList.copyOf(selections)), topRenderer, cellCreator);
+        this.selectionElement = new SelectionElement<>(this, new Rectangle(0, 0, 150, 20), new DefaultDropdownMenuElement<>(selections == null ? ImmutableList.of() : ImmutableList.copyOf(selections)), topRenderer, cellCreator);
     }
     
     @Override
@@ -284,7 +287,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
                     currentElements.add(cell);
             }
             if (!keyword.isEmpty()) {
-                Comparator<SelectionCellElement> c = Comparator.comparingDouble(i -> i.getSearchKey() == null ? Double.MAX_VALUE : similarity(i.getSearchKey(), keyword));
+                Comparator<SelectionCellElement<?>> c = Comparator.comparingDouble(i -> i.getSearchKey() == null ? Double.MAX_VALUE : similarity(i.getSearchKey(), keyword));
                 currentElements.sort(c.reversed());
             }
             scrollTo(0, false);

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/EnumListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 
 import java.util.Optional;
@@ -7,6 +9,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class EnumListEntry<T extends Enum<?>> extends SelectionListEntry<T> {
     
     public static final Function<Enum, String> DEFAULT_NAME_PROVIDER = t -> I18n.translate(t instanceof Translatable ? ((Translatable) t).getKey() : t.toString());

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/FloatListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.resource.language.I18n;
 
@@ -8,6 +10,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class FloatListEntry extends TextFieldListEntry<Float> {
     
     private static Function<String, String> stripCharacters = s -> {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/FloatListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,6 +13,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class FloatListListEntry extends AbstractTextFieldListListEntry<Float, FloatListListEntry.FloatListCell, FloatListListEntry> {
     
     private float minimum, maximum;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.resource.language.I18n;
 
@@ -8,6 +10,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class IntegerListEntry extends TextFieldListEntry<Integer> {
     
     private static Function<String, String> stripCharacters = s -> {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,6 +13,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class IntegerListListEntry extends AbstractTextFieldListListEntry<Integer, IntegerListListEntry.IntegerListCell, IntegerListListEntry> {
     
     private int minimum, maximum;

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/gui/entries/IntegerSliderEntry.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -16,6 +18,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class IntegerSliderEntry extends TooltipListEntry<Integer> {
     
     protected Slider sliderWidget;
@@ -106,7 +109,7 @@ public class IntegerSliderEntry extends TooltipListEntry<Integer> {
     public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
         super.render(index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta);
         Window window = MinecraftClient.getInstance().getWindow();
-        this.resetButton.active = isEditable() && getDefaultValue().isPresent() && defaultValue.get().intValue() != value.get();
+        this.resetButton.active = isEditable() && getDefaultValue().isPresent() && defaultValue.get() != value.get();
         this.resetButton.y = y;
         this.sliderWidget.active = isEditable();
         this.sliderWidget.y = y;

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/gui/entries/KeyCodeEntry.java

@@ -2,6 +2,8 @@ package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -15,6 +17,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @SuppressWarnings("DuplicatedCode")
+@Environment(EnvType.CLIENT)
 public class KeyCodeEntry extends TooltipListEntry<ModifierKeyCode> {
     
     private ModifierKeyCode value;
@@ -34,7 +37,7 @@ public class KeyCodeEntry extends TooltipListEntry<ModifierKeyCode> {
             getScreen().setEdited(true, isRequiresRestart());
         });
         this.resetButton = new ButtonWidget(0, 0, MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(resetButtonKey)) + 6, 20, I18n.translate(resetButtonKey), widget -> {
-            KeyCodeEntry.this.value = getDefaultValue().get();
+            KeyCodeEntry.this.value = getDefaultValue().orElse(null);
             getScreen().setFocusedBinding(null);
             getScreen().setEdited(true, isRequiresRestart());
         });

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/gui/entries/LongListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.resource.language.I18n;
 
@@ -8,6 +10,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class LongListEntry extends TextFieldListEntry<Long> {
     
     private static Function<String, String> stripCharacters = s -> {
@@ -93,7 +96,7 @@ public class LongListEntry extends TextFieldListEntry<Long> {
         try {
             return Long.valueOf(textFieldWidget.getText());
         } catch (Exception e) {
-            return 0l;
+            return 0L;
         }
     }
     

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/LongListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,6 +13,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class LongListListEntry extends AbstractTextFieldListListEntry<Long, LongListListEntry.LongListCell, LongListListEntry> {
     
     private long minimum, maximum;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/LongSliderEntry.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -16,6 +18,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class LongSliderEntry extends TooltipListEntry<Long> {
     
     protected Slider sliderWidget;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/MultiElementListEntry.java

@@ -4,6 +4,8 @@ import com.google.common.collect.Lists;
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.render.DiffuseLighting;
@@ -17,6 +19,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+@Environment(EnvType.CLIENT)
 public class MultiElementListEntry<T> extends TooltipListEntry<T> {
     
     private static final Identifier CONFIG_TEX = new Identifier("cloth-config2", "textures/gui/cloth_config.png");

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/NestedListListEntry.java

@@ -2,6 +2,8 @@ package me.shedaniel.clothconfig2.gui.entries;
 
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.gui.entries.NestedListListEntry.NestedListCell;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.Element;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
@@ -17,6 +19,7 @@ import java.util.function.Supplier;
  * @param <T>     the configuration object type
  * @param <INNER> the type of the inner config entry
  */
+@Environment(EnvType.CLIENT)
 public final class NestedListListEntry<T, INNER extends AbstractConfigListEntry<T>> extends AbstractListListEntry<T, NestedListCell<T, INNER>, NestedListListEntry<T, INNER>> {
     
     @ApiStatus.Internal

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/SelectionListEntry.java

@@ -2,6 +2,8 @@ package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -18,6 +20,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class SelectionListEntry<T> extends TooltipListEntry<T> {
     
     private ImmutableList<T> values;

+ 4 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/StringListEntry.java

@@ -1,9 +1,13 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class StringListEntry extends TextFieldListEntry<String> {
     
     private Consumer<String> saveConsumer;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/StringListListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -10,6 +12,7 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 @ApiStatus.Internal
+@Environment(EnvType.CLIENT)
 public class StringListListEntry extends AbstractTextFieldListListEntry<String, StringListListEntry.StringListCell, StringListListEntry> {
     
     @Deprecated

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/SubCategoryListEntry.java

@@ -4,6 +4,8 @@ import com.google.common.collect.Lists;
 import com.mojang.blaze3d.systems.RenderSystem;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.render.DiffuseLighting;
@@ -15,6 +17,7 @@ import net.minecraft.util.Identifier;
 import java.util.List;
 import java.util.Optional;
 
+@Environment(EnvType.CLIENT)
 public class SubCategoryListEntry extends TooltipListEntry<List<AbstractConfigListEntry>> {
     
     private static final Identifier CONFIG_TEX = new Identifier("cloth-config2", "textures/gui/cloth_config.png");

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/TextFieldListEntry.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
 import com.google.common.collect.Lists;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.widget.ButtonWidget;
@@ -12,6 +14,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public abstract class TextFieldListEntry<T> extends TooltipListEntry<T> {
     
     protected TextFieldWidget textFieldWidget;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/TextListEntry.java

@@ -1,5 +1,7 @@
 package me.shedaniel.clothconfig2.gui.entries;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 
@@ -8,6 +10,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class TextListEntry extends TooltipListEntry<Object> {
     
     private int savedWidth = -1;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/TooltipListEntry.java

@@ -3,11 +3,14 @@ package me.shedaniel.clothconfig2.gui.entries;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.QueuedTooltip;
 import me.shedaniel.math.api.Point;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public abstract class TooltipListEntry<T> extends AbstractConfigListEntry<T> {
     
     @Nullable private Supplier<Optional<String[]>> tooltipSupplier;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicNewSmoothScrollingEntryListWidget.java

@@ -3,6 +3,8 @@ package me.shedaniel.clothconfig2.gui.widget;
 import me.shedaniel.clothconfig2.ClothConfigInitializer;
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.math.impl.PointHelper;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.Tessellator;
@@ -13,6 +15,7 @@ import net.minecraft.util.math.MathHelper;
 import static me.shedaniel.clothconfig2.ClothConfigInitializer.clamp;
 import static me.shedaniel.clothconfig2.ClothConfigInitializer.handleScrollingPosition;
 
+@Environment(EnvType.CLIENT)
 public abstract class DynamicNewSmoothScrollingEntryListWidget<E extends DynamicEntryListWidget.Entry<E>> extends DynamicEntryListWidget<E> {
     
     protected double target;

+ 3 - 1
src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicSmoothScrollingEntryListWidget.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.gui.widget;
 
 import me.shedaniel.clothconfig2.api.RunSixtyTimesEverySec;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.Tessellator;
@@ -9,6 +11,7 @@ import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
 @Deprecated
+@Environment(EnvType.CLIENT)
 public abstract class DynamicSmoothScrollingEntryListWidget<E extends DynamicEntryListWidget.Entry<E>> extends DynamicEntryListWidget<E> {
     
     protected double scrollVelocity;
@@ -122,7 +125,6 @@ public abstract class DynamicSmoothScrollingEntryListWidget<E extends DynamicEnt
         return true;
     }
     
-    @SuppressWarnings("deprecation")
     @Override
     protected void renderScrollBar(Tessellator tessellator, BufferBuilder buffer, int maxScroll, int scrollbarPositionMinX, int scrollbarPositionMaxX) {
         if (!smoothScrolling)

+ 5 - 2
src/main/java/me/shedaniel/clothconfig2/impl/ConfigBuilderImpl.java

@@ -5,6 +5,8 @@ import com.google.common.collect.Maps;
 import me.shedaniel.clothconfig2.api.ConfigBuilder;
 import me.shedaniel.clothconfig2.api.ConfigCategory;
 import me.shedaniel.clothconfig2.gui.ClothConfigScreen;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.resource.language.I18n;
@@ -17,6 +19,7 @@ import java.util.Objects;
 import java.util.function.Consumer;
 
 @Deprecated
+@Environment(EnvType.CLIENT)
 public class ConfigBuilderImpl implements ConfigBuilder {
     
     private Runnable savingRunnable;
@@ -30,8 +33,8 @@ public class ConfigBuilderImpl implements ConfigBuilder {
     private boolean transparentBackground = false;
     private Identifier defaultBackground = DrawableHelper.BACKGROUND_LOCATION;
     private Consumer<Screen> afterInitConsumer = screen -> {};
-    private Map<String, Identifier> categoryBackground = Maps.newHashMap();
-    private Map<String, List<Pair<String, Object>>> dataMap = Maps.newLinkedHashMap();
+    private final Map<String, Identifier> categoryBackground = Maps.newHashMap();
+    private final Map<String, List<Pair<String, Object>>> dataMap = Maps.newLinkedHashMap();
     private String fallbackCategory = null;
     private boolean alwaysShowTabs = false;
     

+ 7 - 4
src/main/java/me/shedaniel/clothconfig2/impl/ConfigCategoryImpl.java

@@ -2,6 +2,8 @@ package me.shedaniel.clothconfig2.impl;
 
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.ConfigCategory;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.Pair;
 
@@ -10,12 +12,13 @@ import java.util.function.Consumer;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+@Environment(EnvType.CLIENT)
 public class ConfigCategoryImpl implements ConfigCategory {
     
-    private Supplier<List<Pair<String, Object>>> listSupplier;
-    private Consumer<Identifier> backgroundConsumer;
-    private Runnable destroyCategory;
-    private String categoryKey;
+    private final Supplier<List<Pair<String, Object>>> listSupplier;
+    private final Consumer<Identifier> backgroundConsumer;
+    private final Runnable destroyCategory;
+    private final String categoryKey;
     
     ConfigCategoryImpl(String categoryKey, Consumer<Identifier> backgroundConsumer, Supplier<List<Pair<String, Object>>> listSupplier, Runnable destroyCategory) {
         this.listSupplier = listSupplier;

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/impl/ConfigEntryBuilderImpl.java

@@ -6,10 +6,13 @@ import me.shedaniel.clothconfig2.api.ModifierKeyCode;
 import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.SelectionCellCreator;
 import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.SelectionTopCellElement;
 import me.shedaniel.clothconfig2.impl.builders.*;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 
 import java.util.List;
 import java.util.UUID;
 
+@Environment(EnvType.CLIENT)
 public class ConfigEntryBuilderImpl implements ConfigEntryBuilder {
     
     private String resetButtonKey = "text.cloth-config.reset_value";

+ 2 - 2
src/main/java/me/shedaniel/clothconfig2/impl/EasingMethod.java

@@ -6,7 +6,7 @@ public interface EasingMethod {
     
     double apply(double v);
     
-    public enum EasingMethodImpl implements EasingMethod {
+    enum EasingMethodImpl implements EasingMethod {
         NONE(v -> 1.0),
         LINEAR(v -> v),
         EXPO(v -> ((v == 1.0) ? 1 : 1 * (-Math.pow(2, -10 * v) + 1))),
@@ -17,7 +17,7 @@ public interface EasingMethod {
         QUINTIC(v -> ((v = v - 1) * v * v * v * v + 1)),
         CIRC(v -> Math.sqrt(1 - (v = v - 1) * v));
         
-        private Function<Double, Double> function;
+        private final Function<Double, Double> function;
         
         EasingMethodImpl(Function<Double, Double> function) {
             this.function = function;

+ 1 - 1
src/main/java/me/shedaniel/clothconfig2/impl/EasingMethods.java

@@ -18,6 +18,6 @@ public class EasingMethods {
     }
     
     public static List<EasingMethod> getMethods() {
-        return Collections.unmodifiableList(new ArrayList<>(METHODS));
+        return Collections.unmodifiableList(METHODS);
     }
 }

+ 7 - 4
src/main/java/me/shedaniel/clothconfig2/impl/FakeKeyBindings.java

@@ -2,17 +2,20 @@ package me.shedaniel.clothconfig2.impl;
 
 import me.shedaniel.clothconfig2.api.Modifier;
 import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.options.KeyBinding;
 import net.minecraft.client.util.InputUtil;
 
 import java.util.UUID;
 import java.util.function.Consumer;
 
+@Environment(EnvType.CLIENT)
 public class FakeKeyBindings extends KeyBinding {
-    private UUID uuid;
-    private ModifierKeyCode keyCode;
-    private ModifierKeyCode defaultKeyCode;
-    private Consumer<ModifierKeyCode> onChanged;
+    private final UUID uuid;
+    private final ModifierKeyCode keyCode;
+    private final ModifierKeyCode defaultKeyCode;
+    private final Consumer<ModifierKeyCode> onChanged;
     
     public FakeKeyBindings(String key, ModifierKeyCode keyCode, ModifierKeyCode defaultKeyCode, String category, Consumer<ModifierKeyCode> onChanged) {
         super(UUID.randomUUID().toString(), InputUtil.Type.KEYSYM, -1, category);

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/FakeModifierKeyCodeAdderImpl.java

@@ -2,6 +2,8 @@ package me.shedaniel.clothconfig2.impl;
 
 import me.shedaniel.clothconfig2.api.FakeModifierKeyCodeAdder;
 import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.options.KeyBinding;
 
 import java.util.ArrayList;
@@ -9,8 +11,9 @@ import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class FakeModifierKeyCodeAdderImpl implements FakeModifierKeyCodeAdder {
-    private List<Entry> entryList = new ArrayList<>();
+    private final List<Entry> entryList = new ArrayList<>();
     
     @Override
     public void registerModifierKeyCode(String category, String translationKey, Supplier<ModifierKeyCode> keyCode, Supplier<ModifierKeyCode> defaultKeyCode, Consumer<ModifierKeyCode> onChanged) {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/impl/GameOptionsHooks.java

@@ -1,7 +1,10 @@
 package me.shedaniel.clothconfig2.impl;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.options.KeyBinding;
 
+@Environment(EnvType.CLIENT)
 public interface GameOptionsHooks {
     void cloth_setKeysAll(KeyBinding[] all);
 }

+ 4 - 0
src/main/java/me/shedaniel/clothconfig2/impl/KeyBindingHooks.java

@@ -1,5 +1,9 @@
 package me.shedaniel.clothconfig2.impl;
 
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+
+@Environment(EnvType.CLIENT)
 public interface KeyBindingHooks {
     void cloth_setId(String id);
 }

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/impl/ModifierKeyCodeImpl.java

@@ -2,11 +2,14 @@ package me.shedaniel.clothconfig2.impl;
 
 import me.shedaniel.clothconfig2.api.Modifier;
 import me.shedaniel.clothconfig2.api.ModifierKeyCode;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.InputUtil;
 
 import java.util.Objects;
 
+@Environment(EnvType.CLIENT)
 public class ModifierKeyCodeImpl implements ModifierKeyCode {
     private InputUtil.KeyCode keyCode;
     private Modifier modifier;

+ 1 - 0
src/main/java/me/shedaniel/clothconfig2/impl/RunSixtyTimesEverySecImpl.java

@@ -9,6 +9,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+@Deprecated
 public class RunSixtyTimesEverySecImpl {
     
     public static final List<RunSixtyTimesEverySec> TICKS_LIST = Lists.newCopyOnWriteArrayList();

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/ScissorsHandlerImpl.java

@@ -5,6 +5,8 @@ import me.shedaniel.clothconfig2.ClothConfigInitializer;
 import me.shedaniel.clothconfig2.api.ScissorsHandler;
 import me.shedaniel.math.api.Executor;
 import me.shedaniel.math.api.Rectangle;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.util.Window;
@@ -13,6 +15,7 @@ import org.lwjgl.opengl.GL11;
 import java.util.Collections;
 import java.util.List;
 
+@Environment(EnvType.CLIENT)
 public final class ScissorsHandlerImpl implements ScissorsHandler {
     
     @Deprecated public static final ScissorsHandler INSTANCE = new ScissorsHandlerImpl();
@@ -33,7 +36,7 @@ public final class ScissorsHandlerImpl implements ScissorsHandler {
         });
     }
     
-    private List<Rectangle> scissorsAreas;
+    private final List<Rectangle> scissorsAreas;
     
     public ScissorsHandlerImpl() {
         this.scissorsAreas = Lists.newArrayList();

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/BooleanToggleBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.BooleanListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -9,11 +11,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class BooleanToggleBuilder extends FieldBuilder<Boolean, BooleanListEntry> {
     
     @Nullable private Consumer<Boolean> saveConsumer = null;
     @NotNull private Function<Boolean, Optional<String[]>> tooltipSupplier = bool -> Optional.empty();
-    private boolean value;
+    private final boolean value;
     @Nullable private Function<Boolean, String> yesNoTextSupplier = null;
     
     public BooleanToggleBuilder(String resetButtonKey, String fieldNameKey, boolean value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/DoubleFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.DoubleListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class DoubleFieldBuilder extends FieldBuilder<Double, DoubleListEntry> {
     
     private Consumer<Double> saveConsumer = null;
     private Function<Double, Optional<String[]>> tooltipSupplier = d -> Optional.empty();
-    private double value;
+    private final double value;
     private Double min = null, max = null;
     
     public DoubleFieldBuilder(String resetButtonKey, String fieldNameKey, double value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/DoubleListBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.DoubleListListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,12 +13,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class DoubleListBuilder extends FieldBuilder<List<Double>, DoubleListListEntry> {
     
     protected Function<Double, Optional<String>> cellErrorSupplier;
     private Consumer<List<Double>> saveConsumer = null;
     private Function<List<Double>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
-    private List<Double> value;
+    private final List<Double> value;
     private boolean expanded = false;
     private Double min = null, max = null;
     private Function<DoubleListListEntry, DoubleListListEntry.DoubleListCell> createNewInstance;

+ 6 - 3
src/main/java/me/shedaniel/clothconfig2/impl/builders/DropdownMenuBuilder.java

@@ -5,6 +5,8 @@ import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.DefaultSelectionCe
 import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.DefaultSelectionTopCellElement;
 import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.SelectionCellCreator;
 import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry.SelectionTopCellElement;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.block.Block;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.item.ItemRenderer;
@@ -22,6 +24,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class DropdownMenuBuilder<T> extends FieldBuilder<T, DropdownBoxEntry<T>> {
     protected SelectionTopCellElement<T> topCellElement;
     protected SelectionCellCreator<T> cellCreator;
@@ -88,7 +91,7 @@ public class DropdownMenuBuilder<T> extends FieldBuilder<T, DropdownBoxEntry<T>>
     @NotNull
     @Override
     public DropdownBoxEntry<T> build() {
-        DropdownBoxEntry<T> entry = new DropdownBoxEntry<T>(getFieldNameKey(), getResetButtonKey(), null, isRequireRestart(), defaultValue, saveConsumer, selections, topCellElement, cellCreator);
+        DropdownBoxEntry<T> entry = new DropdownBoxEntry<>(getFieldNameKey(), getResetButtonKey(), null, isRequireRestart(), defaultValue, saveConsumer, selections, topCellElement, cellCreator);
         entry.setTooltipSupplier(() -> tooltipSupplier.apply(entry.getValue()));
         if (errorSupplier != null)
             entry.setErrorSupplier(() -> errorSupplier.apply(entry.getValue()));
@@ -123,14 +126,14 @@ public class DropdownMenuBuilder<T> extends FieldBuilder<T, DropdownBoxEntry<T>>
         };
         public static final Function<String, Item> ITEM_FUNCTION = str -> {
             try {
-                return Registry.ITEM.getOrEmpty(new Identifier(str)).get();
+                return Registry.ITEM.getOrEmpty(new Identifier(str)).orElse(null);
             } catch (Exception ignored) {
             }
             return null;
         };
         public static final Function<String, Block> BLOCK_FUNCTION = str -> {
             try {
-                return Registry.BLOCK.getOrEmpty(new Identifier(str)).get();
+                return Registry.BLOCK.getOrEmpty(new Identifier(str)).orElse(null);
             } catch (Exception ignored) {
             }
             return null;

+ 5 - 2
src/main/java/me/shedaniel/clothconfig2/impl/builders/EnumSelectorBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.EnumListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
@@ -9,12 +11,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class EnumSelectorBuilder<T extends Enum<?>> extends FieldBuilder<T, EnumListEntry<T>> {
     
     private Consumer<T> saveConsumer = null;
     private Function<T, Optional<String[]>> tooltipSupplier = e -> Optional.empty();
-    private T value;
-    private Class<T> clazz;
+    private final T value;
+    private final Class<T> clazz;
     private Function<Enum, String> enumNameProvider = EnumListEntry.DEFAULT_NAME_PROVIDER;
     
     public EnumSelectorBuilder(String resetButtonKey, String fieldNameKey, Class<T> clazz, T value) {

+ 3 - 0
src/main/java/me/shedaniel/clothconfig2/impl/builders/FieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -9,6 +11,7 @@ import java.util.Optional;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public abstract class FieldBuilder<T, A extends AbstractConfigListEntry> {
     @NotNull private final String fieldNameKey;
     @NotNull private final String resetButtonKey;

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/FloatFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.FloatListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class FloatFieldBuilder extends FieldBuilder<Float, FloatListEntry> {
     
     private Consumer<Float> saveConsumer = null;
     private Function<Float, Optional<String[]>> tooltipSupplier = f -> Optional.empty();
-    private float value;
+    private final float value;
     private Float min = null, max = null;
     
     public FloatFieldBuilder(String resetButtonKey, String fieldNameKey, float value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/FloatListBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.FloatListListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,12 +13,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class FloatListBuilder extends FieldBuilder<List<Float>, FloatListListEntry> {
     
     protected Function<Float, Optional<String>> cellErrorSupplier;
     private Consumer<List<Float>> saveConsumer = null;
     private Function<List<Float>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
-    private List<Float> value;
+    private final List<Float> value;
     private boolean expanded = false;
     private Float min = null, max = null;
     private Function<FloatListListEntry, FloatListListEntry.FloatListCell> createNewInstance;

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/IntFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.IntegerListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class IntFieldBuilder extends FieldBuilder<Integer, IntegerListEntry> {
     
     private Consumer<Integer> saveConsumer = null;
     private Function<Integer, Optional<String[]>> tooltipSupplier = i -> Optional.empty();
-    private int value;
+    private final int value;
     private Integer min = null, max = null;
     
     public IntFieldBuilder(String resetButtonKey, String fieldNameKey, int value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/IntListBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.IntegerListListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,12 +13,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class IntListBuilder extends FieldBuilder<List<Integer>, IntegerListListEntry> {
     
     protected Function<Integer, Optional<String>> cellErrorSupplier;
     private Consumer<List<Integer>> saveConsumer = null;
     private Function<List<Integer>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
-    private List<Integer> value;
+    private final List<Integer> value;
     private boolean expanded = false;
     private Integer min = null, max = null;
     private Function<IntegerListListEntry, IntegerListListEntry.IntegerListCell> createNewInstance;

+ 6 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/IntSliderBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.IntegerSliderEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,14 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class IntSliderBuilder extends FieldBuilder<Integer, IntegerSliderEntry> {
     
     private Consumer<Integer> saveConsumer = null;
     private Function<Integer, Optional<String[]>> tooltipSupplier = i -> Optional.empty();
-    private int value, max, min;
+    private final int value;
+    private int max;
+    private int min;
     private Function<Integer, String> textGetter = null;
     
     public IntSliderBuilder(String resetButtonKey, String fieldNameKey, int value, int min, int max) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/KeyCodeBuilder.java

@@ -3,6 +3,8 @@ package me.shedaniel.clothconfig2.impl.builders;
 import me.shedaniel.clothconfig2.api.Modifier;
 import me.shedaniel.clothconfig2.api.ModifierKeyCode;
 import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.util.InputUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -12,11 +14,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class KeyCodeBuilder extends FieldBuilder<ModifierKeyCode, KeyCodeEntry> {
     
     @Nullable private Consumer<ModifierKeyCode> saveConsumer = null;
     @NotNull private Function<ModifierKeyCode, Optional<String[]>> tooltipSupplier = bool -> Optional.empty();
-    private ModifierKeyCode value;
+    private final ModifierKeyCode value;
     private boolean allowKey = true, allowMouse = true, allowModifiers = true;
     
     public KeyCodeBuilder(String resetButtonKey, String fieldNameKey, ModifierKeyCode value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/LongFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.LongListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class LongFieldBuilder extends FieldBuilder<Long, LongListEntry> {
     
     private Consumer<Long> saveConsumer = null;
     private Function<Long, Optional<String[]>> tooltipSupplier = l -> Optional.empty();
-    private long value;
+    private final long value;
     private Long min = null, max = null;
     
     public LongFieldBuilder(String resetButtonKey, String fieldNameKey, long value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/LongListBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.LongListListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,12 +13,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class LongListBuilder extends FieldBuilder<List<Long>, LongListListEntry> {
     
     protected Function<Long, Optional<String>> cellErrorSupplier;
     private Consumer<List<Long>> saveConsumer = null;
     private Function<List<Long>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
-    private List<Long> value;
+    private final List<Long> value;
     private boolean expanded = false;
     private Long min = null, max = null;
     private Function<LongListListEntry, LongListListEntry.LongListCell> createNewInstance;

+ 6 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/LongSliderBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.LongSliderEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
@@ -8,11 +10,14 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class LongSliderBuilder extends FieldBuilder<Long, LongSliderEntry> {
     
     private Consumer<Long> saveConsumer = null;
     private Function<Long, Optional<String[]>> tooltipSupplier = l -> Optional.empty();
-    private long value, max, min;
+    private final long value;
+    private final long max;
+    private final long min;
     private Function<Long, String> textGetter = null;
     
     public LongSliderBuilder(String resetButtonKey, String fieldNameKey, long value, long min, long max) {

+ 5 - 2
src/main/java/me/shedaniel/clothconfig2/impl/builders/SelectorBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.SelectionListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
@@ -9,12 +11,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class SelectorBuilder<T> extends FieldBuilder<T, SelectionListEntry<T>> {
     
     private Consumer<T> saveConsumer = null;
     private Function<T, Optional<String[]>> tooltipSupplier = e -> Optional.empty();
-    private T value;
-    private T[] valuesArray;
+    private final T value;
+    private final T[] valuesArray;
     private Function<T, String> nameProvider = null;
     
     public SelectorBuilder(String resetButtonKey, String fieldNameKey, T[] valuesArray, T value) {

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/StringFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.StringListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
@@ -9,11 +11,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class StringFieldBuilder extends FieldBuilder<String, StringListEntry> {
     
     private Consumer<String> saveConsumer = null;
     private Function<String, Optional<String[]>> tooltipSupplier = str -> Optional.empty();
-    private String value;
+    private final String value;
     
     public StringFieldBuilder(String resetButtonKey, String fieldNameKey, String value) {
         super(resetButtonKey, fieldNameKey);

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/StringListBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.StringListListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.resource.language.I18n;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
@@ -11,12 +13,13 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class StringListBuilder extends FieldBuilder<List<String>, StringListListEntry> {
     
     private Function<String, Optional<String>> cellErrorSupplier;
     private Consumer<List<String>> saveConsumer = null;
     private Function<List<String>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
-    private List<String> value;
+    private final List<String> value;
     private boolean expanded = false;
     private Function<StringListListEntry, StringListListEntry.StringListCell> createNewInstance;
     private String addTooltip = I18n.translate("text.cloth-config.list.add"), removeTooltip = I18n.translate("text.cloth-config.list.remove");

+ 11 - 8
src/main/java/me/shedaniel/clothconfig2/impl/builders/SubCategoryBuilder.java

@@ -3,6 +3,8 @@ package me.shedaniel.clothconfig2.impl.builders;
 import com.google.common.collect.Lists;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.gui.entries.SubCategoryListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 
@@ -10,9 +12,10 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class SubCategoryBuilder extends FieldBuilder<Object, SubCategoryListEntry> implements List<AbstractConfigListEntry> {
     
-    private List<AbstractConfigListEntry> entries;
+    private final List<AbstractConfigListEntry> entries;
     private Function<List<AbstractConfigListEntry>, Optional<String[]>> tooltipSupplier = list -> Optional.empty();
     private boolean expanded = false;
     
@@ -81,7 +84,7 @@ public class SubCategoryBuilder extends FieldBuilder<Object, SubCategoryListEntr
     }
     
     @Override
-    public Iterator<AbstractConfigListEntry> iterator() {
+    public @NotNull Iterator<AbstractConfigListEntry> iterator() {
         return entries.iterator();
     }
     
@@ -106,17 +109,17 @@ public class SubCategoryBuilder extends FieldBuilder<Object, SubCategoryListEntr
     }
     
     @Override
-    public boolean containsAll(Collection<?> c) {
+    public boolean containsAll(@NotNull Collection<?> c) {
         return entries.containsAll(c);
     }
     
     @Override
-    public boolean addAll(Collection<? extends AbstractConfigListEntry> c) {
+    public boolean addAll(@NotNull Collection<? extends AbstractConfigListEntry> c) {
         return entries.addAll(c);
     }
     
     @Override
-    public boolean addAll(int index, Collection<? extends AbstractConfigListEntry> c) {
+    public boolean addAll(int index, @NotNull Collection<? extends AbstractConfigListEntry> c) {
         return entries.addAll(index, c);
     }
     
@@ -166,17 +169,17 @@ public class SubCategoryBuilder extends FieldBuilder<Object, SubCategoryListEntr
     }
     
     @Override
-    public ListIterator<AbstractConfigListEntry> listIterator() {
+    public @NotNull ListIterator<AbstractConfigListEntry> listIterator() {
         return entries.listIterator();
     }
     
     @Override
-    public ListIterator<AbstractConfigListEntry> listIterator(int index) {
+    public @NotNull ListIterator<AbstractConfigListEntry> listIterator(int index) {
         return entries.listIterator(index);
     }
     
     @Override
-    public List<AbstractConfigListEntry> subList(int fromIndex, int toIndex) {
+    public @NotNull List<AbstractConfigListEntry> subList(int fromIndex, int toIndex) {
         return entries.subList(fromIndex, toIndex);
     }
     

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/TextDescriptionBuilder.java

@@ -1,17 +1,20 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.TextListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.Optional;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class TextDescriptionBuilder extends FieldBuilder<String, TextListEntry> {
     
     private int color = -1;
     @Nullable private Supplier<Optional<String[]>> tooltipSupplier = null;
-    private String value;
+    private final String value;
     
     public TextDescriptionBuilder(String resetButtonKey, String fieldNameKey, String value) {
         super(resetButtonKey, fieldNameKey);

+ 4 - 1
src/main/java/me/shedaniel/clothconfig2/impl/builders/TextFieldBuilder.java

@@ -1,6 +1,8 @@
 package me.shedaniel.clothconfig2.impl.builders;
 
 import me.shedaniel.clothconfig2.gui.entries.StringListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
@@ -9,11 +11,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+@Environment(EnvType.CLIENT)
 public class TextFieldBuilder extends FieldBuilder<String, StringListEntry> {
     
     private Consumer<String> saveConsumer = null;
     private Function<String, Optional<String[]>> tooltipSupplier = str -> Optional.empty();
-    private String value;
+    private final String value;
     
     public TextFieldBuilder(String resetButtonKey, String fieldNameKey, String value) {
         super(resetButtonKey, fieldNameKey);

+ 3 - 0
src/main/java/me/shedaniel/math/impl/PointHelper.java

@@ -1,8 +1,11 @@
 package me.shedaniel.math.impl;
 
 import me.shedaniel.math.api.Point;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
 
+@Environment(EnvType.CLIENT)
 public class PointHelper {
     public static Point fromMouse() {
         MinecraftClient client = MinecraftClient.getInstance();

+ 0 - 1
src/main/resources/fabric.mod.json

@@ -14,7 +14,6 @@
   },
   "license": "Unlicense",
   "icon": "icon.png",
-  "environment": "client",
   "entrypoints": {
     "client": [
       "me.shedaniel.clothconfig2.ClothConfigInitializer"