From e3329c240023b55287ff6e3c5868b968cf9a0380 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:52:48 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Implement=20settings=20framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 3 - .../listeners/sees/TestEventListeners.java | 109 ------------ .../mixins/ClientPlayerEntityMixin.java | 5 + .../utilize/setting/KeyedSetting.java | 4 + .../utilize/setting/SettingManager.java | 167 ++++++++++++++++++ .../utilize/setting/base/SettingBase.java | 49 +++++ .../setting/interfaces/IBooleanSetting.java | 17 ++ .../setting/interfaces/IListSetting.java | 20 +++ .../setting/interfaces/INumberSetting.java | 12 ++ .../utilize/setting/interfaces/ISetting.java | 32 ++++ .../setting/interfaces/IStringSetting.java | 11 ++ .../setting/settings/BooleanSetting.java | 30 ++++ .../setting/settings/FloatSetting.java | 42 +++++ .../utilize/setting/settings/IntSetting.java | 42 +++++ .../utilize/setting/settings/ListSetting.java | 60 +++++++ .../setting/settings/StringSetting.java | 15 ++ 16 files changed, 506 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/listeners/sees/TestEventListeners.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/KeyedSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/SettingManager.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/IBooleanSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/IListSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/INumberSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/IStringSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/StringSetting.java diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index bb11606..aee3ef0 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -34,9 +34,6 @@ public void onInitializeClient() { if (!ClientUtils.isDevEnv()) return; LOGGER.info("Utilize is running in a development environment."); - -// Sees sees = Sees.getInstance(); -// sees.subscribe(new EventListeners()); } public static boolean shouldBlockSwingHandOnce() { diff --git a/src/main/java/nl/devpieter/utilize/listeners/sees/TestEventListeners.java b/src/main/java/nl/devpieter/utilize/listeners/sees/TestEventListeners.java deleted file mode 100644 index 013827a..0000000 --- a/src/main/java/nl/devpieter/utilize/listeners/sees/TestEventListeners.java +++ /dev/null @@ -1,109 +0,0 @@ -package nl.devpieter.utilize.listeners.sees; - -import nl.devpieter.sees.Annotations.EventListener; -import nl.devpieter.sees.Listener.Listener; -import nl.devpieter.utilize.events.interaction.AttackBlockEvent; -import nl.devpieter.utilize.events.inventory.TotemCountChangedEvent; -import nl.devpieter.utilize.events.inventory.TotemHoldingChangedEvent; - -public class TestEventListeners implements Listener { - -// @EventListener -// public void onSleepStateChanged(SleepStateChangedEvent event) { -// System.out.println("SleepStateChangedEvent " + event.previous() + " -> " + event.current()); -// } -// -// @EventListener -// public void onUpdateBlockBreakingProgress(UpdateBlockBreakingProgressEvent event) { -// System.out.println("UpdateBlockBreakingProgressEvent"); - - /// / event.cancel(); -// } -// - @EventListener - public void onAttackBlock(AttackBlockEvent event) { - System.out.println("AttackBlockEvent"); - event.cancel(); - } -// -// @EventListener -// public void onAttackEntity(AttackEntityEvent event) { -// System.out.println("AttackEntityEvent"); -//// event.cancel(); -// } -// -// @EventListener -// public void onBreakBlock(BreakBlockEvent event) { -// System.out.println("BreakBlockEvent"); -//// event.cancel(); -// } -// -// @EventListener -// public void onInteractBlock(InteractBlockEvent event) { -// System.out.println("InteractBlockEvent"); -//// event.cancel(); -// } -// -// @EventListener -// public void onInteractEntity(InteractEntityEvent event) { -// System.out.println("InteractEntityEvent"); -//// event.cancel(); -// } -// -// @EventListener -// public void onInteractItem(InteractItemEvent event) { -// System.out.println("InteractItemEvent"); - - /// / event.cancel(); -// } -// @EventListener -// public void onScreenChanged(ScreenChangedEvent event) { -// -// String previous = event.previous() == null ? "null" : event.previous().getTitle().getString(); -// String current = event.current() == null ? "null" : event.current().getTitle().getString(); -// -// System.out.println("ScreenChangedEvent " + previous + " -> " + current); -// } -// -// @EventListener -// public void onSlotClick1(SlotClickEvent event) { -// System.out.println("SlotClickEvent syncId: " + event.syncId() + " slotId: " + event.slotId() + " button: " + event.button() + " actionType: " + event.actionType()); -// -// if (event.slotId() != 45 || Screen.hasAltDown()) return; -// -// ItemStack offHandStack = event.player().getInventory().getStack(PlayerInventory.OFF_HAND_SLOT); -// if (offHandStack.isOf(Items.TOTEM_OF_UNDYING)) event.cancel(); -// -// ItemStack cursorStack = event.player().currentScreenHandler.getCursorStack(); -// if (!cursorStack.isOf(Items.TOTEM_OF_UNDYING)) event.cancel(); -// } -// -// @EventListener -// public void onSlotClick2(SlotClickEvent event) { -// -// // SlotClickEvent syncId: 0 slotId: 9 button: 0 actionType: QUICK_MOVE -// // SlotClickEvent syncId: 0 slotId: 21 button: 40 actionType: SWAP -// -// if (event.slotId() <= -999) return; -// if (event.actionType() != SlotActionType.QUICK_MOVE) return; -// -// int slot = event.slotId(); -// if (slot >= 36) slot -= 36; -// -// ItemStack cursorStack = event.player().getInventory().getStack(slot); -// if (!cursorStack.isOf(Items.TOTEM_OF_UNDYING)) return; -// -// event.cancel(); -// -// MinecraftClient.getInstance().interactionManager.clickSlot(event.syncId(), event.slotId(), PlayerInventory.OFF_HAND_SLOT, SlotActionType.SWAP, event.player()); -// } - @EventListener - public void onTotemCountChanged(TotemCountChangedEvent event) { - System.out.println("TotemCountChangedEvent " + event.previous() + " -> " + event.current()); - } - - @EventListener - public void onTotemHoldingChanged(TotemHoldingChangedEvent event) { - System.out.println("TotemHoldingChangedEvent mainHand: " + event.previousMainHand() + " -> " + event.currentMainHand() + " offhand: " + event.previousOffhand() + " -> " + event.currentOffhand()); - } -} diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index 3412fa6..b01970d 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -11,6 +11,7 @@ import nl.devpieter.utilize.managers.SleepManager; import nl.devpieter.utilize.managers.TaskManager; import nl.devpieter.utilize.managers.TotemManager; +import nl.devpieter.utilize.setting.SettingManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -20,6 +21,9 @@ @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { + @Unique + private final SettingManager settingManager = SettingManager.getInstance(); + @Unique private final Sees sees = Sees.getInstance(); @@ -41,6 +45,7 @@ public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { @Inject(at = @At("TAIL"), method = "tick") private void onTick(CallbackInfo ci) { + this.settingManager.tick(); this.damageManager.tick(this.getHealth()); this.sleepManager.tick(this.isSleeping(), this.getSleepTimer()); this.taskManager.tick(); diff --git a/src/main/java/nl/devpieter/utilize/setting/KeyedSetting.java b/src/main/java/nl/devpieter/utilize/setting/KeyedSetting.java new file mode 100644 index 0000000..2bf57e0 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/KeyedSetting.java @@ -0,0 +1,4 @@ +package nl.devpieter.utilize.setting; + +public record KeyedSetting(String key, T value) { +} diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java new file mode 100644 index 0000000..df8f60b --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -0,0 +1,167 @@ +package nl.devpieter.utilize.setting; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.reflect.TypeToken; +import nl.devpieter.utilize.Utilize; +import nl.devpieter.utilize.setting.interfaces.ISetting; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class SettingManager { + + private static SettingManager INSTANCE; + + private final Gson gson = new Gson(); + + private final Duration saveInterval = Duration.ofSeconds(15); + private final HashMap>> saveQueue = new HashMap<>(); + + private long lastSaveTime = 0; + private CompletableFuture saveFuture = null; + + private SettingManager() { + } + + public static SettingManager getInstance() { + if (INSTANCE == null) INSTANCE = new SettingManager(); + return INSTANCE; + } + + public void tick() { + if (this.saveQueue.isEmpty()) return; + + long currentTime = System.currentTimeMillis(); + if (currentTime - this.lastSaveTime < this.saveInterval.toMillis()) return; + + if (this.saveFuture != null && !this.saveFuture.isDone()) return; + + this.saveFuture = CompletableFuture.supplyAsync(() -> { + int files = this.saveQueue.size(); + int size = this.saveQueue.values().stream().mapToInt(List::size).sum(); + Utilize.LOGGER.info("Starting periodic 'setting batch save' for {} files and {} settings", files, size); + + for (String path : this.saveQueue.keySet()) { + File file = new File(path); + + if (this.saveBatchToFile(file, this.saveQueue.get(path))) continue; + Utilize.LOGGER.error("Failed to save settings batch to file: {}", file.getAbsolutePath()); + } + + this.lastSaveTime = currentTime; + this.saveQueue.clear(); + return true; + }); + } + + public boolean queueSave(File file, ISetting setting) { + String path = file.getAbsolutePath(); + KeyedSetting keyedSetting = setting.asKeyedSetting(); + + List> settingsList = this.saveQueue.getOrDefault(path, new ArrayList<>()); + settingsList.removeIf(s -> s.key().equals(keyedSetting.key())); + settingsList.add(keyedSetting); + + this.saveQueue.put(path, settingsList); + return true; + } + + public boolean queueSave(File file, List> settings) { + boolean success = true; + + for (ISetting setting : settings) { + if (!queueSave(file, setting)) success = false; + } + + return success; + } + + public void forceSaveQueue() { + if (this.saveQueue.isEmpty()) return; + + int files = this.saveQueue.size(); + int size = this.saveQueue.values().stream().mapToInt(List::size).sum(); + Utilize.LOGGER.info("Forced starting 'setting batch save' for {} files and {} settings", files, size); + + for (String path : this.saveQueue.keySet()) { + File file = new File(path); + + if (this.saveBatchToFile(file, this.saveQueue.get(path))) continue; + Utilize.LOGGER.error("Failed to force save settings batch to file: {}", file.getAbsolutePath()); + } + + this.saveQueue.clear(); + } + + public boolean loadSetting(File file, ISetting setting) { + List> batch = this.readBatchFromFile(file); + return loadSettingFromBatch(setting, batch); + } + + public boolean loadSettings(File file, List> settings) { + List> batch = this.readBatchFromFile(file); + for (ISetting setting : settings) loadSettingFromBatch(setting, batch); + + return true; + } + + private boolean loadSettingFromBatch(ISetting setting, List> batch) { + if (batch == null || batch.isEmpty()) { + setting.setValue(setting.getDefault()); + return true; + } + + for (KeyedSetting keyedSetting : batch) { + if (!keyedSetting.key().equals(setting.getIdentifier())) continue; + + JsonElement jsonElement = gson.toJsonTree(keyedSetting.value()); + T value = this.gson.fromJson(jsonElement, setting.getType()); + + setting.setValue(setting.shouldAllowNull() ? value : value != null ? value : setting.getDefault()); + return true; + } + + Utilize.LOGGER.warn("Failed to load setting: {} from batch", setting.getIdentifier()); + return false; + } + + private boolean saveBatchToFile(File file, List> settings) { + List> currentSettings = this.readBatchFromFile(file); + if (currentSettings == null) currentSettings = new ArrayList<>(); + + HashMap> settingsMap = new HashMap<>(); + for (KeyedSetting setting : currentSettings) { + settingsMap.put(setting.key(), setting); + } + + for (KeyedSetting setting : settings) { + settingsMap.put(setting.key(), setting); + } + + currentSettings = new ArrayList<>(settingsMap.values()); + + try (FileWriter writer = new FileWriter(file)) { + this.gson.toJson(currentSettings, writer); + return true; + } catch (IOException e) { + Utilize.LOGGER.error("Failed to save settings batch to file: {}", file.getAbsolutePath(), e); + return false; + } + } + + private @Nullable List> readBatchFromFile(File file) { + try (Reader reader = new FileReader(file)) { + return this.gson.fromJson(reader, new TypeToken>>() { + }.getType()); + } catch (IOException e) { + Utilize.LOGGER.error("Failed to read settings batch from file: {}", file.getAbsolutePath(), e); + return null; + } + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java new file mode 100644 index 0000000..b6b3936 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java @@ -0,0 +1,49 @@ +package nl.devpieter.utilize.setting.base; + +import nl.devpieter.utilize.setting.interfaces.ISetting; + +public abstract class SettingBase implements ISetting { + + private final String identifier; + private final T defaultValue; + + private final boolean allowNull; + + private T value; + + public SettingBase(String identifier, T defaultValue) { + this(identifier, defaultValue, false); + } + + public SettingBase(String identifier, T defaultValue, boolean allowNull) { + this.identifier = identifier; + this.defaultValue = defaultValue; + this.value = defaultValue; + this.allowNull = allowNull; + } + + @Override + public String getIdentifier() { + return identifier; + } + + @Override + public boolean shouldAllowNull() { + return allowNull; + } + + @Override + public T getValue() { + return value; + } + + @Override + public T getDefault() { + return defaultValue; + } + + @Override + public void setValue(T value) { + this.value = value; + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/IBooleanSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/IBooleanSetting.java new file mode 100644 index 0000000..0db22e5 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/IBooleanSetting.java @@ -0,0 +1,17 @@ +package nl.devpieter.utilize.setting.interfaces; + +import java.lang.reflect.Type; + +public interface IBooleanSetting extends ISetting { + + @Override + default Type getType() { + return Boolean.class; + } + + void toggle(); + + void setTrue(); + + void setFalse(); +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/IListSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/IListSetting.java new file mode 100644 index 0000000..38b013e --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/IListSetting.java @@ -0,0 +1,20 @@ +package nl.devpieter.utilize.setting.interfaces; + +import java.util.List; + +public interface IListSetting extends ISetting> { + + boolean contains(T value); + + void add(T value); + + void remove(T value); + + void removeAt(int index); + + void removeFirst(); + + void removeLast(); + + void clear(); +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/INumberSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/INumberSetting.java new file mode 100644 index 0000000..2e2fbe1 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/INumberSetting.java @@ -0,0 +1,12 @@ +package nl.devpieter.utilize.setting.interfaces; + +public interface INumberSetting extends ISetting { + + void increment(); + + void increment(T amount); + + void decrement(); + + void decrement(T amount); +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java new file mode 100644 index 0000000..7a45f1e --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java @@ -0,0 +1,32 @@ +package nl.devpieter.utilize.setting.interfaces; + +import nl.devpieter.utilize.setting.KeyedSetting; + +import java.lang.reflect.Type; + +public interface ISetting { + + Type getType(); + + String getIdentifier(); + + boolean shouldAllowNull(); + + T getValue(); + + T getDefault(); + + void setValue(T value); + + default void reset() { + this.setValue(this.getDefault()); + } + + default boolean isDefaultValueSet() { + return !this.getValue().equals(this.getDefault()); + } + + default KeyedSetting asKeyedSetting() { + return new KeyedSetting<>(this.getIdentifier(), this.getValue()); + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/IStringSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/IStringSetting.java new file mode 100644 index 0000000..4c04b67 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/IStringSetting.java @@ -0,0 +1,11 @@ +package nl.devpieter.utilize.setting.interfaces; + +import java.lang.reflect.Type; + +public interface IStringSetting extends ISetting { + + @Override + default Type getType() { + return String.class; + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java new file mode 100644 index 0000000..490f32f --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java @@ -0,0 +1,30 @@ +package nl.devpieter.utilize.setting.settings; + +import nl.devpieter.utilize.setting.base.SettingBase; +import nl.devpieter.utilize.setting.interfaces.IBooleanSetting; + +public class BooleanSetting extends SettingBase implements IBooleanSetting { + + public BooleanSetting(String identifier, Boolean defaultValue) { + super(identifier, defaultValue); + } + + public BooleanSetting(String identifier, Boolean defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } + + @Override + public void toggle() { + this.setValue(!this.getValue()); + } + + @Override + public void setTrue() { + this.setValue(true); + } + + @Override + public void setFalse() { + this.setValue(false); + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java new file mode 100644 index 0000000..bbaabc8 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java @@ -0,0 +1,42 @@ +package nl.devpieter.utilize.setting.settings; + +import nl.devpieter.utilize.setting.base.SettingBase; +import nl.devpieter.utilize.setting.interfaces.INumberSetting; + +import java.lang.reflect.Type; + +public class FloatSetting extends SettingBase implements INumberSetting { + + public FloatSetting(String identifier, Float defaultValue) { + super(identifier, defaultValue); + } + + public FloatSetting(String identifier, Float defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } + + @Override + public void increment() { + this.setValue(this.getValue() + 1.0F); + } + + @Override + public void increment(Float amount) { + this.setValue(this.getValue() + amount); + } + + @Override + public void decrement() { + this.setValue(this.getValue() - 1.0F); + } + + @Override + public void decrement(Float amount) { + this.setValue(this.getValue() - amount); + } + + @Override + public Type getType() { + return Float.class; + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java new file mode 100644 index 0000000..25d1fd8 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java @@ -0,0 +1,42 @@ +package nl.devpieter.utilize.setting.settings; + +import nl.devpieter.utilize.setting.base.SettingBase; +import nl.devpieter.utilize.setting.interfaces.INumberSetting; + +import java.lang.reflect.Type; + +public class IntSetting extends SettingBase implements INumberSetting { + + public IntSetting(String identifier, Integer defaultValue) { + super(identifier, defaultValue); + } + + public IntSetting(String identifier, Integer defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } + + @Override + public void increment() { + this.setValue(this.getValue() + 1); + } + + @Override + public void increment(Integer amount) { + this.setValue(this.getValue() + amount); + } + + @Override + public void decrement() { + this.setValue(this.getValue() - 1); + } + + @Override + public void decrement(Integer amount) { + this.setValue(this.getValue() - amount); + } + + @Override + public Type getType() { + return Integer.class; + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java new file mode 100644 index 0000000..5bb5f3e --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java @@ -0,0 +1,60 @@ +package nl.devpieter.utilize.setting.settings; + +import com.google.common.reflect.TypeToken; +import nl.devpieter.utilize.setting.base.SettingBase; +import nl.devpieter.utilize.setting.interfaces.IListSetting; + +import java.lang.reflect.Type; +import java.util.List; + +public class ListSetting extends SettingBase> implements IListSetting { + + public ListSetting(String identifier, List defaultValue) { + super(identifier, defaultValue); + } + + public ListSetting(String identifier, List defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } + + @Override + public boolean contains(T value) { + return this.getValue().contains(value); + } + + @Override + public void add(T value) { + this.getValue().add(value); + } + + @Override + public void remove(T value) { + this.getValue().remove(value); + } + + @Override + public void removeAt(int index) { + this.getValue().remove(index); + } + + @Override + public void removeFirst() { + this.getValue().removeFirst(); + } + + @Override + public void removeLast() { + this.getValue().removeLast(); + } + + @Override + public void clear() { + this.getValue().clear(); + } + + @Override + public Type getType() { + return new TypeToken>() { + }.getType(); + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/StringSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/StringSetting.java new file mode 100644 index 0000000..c50f6c9 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/StringSetting.java @@ -0,0 +1,15 @@ +package nl.devpieter.utilize.setting.settings; + +import nl.devpieter.utilize.setting.base.SettingBase; +import nl.devpieter.utilize.setting.interfaces.IStringSetting; + +public class StringSetting extends SettingBase implements IStringSetting { + + public StringSetting(String identifier, String defaultValue) { + super(identifier, defaultValue); + } + + public StringSetting(String identifier, String defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } +}