From 1629a2e4d8386053c7dbe6c5d3bf3829e695ef76 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:26:59 +0200 Subject: [PATCH 01/41] =?UTF-8?q?=F0=9F=94=A7=20Enhance=20null=20safety=20?= =?UTF-8?q?and=20add=20utility=20methods=20in=20settings=20and=20utils=20c?= =?UTF-8?q?lasses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../utilize/mixins/ChatHudMixin.java | 1 - .../utilize/setting/SettingManager.java | 24 ++++++++-------- .../utilize/setting/base/SettingBase.java | 13 +++++---- .../setting/settings/BooleanSetting.java | 6 ++-- .../setting/settings/FloatSetting.java | 24 ++++++++++++---- .../utilize/setting/settings/IntSetting.java | 24 ++++++++++++---- .../utilize/setting/settings/ListSetting.java | 13 +++++++++ .../utilize/utils/EnchantmentUtils.java | 11 ++++---- .../utilize/utils/InventoryUtils.java | 16 +++++++---- .../devpieter/utilize/utils/NetworkUtils.java | 7 +++-- .../devpieter/utilize/utils/PlayerUtils.java | 3 +- .../devpieter/utilize/utils/WorldUtils.java | 17 +++++++---- .../utilize/utils/common/FileUtils.java | 28 +++++++++++++++++++ 14 files changed, 134 insertions(+), 55 deletions(-) create mode 100644 src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java diff --git a/gradle.properties b/gradle.properties index 2302d6d..70aa46c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ loader_version=0.16.10 # Mod Properties artifact_id=utilize -mod_version=1.0.10 +mod_version=1.0.11 maven_group=nl.devpieter archives_base_name=Utilize diff --git a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java index bf481b4..c6f2b78 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java @@ -37,7 +37,6 @@ public abstract class ChatHudMixin { @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", cancellable = true) public void onAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, CallbackInfo ci) { - ReceiveMessageEvent event = new ReceiveMessageEvent(message); Text result = this.sees.callWithResult(event); diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index df8f60b..50f48b6 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -5,6 +5,7 @@ import com.google.gson.reflect.TypeToken; import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.setting.interfaces.ISetting; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; @@ -60,7 +61,7 @@ public void tick() { }); } - public boolean queueSave(File file, ISetting setting) { + public boolean queueSave(@NotNull File file, @NotNull ISetting setting) { String path = file.getAbsolutePath(); KeyedSetting keyedSetting = setting.asKeyedSetting(); @@ -72,11 +73,11 @@ public boolean queueSave(File file, ISetting setting) { return true; } - public boolean queueSave(File file, List> settings) { + public boolean queueSave(@NotNull File file, @NotNull List> settings) { boolean success = true; for (ISetting setting : settings) { - if (!queueSave(file, setting)) success = false; + if (!this.queueSave(file, setting)) success = false; } return success; @@ -99,19 +100,18 @@ public void forceSaveQueue() { this.saveQueue.clear(); } - public boolean loadSetting(File file, ISetting setting) { + public boolean loadSetting(@NotNull File file, @NotNull ISetting setting) { List> batch = this.readBatchFromFile(file); - return loadSettingFromBatch(setting, batch); + return this.loadSettingFromBatch(setting, batch); } - public boolean loadSettings(File file, List> settings) { + public boolean loadSettings(@NotNull File file, @NotNull List> settings) { List> batch = this.readBatchFromFile(file); - for (ISetting setting : settings) loadSettingFromBatch(setting, batch); - + for (ISetting setting : settings) this.loadSettingFromBatch(setting, batch); return true; } - private boolean loadSettingFromBatch(ISetting setting, List> batch) { + private boolean loadSettingFromBatch(@NotNull ISetting setting, @Nullable List> batch) { if (batch == null || batch.isEmpty()) { setting.setValue(setting.getDefault()); return true; @@ -120,7 +120,7 @@ private boolean loadSettingFromBatch(ISetting setting, List keyedSetting : batch) { if (!keyedSetting.key().equals(setting.getIdentifier())) continue; - JsonElement jsonElement = gson.toJsonTree(keyedSetting.value()); + JsonElement jsonElement = this.gson.toJsonTree(keyedSetting.value()); T value = this.gson.fromJson(jsonElement, setting.getType()); setting.setValue(setting.shouldAllowNull() ? value : value != null ? value : setting.getDefault()); @@ -131,7 +131,7 @@ private boolean loadSettingFromBatch(ISetting setting, List> settings) { + private boolean saveBatchToFile(@NotNull File file, @NotNull List> settings) { List> currentSettings = this.readBatchFromFile(file); if (currentSettings == null) currentSettings = new ArrayList<>(); @@ -155,7 +155,7 @@ private boolean saveBatchToFile(File file, List> settings) { } } - private @Nullable List> readBatchFromFile(File file) { + private @Nullable List> readBatchFromFile(@NotNull File file) { try (Reader reader = new FileReader(file)) { return this.gson.fromJson(reader, new TypeToken>>() { }.getType()); diff --git a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java index b6b3936..08c4705 100644 --- a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java +++ b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java @@ -1,6 +1,7 @@ package nl.devpieter.utilize.setting.base; import nl.devpieter.utilize.setting.interfaces.ISetting; +import org.jetbrains.annotations.NotNull; public abstract class SettingBase implements ISetting { @@ -11,11 +12,11 @@ public abstract class SettingBase implements ISetting { private T value; - public SettingBase(String identifier, T defaultValue) { + public SettingBase(@NotNull String identifier, T defaultValue) { this(identifier, defaultValue, false); } - public SettingBase(String identifier, T defaultValue, boolean allowNull) { + public SettingBase(@NotNull String identifier, T defaultValue, boolean allowNull) { this.identifier = identifier; this.defaultValue = defaultValue; this.value = defaultValue; @@ -24,22 +25,22 @@ public SettingBase(String identifier, T defaultValue, boolean allowNull) { @Override public String getIdentifier() { - return identifier; + return this.identifier; } @Override public boolean shouldAllowNull() { - return allowNull; + return this.allowNull; } @Override public T getValue() { - return value; + return this.value; } @Override public T getDefault() { - return defaultValue; + return this.defaultValue; } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java index 490f32f..7f3a287 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java @@ -2,19 +2,21 @@ import nl.devpieter.utilize.setting.base.SettingBase; import nl.devpieter.utilize.setting.interfaces.IBooleanSetting; +import org.jetbrains.annotations.NotNull; public class BooleanSetting extends SettingBase implements IBooleanSetting { - public BooleanSetting(String identifier, Boolean defaultValue) { + public BooleanSetting(@NotNull String identifier, Boolean defaultValue) { super(identifier, defaultValue); } - public BooleanSetting(String identifier, Boolean defaultValue, boolean allowNull) { + public BooleanSetting(@NotNull String identifier, Boolean defaultValue, boolean allowNull) { super(identifier, defaultValue, allowNull); } @Override public void toggle() { + if (this.getValue() == null) throw new IllegalStateException("Cannot toggle a null value. Use setValue() instead."); this.setValue(!this.getValue()); } diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java index bbaabc8..0a67876 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java @@ -2,37 +2,49 @@ import nl.devpieter.utilize.setting.base.SettingBase; import nl.devpieter.utilize.setting.interfaces.INumberSetting; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.Type; public class FloatSetting extends SettingBase implements INumberSetting { - public FloatSetting(String identifier, Float defaultValue) { + public FloatSetting(@NotNull String identifier, Float defaultValue) { super(identifier, defaultValue); } - public FloatSetting(String identifier, Float defaultValue, boolean allowNull) { + public FloatSetting(@NotNull String identifier, Float defaultValue, boolean allowNull) { super(identifier, defaultValue, allowNull); } @Override public void increment() { + if (this.getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); this.setValue(this.getValue() + 1.0F); } @Override - public void increment(Float amount) { - this.setValue(this.getValue() + amount); + public void increment(@Nullable Float amount) { + if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + + if (amount == null) this.setValue(0.0F); + else if (this.getValue() == null) this.setValue(amount); + else this.setValue(this.getValue() + amount); } @Override public void decrement() { + if (this.getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); this.setValue(this.getValue() - 1.0F); } @Override - public void decrement(Float amount) { - this.setValue(this.getValue() - amount); + public void decrement(@Nullable Float amount) { + if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + + if (amount == null) this.setValue(0.0F); + else if (this.getValue() == null) this.setValue(-amount); + else this.setValue(this.getValue() - amount); } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java index 25d1fd8..e23e8af 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java @@ -2,37 +2,49 @@ import nl.devpieter.utilize.setting.base.SettingBase; import nl.devpieter.utilize.setting.interfaces.INumberSetting; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.Type; public class IntSetting extends SettingBase implements INumberSetting { - public IntSetting(String identifier, Integer defaultValue) { + public IntSetting(@NotNull String identifier, Integer defaultValue) { super(identifier, defaultValue); } - public IntSetting(String identifier, Integer defaultValue, boolean allowNull) { + public IntSetting(@NotNull String identifier, Integer defaultValue, boolean allowNull) { super(identifier, defaultValue, allowNull); } @Override public void increment() { + if (this.getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); this.setValue(this.getValue() + 1); } @Override - public void increment(Integer amount) { - this.setValue(this.getValue() + amount); + public void increment(@Nullable Integer amount) { + if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + + if (amount == null) this.setValue(0); + else if (this.getValue() == null) this.setValue(amount); + else this.setValue(this.getValue() + amount); } @Override public void decrement() { + if (this.getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); this.setValue(this.getValue() - 1); } @Override - public void decrement(Integer amount) { - this.setValue(this.getValue() - amount); + public void decrement(@Nullable Integer amount) { + if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + + if (amount == null) this.setValue(0); + else if (this.getValue() == null) this.setValue(-amount); + else this.setValue(this.getValue() - amount); } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java index 5bb5f3e..1e93924 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java @@ -19,36 +19,49 @@ public ListSetting(String identifier, List defaultValue, boolean allowNull) { @Override public boolean contains(T value) { + if (this.getValue() == null) return false; return this.getValue().contains(value); } @Override public void add(T value) { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot add element."); this.getValue().add(value); } @Override public void remove(T value) { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove element."); this.getValue().remove(value); } @Override public void removeAt(int index) { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove element at index."); + if (index < 0 || index >= this.getValue().size()) throw new IndexOutOfBoundsException("Index out of bounds for list."); + this.getValue().remove(index); } @Override public void removeFirst() { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove first element."); + if (this.getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove first element."); + this.getValue().removeFirst(); } @Override public void removeLast() { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove last element."); + if (this.getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove last element."); + this.getValue().removeLast(); } @Override public void clear() { + if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot clear."); this.getValue().clear(); } diff --git a/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java b/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java index b506751..7d1d56d 100644 --- a/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java @@ -8,6 +8,7 @@ import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.EnchantmentTags; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -29,21 +30,21 @@ public static boolean hasEnchantments(ItemStack stack) { return EnchantmentHelper.hasEnchantments(stack); } - public static boolean hasEnchantment(ItemStack stack, RegistryEntry enchantment) { - if (!hasEnchantments(stack)) return false; + public static boolean hasEnchantment(@Nullable ItemStack stack, @NotNull RegistryEntry enchantment) { + if (stack == null || !hasEnchantments(stack)) return false; Set> enchantments = getEnchantments(stack); return enchantments.stream().anyMatch(entry -> entry == enchantment); } - public static boolean hasEnchantment(ItemStack stack, RegistryKey enchantment) { - if (!hasEnchantments(stack)) return false; + public static boolean hasEnchantment(@Nullable ItemStack stack, @NotNull RegistryKey enchantment) { + if (stack == null || !hasEnchantments(stack)) return false; Set> enchantments = getEnchantments(stack); return enchantments.stream().anyMatch(entry -> entry.matchesKey(enchantment)); } - public static void forEachEnchantment(ItemStack stack, Consumer consumer) { + public static void forEachEnchantment(@NotNull ItemStack stack, @NotNull Consumer consumer) { ItemEnchantmentsComponent component = getComponent(stack); Set> enchantments = getEnchantments(stack); diff --git a/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java b/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java index ba2cde7..e5f5137 100644 --- a/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java @@ -24,7 +24,9 @@ public static boolean hasInventory() { return ClientUtils.getPlayer().getInventory(); } - public static boolean isMainHandOf(Item item) { + public static boolean isMainHandOf(@Nullable Item item) { + if (item == null || !hasInventory()) return false; + ItemStack mainHand = getMainHand(); return mainHand != null && mainHand.isOf(item); } @@ -34,7 +36,9 @@ public static boolean isMainHandOf(Item item) { return ClientUtils.getPlayer().getMainHandStack(); } - public static boolean isOffhandOf(Item item) { + public static boolean isOffhandOf(@Nullable Item item) { + if (item == null || !hasInventory()) return false; + ItemStack offhand = getOffhand(); return offhand != null && offhand.isOf(item); } @@ -64,8 +68,8 @@ public static int getSelectedHotbarSlot() { //#endif } - public static @NotNull List findHotbarSlots(Item item) { - if (!hasInventory() || item == null) return new ArrayList<>(); + public static @NotNull List findHotbarSlots(@Nullable Item item) { + if (item == null || !hasInventory()) return new ArrayList<>(); PlayerInventory inventory = getInventory(); List slots = new ArrayList<>(); @@ -78,8 +82,8 @@ public static int getSelectedHotbarSlot() { return slots; } - public static int countItem(Item item) { - if (!hasInventory() || item == null) return 0; + public static int countItem(@Nullable Item item) { + if (item == null || !hasInventory()) return -1; PlayerInventory inventory = getInventory(); int count = 0; diff --git a/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java b/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java index 5314008..cbf3554 100644 --- a/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java @@ -1,22 +1,23 @@ package nl.devpieter.utilize.utils; import net.minecraft.network.packet.Packet; +import org.jetbrains.annotations.NotNull; public class NetworkUtils { - public static void sendPacket(Packet packet) { + public static void sendPacket(@NotNull Packet packet) { if (!ClientUtils.hasNetworkHandler()) return; ClientUtils.getNetworkHandler().sendPacket(packet); } - public static void sendChatMessage(String message) { + public static void sendChatMessage(@NotNull String message) { if (!ClientUtils.hasNetworkHandler()) return; if (message.startsWith("/")) sendChatCommand(message); else ClientUtils.getNetworkHandler().sendChatMessage(message); } - public static void sendChatCommand(String command) { + public static void sendChatCommand(@NotNull String command) { if (!ClientUtils.hasNetworkHandler()) return; if (command.startsWith("/")) command = command.substring(1); diff --git a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java b/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java index 73f1d97..fd61145 100644 --- a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java @@ -5,11 +5,12 @@ import net.minecraft.text.Text; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PlayerUtils { - public static void sendMessage(Text message, boolean overlay) { + public static void sendMessage(@NotNull Text message, boolean overlay) { if (!ClientUtils.hasPlayer()) return; ClientUtils.getPlayer().sendMessage(message, overlay); } diff --git a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java index 64ec74c..256defa 100644 --- a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java @@ -10,6 +10,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -17,28 +18,28 @@ public class WorldUtils { - public static @Nullable BlockState getStateAt(Vec3d vec3d) { + public static @Nullable BlockState getStateAt(@NotNull Vec3d vec3d) { return getStateAt(MathUtils.from(vec3d)); } - public static @Nullable BlockState getStateAt(Vec3i vec3i) { + public static @Nullable BlockState getStateAt(@NotNull Vec3i vec3i) { return getStateAt(new BlockPos(vec3i)); } - public static @Nullable BlockState getStateAt(BlockPos pos) { + public static @Nullable BlockState getStateAt(@NotNull BlockPos pos) { if (!ClientUtils.hasWorld()) return null; return ClientUtils.getWorld().getBlockState(pos); } - public static @Nullable Block getBlockAt(Vec3d vec3d) { + public static @Nullable Block getBlockAt(@NotNull Vec3d vec3d) { return getBlockAt(MathUtils.from(vec3d)); } - public static @Nullable Block getBlockAt(Vec3i vec3i) { + public static @Nullable Block getBlockAt(@NotNull Vec3i vec3i) { return getBlockAt(new BlockPos(vec3i)); } - public static @Nullable Block getBlockAt(BlockPos pos) { + public static @Nullable Block getBlockAt(@NotNull BlockPos pos) { BlockState state = getStateAt(pos); if (state == null) return null; @@ -50,6 +51,7 @@ public class WorldUtils { return ClientUtils.getWorld().getEntityById(id); } + @Deprecated(since = "1.0.11", forRemoval = true) public static List getNearbyPlayers(float distance) { if (!ClientUtils.hasPlayer() || !ClientUtils.hasWorld()) return new ArrayList<>(); @@ -64,10 +66,12 @@ public static List getNearbyPlayers(float distance) { ).toList(); } + @Deprecated(since = "1.0.11", forRemoval = true) public static boolean arePlayersNearby(float distance) { return !getNearbyPlayers(distance).isEmpty(); } + @Deprecated(since = "1.0.11", forRemoval = true) public static List getNearbyMobs(float distance) { if (!ClientUtils.hasPlayer() || !ClientUtils.hasWorld()) return new ArrayList<>(); @@ -77,6 +81,7 @@ public static List getNearbyMobs(float distance) { return world.getEntitiesByClass(MobEntity.class, clientPlayer.getBoundingBox().expand(distance), LivingEntity::isAlive); } + @Deprecated(since = "1.0.11", forRemoval = true) public static boolean areMobsNearby(float distance) { return !getNearbyMobs(distance).isEmpty(); } diff --git a/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java new file mode 100644 index 0000000..5e4c640 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java @@ -0,0 +1,28 @@ +package nl.devpieter.utilize.utils.common; + +import java.io.File; + +public class FileUtils { + + public static boolean tryCreateDirectories(File file) { + try { + File parentDir = file.getParentFile(); + if (parentDir.exists()) return true; + + return parentDir.mkdirs(); + } catch (Exception e) { + return false; + } + } + + public static boolean tryCreateFile(File file) { + try { + if (file.exists()) return true; + if (!tryCreateDirectories(file)) return false; + + return file.createNewFile(); + } catch (Exception e) { + return false; + } + } +} From b842d4e0bbc4af94cbac0adb42b864310230dddb Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sat, 12 Jul 2025 17:23:02 +0200 Subject: [PATCH 02/41] =?UTF-8?q?=F0=9F=93=A6=20Add=20new=20block=20intera?= =?UTF-8?q?ction=20events,=20refactor=20existing=20events,=20cleanup,=20an?= =?UTF-8?q?d=20update=20Sees=20(W.I.P)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 19 ++++-- gradle.properties | 2 +- .../events/chat/ReceiveMessageEvent.java | 34 +---------- .../events/interaction/AttackBlockEvent.java | 52 ---------------- .../events/interaction/AttackEntityEvent.java | 40 +----------- .../events/interaction/BreakBlockEvent.java | 17 ------ .../interaction/InteractBlockEvent.java | 37 ----------- .../interaction/InteractEntityEvent.java | 17 +----- .../events/interaction/InteractItemEvent.java | 16 +---- .../UpdateBlockBreakingProgressEvent.java | 4 +- .../interaction/block/AttackBlockEvent.java | 28 +++++++++ .../block/AttackBlockReturnEvent.java | 36 +++++++++++ .../block/AttackBlockTailEvent.java | 8 +++ .../interaction/block/BreakBlockEvent.java | 21 +++++++ .../block/BreakBlockReturnEvent.java | 30 +++++++++ .../block/BreakBlockTailEvent.java | 7 +++ .../interaction/block/InteractBlockEvent.java | 28 +++++++++ .../block/InteractBlockReturnEvent.java | 37 +++++++++++ .../block/InteractBlockTailEvent.java | 8 +++ .../keybinding/AttackKeyPressedEvent.java | 6 ++ .../keybinding/UseKeyPressedEvent.java | 6 ++ .../inventory/HotbarSlotChangedEvent.java | 4 +- .../events/inventory/SlotClickEvent.java | 19 +----- .../inventory/TotemCountChangedEvent.java | 4 +- .../inventory/TotemHoldingChangedEvent.java | 4 +- .../packet/ProfessionChangedPacketEvent.java | 4 +- .../packet/ScreenOpenedPacketEvent.java | 4 +- .../packet/TradesOfferedPacketEvent.java | 4 +- .../events/player/PlayerDamagedEvent.java | 4 +- .../events/player/PlayerHealedEvent.java | 4 +- .../events/player/SleepStateChangedEvent.java | 4 +- .../events/screen/ScreenChangedEvent.java | 4 +- .../utilize/events/sound/PlaySoundEvent.java | 18 ------ .../utilize/events/tick/ClientTickEvent.java | 4 +- .../EntityTrackerUpdatePacketListener.java | 2 +- .../packet/OpenScreenPacketListener.java | 2 +- .../packet/SetTradeOffersPacketListener.java | 2 +- .../utilize/managers/DamageManager.java | 4 +- .../utilize/managers/SleepManager.java | 2 +- .../utilize/managers/TotemManager.java | 4 +- .../utilize/mixins/ChatHudMixin.java | 5 +- .../mixins/ClientPlayerEntityMixin.java | 9 ++- .../ClientPlayerInteractionManagerMixin.java | 60 +++++++++++++----- .../utilize/mixins/KeyBindingMixin.java | 61 +++++++++++++++++++ .../utilize/mixins/MinecraftClientMixin.java | 2 +- .../devpieter/utilize/utils/ClientUtils.java | 12 ---- .../devpieter/utilize/utils/PlayerUtils.java | 9 +++ src/main/resources/utilize.mixins.json | 1 + 48 files changed, 400 insertions(+), 309 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/AttackBlockEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/BreakBlockEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/InteractBlockEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockTailEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockTailEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockTailEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/keybinding/AttackKeyPressedEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/keybinding/UseKeyPressedEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/sound/PlaySoundEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java diff --git a/build.gradle b/build.gradle index afc366a..855e0e0 100644 --- a/build.gradle +++ b/build.gradle @@ -14,9 +14,18 @@ archivesBaseName = archives_base_name version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-${hash}-SNAPSHOT" : "") repositories { - maven { - name = "pietrSpaceRepositoryReleases" - url = uri("https://maven.pietr.space/releases") + repositories { + maven { + name "Pietr Space Releases" + url "https://maven.pietr.space/releases" + } + } + + repositories { + maven { + name "Pietr Space Snapshots" + url "https://maven.pietr.space/snapshots" + } } } @@ -27,8 +36,8 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - implementation "nl.devpieter:sees:1.1.0" - include "nl.devpieter:sees:1.1.0" + implementation "nl.devpieter:sees:1.2.0-dd2c322-SNAPSHOT" + include "nl.devpieter:sees:1.2.0-dd2c322-SNAPSHOT" } preprocess { diff --git a/gradle.properties b/gradle.properties index 2302d6d..d751d28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ loader_version=0.16.10 # Mod Properties artifact_id=utilize -mod_version=1.0.10 +mod_version=1.1.0 maven_group=nl.devpieter archives_base_name=Utilize diff --git a/src/main/java/nl/devpieter/utilize/events/chat/ReceiveMessageEvent.java b/src/main/java/nl/devpieter/utilize/events/chat/ReceiveMessageEvent.java index a0cb52f..a4f2590 100644 --- a/src/main/java/nl/devpieter/utilize/events/chat/ReceiveMessageEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/chat/ReceiveMessageEvent.java @@ -1,55 +1,27 @@ package nl.devpieter.utilize.events.chat; import net.minecraft.text.Text; -import nl.devpieter.sees.Event.CancelableEventBase; -import nl.devpieter.sees.Event.ReturnableEvent; +import nl.devpieter.sees.event.SCancelableEventBase; +import nl.devpieter.sees.event.SReturnableEvent; -/** - * Event fired when a chat message ({@link Text}) is received by the client. - *

- * This event is cancelable and allows modification of the message before display. - */ -public class ReceiveMessageEvent extends CancelableEventBase implements ReturnableEvent { +public class ReceiveMessageEvent extends SCancelableEventBase implements SReturnableEvent { - /** - * The chat message, which may be modified by event listeners. - */ private Text message; - /** - * Constructs a new ReceiveMessageEvent with the given message. - * - * @param message The received chat message. - */ public ReceiveMessageEvent(Text message) { this.message = message; } - /** - * Gets the current message result. - * - * @return The current chat message. - */ @Override public Text getResult() { return this.message; } - /** - * Sets the message result. - * - * @param message The new chat message to set. - */ @Override public void setResult(Text message) { this.message = message; } - /** - * Alias for {@link #getResult()}. - * - * @return The chat message. - */ public Text message() { return this.message; } diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/AttackBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/AttackBlockEvent.java deleted file mode 100644 index bd1e6c8..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/AttackBlockEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package nl.devpieter.utilize.events.interaction; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import nl.devpieter.sees.Event.CancelableEventBase; - -/** - * Event fired when a block is attacked by the player. - *

- * This event is cancelable. - */ -public class AttackBlockEvent extends CancelableEventBase { - - /** - * The position of the block being attacked. - */ - private final BlockPos blockPos; - - /** - * The direction from which the block is attacked. - */ - private final Direction direction; - - /** - * Constructs a new AttackBlockEvent with the specified block position and direction. - * - * @param blockPos The position of the block being attacked. - * @param direction The direction from which the block is attacked. - */ - public AttackBlockEvent(BlockPos blockPos, Direction direction) { - this.blockPos = blockPos; - this.direction = direction; - } - - /** - * Gets the position of the block being attacked. - * - * @return The position of the block. - */ - public BlockPos blockPos() { - return blockPos; - } - - /** - * Gets the direction from which the block is attacked. - * - * @return The direction of the attack. - */ - public Direction direction() { - return direction; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java index 78a19d0..2c25d4e 100644 --- a/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java @@ -1,52 +1,16 @@ package nl.devpieter.utilize.events.interaction; -import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -/** - * Event fired when an entity is attacked by the player. - *

- * This event is cancelable. - */ -public class AttackEntityEvent extends CancelableEventBase { +public class AttackEntityEvent extends SCancelableEventBase { - /** - * The entity being attacked. - */ private final Entity target; - /** - * Constructs a new AttackEntityEvent with the specified player and target entity. - * - * @param player The player who is attacking the entity. - * @param target The entity being attacked. - */ - @Deprecated(since = "1.0.9", forRemoval = true) - public AttackEntityEvent(PlayerEntity player, Entity target) { - this.target = target; - } - - /** - * Constructs a new AttackEntityEvent with the specified target entity. - * - * @param target The entity being attacked. - */ public AttackEntityEvent(Entity target) { this.target = target; } - @Deprecated(since = "1.0.9", forRemoval = true) - public PlayerEntity player() { - return MinecraftClient.getInstance().player; - } - - /** - * Gets the entity being attacked. - * - * @return The target entity. - */ public Entity target() { return target; } diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/BreakBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/BreakBlockEvent.java deleted file mode 100644 index 95e4dc4..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/BreakBlockEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.devpieter.utilize.events.interaction; - -import net.minecraft.util.math.BlockPos; -import nl.devpieter.sees.Event.CancelableEventBase; - -public class BreakBlockEvent extends CancelableEventBase { - - private final BlockPos blockPos; - - public BreakBlockEvent(BlockPos blockPos) { - this.blockPos = blockPos; - } - - public BlockPos blockPos() { - return blockPos; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/InteractBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/InteractBlockEvent.java deleted file mode 100644 index 85ec22d..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractBlockEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package nl.devpieter.utilize.events.interaction; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import nl.devpieter.sees.Event.CancelableEventBase; - -public class InteractBlockEvent extends CancelableEventBase { - - private final Hand hand; - private final BlockHitResult hitResult; - - @Deprecated(since = "1.0.9", forRemoval = true) - public InteractBlockEvent(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult) { - this.hand = hand; - this.hitResult = hitResult; - } - - public InteractBlockEvent(Hand hand, BlockHitResult hitResult) { - this.hand = hand; - this.hitResult = hitResult; - } - - @Deprecated(since = "1.0.9", forRemoval = true) - public ClientPlayerEntity player() { - return MinecraftClient.getInstance().player; - } - - public Hand hand() { - return hand; - } - - public BlockHitResult hitResult() { - return hitResult; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java index 130c73d..5b57904 100644 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java @@ -1,32 +1,19 @@ package nl.devpieter.utilize.events.interaction; -import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Hand; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class InteractEntityEvent extends CancelableEventBase { +public class InteractEntityEvent extends SCancelableEventBase { private final Entity target; private final Hand hand; - @Deprecated(since = "1.0.9", forRemoval = true) - public InteractEntityEvent(PlayerEntity player, Entity target, Hand hand) { - this.target = target; - this.hand = hand; - } - public InteractEntityEvent(Entity target, Hand hand) { this.target = target; this.hand = hand; } - @Deprecated(since = "1.0.9", forRemoval = true) - public PlayerEntity player() { - return MinecraftClient.getInstance().player; - } - public Entity target() { return target; } diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java index 8e9c571..2ba9706 100644 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java @@ -1,28 +1,16 @@ package nl.devpieter.utilize.events.interaction; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Hand; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class InteractItemEvent extends CancelableEventBase { +public class InteractItemEvent extends SCancelableEventBase { private final Hand hand; - @Deprecated(since = "1.0.9", forRemoval = true) - public InteractItemEvent(PlayerEntity player, Hand hand) { - this.hand = hand; - } - public InteractItemEvent(Hand hand) { this.hand = hand; } - @Deprecated(since = "1.0.9", forRemoval = true) - public PlayerEntity player() { - return MinecraftClient.getInstance().player; - } - public Hand hand() { return hand; } diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/UpdateBlockBreakingProgressEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/UpdateBlockBreakingProgressEvent.java index 1c43489..92df5c9 100644 --- a/src/main/java/nl/devpieter/utilize/events/interaction/UpdateBlockBreakingProgressEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/interaction/UpdateBlockBreakingProgressEvent.java @@ -2,9 +2,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class UpdateBlockBreakingProgressEvent extends CancelableEventBase { +public class UpdateBlockBreakingProgressEvent extends SCancelableEventBase { private final BlockPos blockPos; private final Direction direction; diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockEvent.java new file mode 100644 index 0000000..955ef68 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockEvent.java @@ -0,0 +1,28 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import nl.devpieter.sees.event.SCancelableEventBase; + +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.AttackKeyPressedEvent} to directly cancel the attack action. + */ +public class AttackBlockEvent extends SCancelableEventBase { + + private final BlockPos blockPos; + private final Direction direction; + + public AttackBlockEvent(BlockPos blockPos, Direction direction) { + this.blockPos = blockPos; + this.direction = direction; + } + + public BlockPos blockPos() { + return this.blockPos; + } + + public Direction direction() { + return this.direction; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockReturnEvent.java new file mode 100644 index 0000000..fb927f2 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockReturnEvent.java @@ -0,0 +1,36 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import nl.devpieter.sees.event.SReturnableEvent; + +public class AttackBlockReturnEvent implements SReturnableEvent { + + private final BlockPos blockPos; + private final Direction direction; + private boolean returnValue; + + public AttackBlockReturnEvent(BlockPos blockPos, Direction direction, boolean returnValue) { + this.blockPos = blockPos; + this.direction = direction; + this.returnValue = returnValue; + } + + public BlockPos blockPos() { + return this.blockPos; + } + + public Direction direction() { + return this.direction; + } + + @Override + public Boolean getResult() { + return this.returnValue; + } + + @Override + public void setResult(Boolean result) { + this.returnValue = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockTailEvent.java new file mode 100644 index 0000000..94f197d --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/AttackBlockTailEvent.java @@ -0,0 +1,8 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import nl.devpieter.sees.event.SEvent; + +public record AttackBlockTailEvent(BlockPos blockPos, Direction direction) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockEvent.java new file mode 100644 index 0000000..deb8878 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockEvent.java @@ -0,0 +1,21 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import nl.devpieter.sees.event.SCancelableEventBase; + +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.AttackKeyPressedEvent} to directly cancel the attack action. + */ +public class BreakBlockEvent extends SCancelableEventBase { + + private final BlockPos blockPos; + + public BreakBlockEvent(BlockPos blockPos) { + this.blockPos = blockPos; + } + + public BlockPos blockPos() { + return this.blockPos; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockReturnEvent.java new file mode 100644 index 0000000..734c737 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockReturnEvent.java @@ -0,0 +1,30 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import nl.devpieter.sees.event.SCancelableEventBase; +import nl.devpieter.sees.event.SReturnableEvent; + +public class BreakBlockReturnEvent implements SReturnableEvent { + + private final BlockPos blockPos; + private boolean returnValue; + + public BreakBlockReturnEvent(BlockPos blockPos, boolean returnValue) { + this.blockPos = blockPos; + this.returnValue = returnValue; + } + + public BlockPos blockPos() { + return this.blockPos; + } + + @Override + public Boolean getResult() { + return this.returnValue; + } + + @Override + public void setResult(Boolean result) { + this.returnValue = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockTailEvent.java new file mode 100644 index 0000000..14ed4ad --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/BreakBlockTailEvent.java @@ -0,0 +1,7 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.math.BlockPos; +import nl.devpieter.sees.event.SEvent; + +public record BreakBlockTailEvent(BlockPos blockPos) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockEvent.java new file mode 100644 index 0000000..99b35c9 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockEvent.java @@ -0,0 +1,28 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import nl.devpieter.sees.event.SCancelableEventBase; + +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.UseKeyPressedEvent} to directly cancel the use action. + */ +public class InteractBlockEvent extends SCancelableEventBase { + + private final Hand hand; + private final BlockHitResult hitResult; + + public InteractBlockEvent(Hand hand, BlockHitResult hitResult) { + this.hand = hand; + this.hitResult = hitResult; + } + + public Hand hand() { + return this.hand; + } + + public BlockHitResult hitResult() { + return this.hitResult; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockReturnEvent.java new file mode 100644 index 0000000..11fb675 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockReturnEvent.java @@ -0,0 +1,37 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import nl.devpieter.sees.event.SReturnableEvent; + +public class InteractBlockReturnEvent implements SReturnableEvent { + + private final Hand hand; + private final BlockHitResult hitResult; + private ActionResult returnValue; + + public InteractBlockReturnEvent(Hand hand, BlockHitResult hitResult, ActionResult returnValue) { + this.hand = hand; + this.hitResult = hitResult; + this.returnValue = returnValue; + } + + public Hand hand() { + return this.hand; + } + + public BlockHitResult hitResult() { + return this.hitResult; + } + + @Override + public ActionResult getResult() { + return this.returnValue; + } + + @Override + public void setResult(ActionResult result) { + this.returnValue = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockTailEvent.java new file mode 100644 index 0000000..f4d9e50 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/block/InteractBlockTailEvent.java @@ -0,0 +1,8 @@ +package nl.devpieter.utilize.events.interaction.block; + +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import nl.devpieter.sees.event.SEvent; + +public record InteractBlockTailEvent(Hand hand, BlockHitResult hitResult) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/AttackKeyPressedEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/AttackKeyPressedEvent.java new file mode 100644 index 0000000..c94cd28 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/AttackKeyPressedEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.interaction.keybinding; + +import nl.devpieter.sees.event.SCancelableEventBase; + +public class AttackKeyPressedEvent extends SCancelableEventBase { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/UseKeyPressedEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/UseKeyPressedEvent.java new file mode 100644 index 0000000..9ab28ac --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/UseKeyPressedEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.interaction.keybinding; + +import nl.devpieter.sees.event.SCancelableEventBase; + +public class UseKeyPressedEvent extends SCancelableEventBase { +} diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/HotbarSlotChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/HotbarSlotChangedEvent.java index efba27d..a8e5963 100644 --- a/src/main/java/nl/devpieter/utilize/events/inventory/HotbarSlotChangedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/inventory/HotbarSlotChangedEvent.java @@ -1,6 +1,6 @@ package nl.devpieter.utilize.events.inventory; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; -public record HotbarSlotChangedEvent(int previous, int current) implements Event { +public record HotbarSlotChangedEvent(int previous, int current) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/SlotClickEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/SlotClickEvent.java index 0d6ff6a..43d3fdf 100644 --- a/src/main/java/nl/devpieter/utilize/events/inventory/SlotClickEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/inventory/SlotClickEvent.java @@ -1,25 +1,15 @@ package nl.devpieter.utilize.events.inventory; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.screen.slot.SlotActionType; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class SlotClickEvent extends CancelableEventBase { +public class SlotClickEvent extends SCancelableEventBase { private final int syncId; private final int slotId; private final int button; private final SlotActionType actionType; - @Deprecated(since = "1.0.9", forRemoval = true) - public SlotClickEvent(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player) { - this.syncId = syncId; - this.slotId = slotId; - this.button = button; - this.actionType = actionType; - } - public SlotClickEvent(int syncId, int slotId, int button, SlotActionType actionType) { this.syncId = syncId; this.slotId = slotId; @@ -42,9 +32,4 @@ public int button() { public SlotActionType actionType() { return actionType; } - - @Deprecated(since = "1.0.9", forRemoval = true) - public PlayerEntity player() { - return MinecraftClient.getInstance().player; - } } diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java index 3fc9b91..8e7dc94 100644 --- a/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java @@ -1,6 +1,6 @@ package nl.devpieter.utilize.events.inventory; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; -public record TotemCountChangedEvent(int previous, int current) implements Event { +public record TotemCountChangedEvent(int previous, int current) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java index 6c54b8e..0247a4d 100644 --- a/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java @@ -1,9 +1,9 @@ package nl.devpieter.utilize.events.inventory; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; public record TotemHoldingChangedEvent( boolean previousMainHand, boolean currentMainHand, boolean previousOffhand, boolean currentOffhand -) implements Event { +) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java index 8eb56aa..3f4a6c2 100644 --- a/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java @@ -2,8 +2,8 @@ import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.village.VillagerProfession; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; import org.jetbrains.annotations.NotNull; -public record ProfessionChangedPacketEvent(@NotNull VillagerEntity villager, @NotNull VillagerProfession previous, @NotNull VillagerProfession current) implements Event { +public record ProfessionChangedPacketEvent(@NotNull VillagerEntity villager, @NotNull VillagerProfession previous, @NotNull VillagerProfession current) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java index b396106..0c5defd 100644 --- a/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java @@ -2,9 +2,9 @@ import net.minecraft.screen.ScreenHandlerType; import net.minecraft.text.Text; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class ScreenOpenedPacketEvent extends CancelableEventBase { +public class ScreenOpenedPacketEvent extends SCancelableEventBase { private final int syncId; private final ScreenHandlerType type; diff --git a/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java index 6367795..eb6fd43 100644 --- a/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java @@ -1,9 +1,9 @@ package nl.devpieter.utilize.events.packet; import net.minecraft.village.TradeOfferList; -import nl.devpieter.sees.Event.CancelableEventBase; +import nl.devpieter.sees.event.SCancelableEventBase; -public class TradesOfferedPacketEvent extends CancelableEventBase { +public class TradesOfferedPacketEvent extends SCancelableEventBase { private final int syncId; private final TradeOfferList tradeOffers; diff --git a/src/main/java/nl/devpieter/utilize/events/player/PlayerDamagedEvent.java b/src/main/java/nl/devpieter/utilize/events/player/PlayerDamagedEvent.java index c540609..f3addcc 100644 --- a/src/main/java/nl/devpieter/utilize/events/player/PlayerDamagedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/player/PlayerDamagedEvent.java @@ -1,6 +1,6 @@ package nl.devpieter.utilize.events.player; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; -public record PlayerDamagedEvent(double current, double damage) implements Event { +public record PlayerDamagedEvent(double current, double damage) implements SEvent { } \ No newline at end of file diff --git a/src/main/java/nl/devpieter/utilize/events/player/PlayerHealedEvent.java b/src/main/java/nl/devpieter/utilize/events/player/PlayerHealedEvent.java index 2c1f933..1e3a2ee 100644 --- a/src/main/java/nl/devpieter/utilize/events/player/PlayerHealedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/player/PlayerHealedEvent.java @@ -1,6 +1,6 @@ package nl.devpieter.utilize.events.player; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; -public record PlayerHealedEvent(double current, double heal) implements Event { +public record PlayerHealedEvent(double current, double heal) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java index c7bccce..ef7091a 100644 --- a/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java @@ -1,9 +1,9 @@ package nl.devpieter.utilize.events.player; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; import org.jetbrains.annotations.NotNull; -public record SleepStateChangedEvent(@NotNull SleepState previous, @NotNull SleepState current) implements Event { +public record SleepStateChangedEvent(@NotNull SleepState previous, @NotNull SleepState current) implements SEvent { public enum SleepState { AWAKE, diff --git a/src/main/java/nl/devpieter/utilize/events/screen/ScreenChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/screen/ScreenChangedEvent.java index 5c0bc1b..bf842e3 100644 --- a/src/main/java/nl/devpieter/utilize/events/screen/ScreenChangedEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/screen/ScreenChangedEvent.java @@ -1,8 +1,8 @@ package nl.devpieter.utilize.events.screen; import net.minecraft.client.gui.screen.Screen; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; import org.jetbrains.annotations.Nullable; -public record ScreenChangedEvent(@Nullable Screen previous, @Nullable Screen current) implements Event { +public record ScreenChangedEvent(@Nullable Screen previous, @Nullable Screen current) implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/sound/PlaySoundEvent.java b/src/main/java/nl/devpieter/utilize/events/sound/PlaySoundEvent.java deleted file mode 100644 index 38fc56e..0000000 --- a/src/main/java/nl/devpieter/utilize/events/sound/PlaySoundEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package nl.devpieter.utilize.events.sound; - -import net.minecraft.client.sound.SoundInstance; -import nl.devpieter.sees.Event.CancelableEventBase; - -@Deprecated(since = "1.0.10", forRemoval = true) -public class PlaySoundEvent extends CancelableEventBase { - - private final SoundInstance sound; - - public PlaySoundEvent(SoundInstance sound) { - this.sound = sound; - } - - public SoundInstance sound() { - return sound; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java index 5fb9063..d0603e6 100644 --- a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java @@ -1,6 +1,6 @@ package nl.devpieter.utilize.events.tick; -import nl.devpieter.sees.Event.Event; +import nl.devpieter.sees.event.SEvent; -public record ClientTickEvent() implements Event { +public record ClientTickEvent() implements SEvent { } diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java index 2d5dfc3..5cb4147 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java @@ -38,7 +38,7 @@ public boolean onPacket(EntityTrackerUpdateS2CPacket packet) { //#endif if (previous == current) continue; - this.sees.call(new ProfessionChangedPacketEvent(villager, previous, current)); + this.sees.dispatch(new ProfessionChangedPacketEvent(villager, previous, current)); } return false; diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java index 323c4cb..40b7190 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java @@ -19,7 +19,7 @@ public Type getPacketType() { @Override public boolean onPacket(OpenScreenS2CPacket packet) { ScreenOpenedPacketEvent event = new ScreenOpenedPacketEvent(packet.getSyncId(), packet.getScreenHandlerType(), packet.getName()); - if (!this.sees.call(event)) return false; + if (!this.sees.dispatch(event)) return false; Utilize.blockScreenId(packet.getSyncId()); return false; diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java index 99c49ef..cdc5742 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java @@ -19,7 +19,7 @@ public Type getPacketType() { @Override public boolean onPacket(SetTradeOffersS2CPacket packet) { TradesOfferedPacketEvent event = new TradesOfferedPacketEvent(packet.getSyncId(), packet.getOffers()); - if (!this.sees.call(event)) return false; + if (!this.sees.dispatch(event)) return false; Utilize.blockScreenId(packet.getSyncId()); return true; diff --git a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java index aab36ee..f6fd174 100644 --- a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java @@ -31,8 +31,8 @@ public void tick(double currentHealth) { if (difference == 0) return; - if (difference > 0) this.sees.call(new PlayerDamagedEvent(currentHealth, difference)); - else if (difference < 0) this.sees.call(new PlayerHealedEvent(currentHealth, -difference)); + if (difference > 0) this.sees.dispatch(new PlayerDamagedEvent(currentHealth, difference)); + else if (difference < 0) this.sees.dispatch(new PlayerHealedEvent(currentHealth, -difference)); } public double getCurrentHealth() { diff --git a/src/main/java/nl/devpieter/utilize/managers/SleepManager.java b/src/main/java/nl/devpieter/utilize/managers/SleepManager.java index 5b9d1c3..be8be95 100644 --- a/src/main/java/nl/devpieter/utilize/managers/SleepManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/SleepManager.java @@ -40,7 +40,7 @@ public void tick(boolean isSleeping, float sleepTimer) { } if (previous == this.currentState) return; - this.sees.call(new SleepStateChangedEvent(previous, this.currentState)); + this.sees.dispatch(new SleepStateChangedEvent(previous, this.currentState)); } public SleepStateChangedEvent.SleepState getCurrentState() { diff --git a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java index 76d035e..e2032a3 100644 --- a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java @@ -49,7 +49,7 @@ private void tickTotemCount() { int totemCount = InventoryUtils.countItem(Items.TOTEM_OF_UNDYING); if (totemCount == this.currentTotems) return; - this.sees.call(new TotemCountChangedEvent(this.currentTotems, totemCount)); + this.sees.dispatch(new TotemCountChangedEvent(this.currentTotems, totemCount)); this.currentTotems = totemCount; } @@ -58,7 +58,7 @@ private void tickHoldingTotem() { boolean offhand = InventoryUtils.isOffhandOf(Items.TOTEM_OF_UNDYING); if (mainHand == this.holdingMainHand && offhand == this.holdingOffhand) return; - this.sees.call(new TotemHoldingChangedEvent(this.holdingMainHand, mainHand, this.holdingOffhand, offhand)); + this.sees.dispatch(new TotemHoldingChangedEvent(this.holdingMainHand, mainHand, this.holdingOffhand, offhand)); this.holdingMainHand = mainHand; this.holdingOffhand = offhand; } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java index bf481b4..17d59ac 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java @@ -37,9 +37,8 @@ public abstract class ChatHudMixin { @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", cancellable = true) public void onAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, CallbackInfo ci) { - - ReceiveMessageEvent event = new ReceiveMessageEvent(message); - Text result = this.sees.callWithResult(event); + ReceiveMessageEvent event = new ReceiveMessageEvent(message); // rename to ChatHudMessageAddEvent, or something similar + Text result = this.sees.dispatchWithResult(event); if (event.isCancelled()) { ci.cancel(); diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index b01970d..c1ed702 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -43,15 +43,20 @@ public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { super(world, profile); } - @Inject(at = @At("TAIL"), method = "tick") + @Inject(at = @At("HEAD"), method = "tick") private void onTick(CallbackInfo ci) { + this.sees.dispatch(new ClientTickEvent()); // rename to ClientPlayerTickEvent, or something similar + } + + @Inject(at = @At("TAIL"), method = "tick") + private void onTickTail(CallbackInfo ci) { this.settingManager.tick(); this.damageManager.tick(this.getHealth()); this.sleepManager.tick(this.isSleeping(), this.getSleepTimer()); this.taskManager.tick(); this.totemManager.tick(); - this.sees.call(new ClientTickEvent()); + // this.sees.call(new ClientTickEvent()); // rename to ClientPlayerTickTailEvent, or something similar } @Inject(at = @At("HEAD"), method = "swingHand", cancellable = true) diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 8d1b4a2..24f38b6 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -12,7 +12,11 @@ import net.minecraft.util.math.Direction; import nl.devpieter.sees.Sees; import nl.devpieter.utilize.Utilize; -import nl.devpieter.utilize.events.interaction.*; +import nl.devpieter.utilize.events.interaction.AttackEntityEvent; +import nl.devpieter.utilize.events.interaction.InteractEntityEvent; +import nl.devpieter.utilize.events.interaction.InteractItemEvent; +import nl.devpieter.utilize.events.interaction.UpdateBlockBreakingProgressEvent; +import nl.devpieter.utilize.events.interaction.block.*; import nl.devpieter.utilize.events.inventory.HotbarSlotChangedEvent; import nl.devpieter.utilize.events.inventory.SlotClickEvent; import nl.devpieter.utilize.utils.InventoryUtils; @@ -38,41 +42,69 @@ public abstract class ClientPlayerInteractionManagerMixin { @Inject(at = @At("HEAD"), method = "updateBlockBreakingProgress", cancellable = true) private void onUpdateBlockBreakingProgress(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - if (!this.sees.call(new UpdateBlockBreakingProgressEvent(pos, direction))) return; + if (!this.sees.dispatch(new UpdateBlockBreakingProgressEvent(pos, direction))) return; + + // TODO - Make not cancelable? this.cancelBlockBreaking(); cir.setReturnValue(false); - cir.cancel(); } @Inject(at = @At("HEAD"), method = "breakBlock", cancellable = true) private void onBreakBlock(BlockPos pos, CallbackInfoReturnable cir) { - if (!this.sees.call(new BreakBlockEvent(pos))) return; + if (!this.sees.dispatch(new BreakBlockEvent(pos))) return; this.cancelBlockBreaking(); cir.setReturnValue(false); - cir.cancel(); + } + + @Inject(at = @At("RETURN"), method = "breakBlock", cancellable = true) + private void onBreakBlockReturn(BlockPos pos, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new BreakBlockReturnEvent(pos, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "breakBlock") + private void onBreakBlockTail(BlockPos pos, CallbackInfoReturnable cir) { + this.sees.dispatch(new BreakBlockTailEvent(pos)); } @Inject(at = @At("HEAD"), method = "attackBlock", cancellable = true) private void onAttackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - if (!this.sees.call(new AttackBlockEvent(pos, direction))) return; + if (!this.sees.dispatch(new AttackBlockEvent(pos, direction))) return; this.cancelBlockBreaking(); cir.setReturnValue(false); - cir.cancel(); + } + + @Inject(at = @At("RETURN"), method = "attackBlock", cancellable = true) + private void onAttackBlockReturn(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new AttackBlockReturnEvent(pos, direction, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "attackBlock") + private void onAttackBlockTail(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { + this.sees.dispatch(new AttackBlockTailEvent(pos, direction)); } @Inject(at = @At("HEAD"), method = "interactBlock", cancellable = true) private void onInteractBlock(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - if (!this.sees.call(new InteractBlockEvent(hand, hitResult))) return; + if (!this.sees.dispatch(new InteractBlockEvent(hand, hitResult))) return; cir.setReturnValue(ActionResult.FAIL); - cir.cancel(); + } + + @Inject(at = @At("RETURN"), method = "interactBlock", cancellable = true) + private void onInteractBlockReturn(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new InteractBlockReturnEvent(hand, hitResult, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "interactBlock") + private void onInteractBlockTail(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { + this.sees.dispatch(new InteractBlockTailEvent(hand, hitResult)); } @Inject(at = @At("HEAD"), method = "interactItem", cancellable = true) private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - if (!this.sees.call(new InteractItemEvent(hand))) return; + if (!this.sees.dispatch(new InteractItemEvent(hand))) return; cir.setReturnValue(ActionResult.FAIL); cir.cancel(); } @@ -80,7 +112,7 @@ private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnab @Inject(at = @At("HEAD"), method = "attackEntity", cancellable = true) private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) { System.out.println("AttackEntityEvent called for " + target.getName().getString() + " by " + player.getName().getString()); - if (!this.sees.call(new AttackEntityEvent(target))) return; + if (!this.sees.dispatch(new AttackEntityEvent(target))) return; ci.cancel(); Utilize.blockSwingHandOnce(); @@ -88,14 +120,14 @@ private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) @Inject(at = @At("HEAD"), method = "interactEntity", cancellable = true) private void onInteractEntity(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { - if (!this.sees.call(new InteractEntityEvent(target, hand))) return; + if (!this.sees.dispatch(new InteractEntityEvent(target, hand))) return; cir.setReturnValue(ActionResult.FAIL); cir.cancel(); } @Inject(at = @At("HEAD"), method = "clickSlot", cancellable = true) private void onClickSlot(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci) { - if (!this.sees.call(new SlotClickEvent(syncId, slotId, button, actionType))) return; + if (!this.sees.dispatch(new SlotClickEvent(syncId, slotId, button, actionType))) return; ci.cancel(); } @@ -111,6 +143,6 @@ private void onSyncSelectedSlot(CallbackInfo ci) { if (slot == this.lastSelectedHotbarSlot) return; this.lastSelectedHotbarSlot = slot; - this.sees.call(new HotbarSlotChangedEvent(this.lastSelectedHotbarSlot, slot)); + this.sees.dispatch(new HotbarSlotChangedEvent(this.lastSelectedHotbarSlot, slot)); } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java new file mode 100644 index 0000000..5cc67e5 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java @@ -0,0 +1,61 @@ +package nl.devpieter.utilize.mixins; + +import net.minecraft.client.option.KeyBinding; +import nl.devpieter.sees.Sees; +import nl.devpieter.utilize.events.interaction.keybinding.AttackKeyPressedEvent; +import nl.devpieter.utilize.events.interaction.keybinding.UseKeyPressedEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(KeyBinding.class) +public abstract class KeyBindingMixin { + + @Shadow + public abstract String getTranslationKey(); + + @Shadow + private int timesPressed; + + @Shadow + public abstract void setPressed(boolean pressed); + + @Unique + private final Sees sees = Sees.getInstance(); + + @Inject(at = @At("RETURN"), method = "isPressed", cancellable = true) + private void isPressed(CallbackInfoReturnable cir) { + if (!cir.getReturnValue()) return; + + if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); + else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); + } + + @Inject(at = @At("RETURN"), method = "wasPressed", cancellable = true) + private void wasPressed(CallbackInfoReturnable cir) { + if (!cir.getReturnValue()) return; + + if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); + else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); + } + + @Unique + private void handleAttackKeyPressed(CallbackInfoReturnable cir) { + if (this.sees.dispatch(new AttackKeyPressedEvent())) this.cancel(cir); + } + + @Unique + private void handleUseKeyPressed(CallbackInfoReturnable cir) { + if (this.sees.dispatch(new UseKeyPressedEvent())) this.cancel(cir); + } + + @Unique + private void cancel(CallbackInfoReturnable cir) { + this.timesPressed = 0; + this.setPressed(false); + cir.setReturnValue(false); + } +} diff --git a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index bfe254c..b42ccd8 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -32,6 +32,6 @@ private void onSetScreenHead(Screen screen, CallbackInfo ci) { @Inject(at = @At("TAIL"), method = "setScreen") private void onSetScreenTail(Screen screen, CallbackInfo ci) { - this.sees.call(new ScreenChangedEvent(this.previousScreen, screen)); + this.sees.dispatch(new ScreenChangedEvent(this.previousScreen, screen)); } } diff --git a/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java b/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java index c7660bd..30fb87f 100644 --- a/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java @@ -7,21 +7,9 @@ import net.minecraft.client.network.ClientPlayerInteractionManager; import net.minecraft.client.sound.SoundManager; import net.minecraft.client.world.ClientWorld; -import net.minecraft.network.packet.Packet; -import net.minecraft.text.Text; public class ClientUtils { - @Deprecated(since = "1.0.3", forRemoval = true) - public static void sendMessage(Text message, boolean overlay) { - PlayerUtils.sendMessage(message, overlay); - } - - @Deprecated(since = "1.0.3", forRemoval = true) - public static void sendPacket(Packet packet) { - NetworkUtils.sendPacket(packet); - } - public static boolean isDevEnv() { return FabricLoader.getInstance().isDevelopmentEnvironment(); } diff --git a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java b/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java index 73f1d97..a22ca8c 100644 --- a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java @@ -14,6 +14,15 @@ public static void sendMessage(Text message, boolean overlay) { ClientUtils.getPlayer().sendMessage(message, overlay); } + public static @Nullable HitResult getHitResult() { + if (!ClientUtils.hasPlayer()) return null; + + HitResult result = ClientUtils.getClient().crosshairTarget; + if (!(result instanceof HitResult hitResult)) return null; + + return hitResult; + } + public static @Nullable BlockHitResult getBlockHitResult() { if (!ClientUtils.hasPlayer()) return null; diff --git a/src/main/resources/utilize.mixins.json b/src/main/resources/utilize.mixins.json index 37556b7..d31a0b6 100644 --- a/src/main/resources/utilize.mixins.json +++ b/src/main/resources/utilize.mixins.json @@ -8,6 +8,7 @@ "ClientPlayerEntityMixin", "ClientPlayerInteractionManagerMixin", "DebugRendererMixin", + "KeyBindingMixin", "MinecraftClientMixin" ], "injectors": { From 40d921c433e6a43ad542bfa39408678555b9e9e2 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:05:10 +0200 Subject: [PATCH 03/41] =?UTF-8?q?=F0=9F=94=A7=20Remove=20deprecated=20meth?= =?UTF-8?q?ods=20for=20player=20and=20mob=20proximity=20checks=20in=20Worl?= =?UTF-8?q?dUtils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devpieter/utilize/utils/WorldUtils.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java index 256defa..fe233c8 100644 --- a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java @@ -3,19 +3,12 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; - public class WorldUtils { public static @Nullable BlockState getStateAt(@NotNull Vec3d vec3d) { @@ -50,39 +43,4 @@ public class WorldUtils { if (!ClientUtils.hasWorld()) return null; return ClientUtils.getWorld().getEntityById(id); } - - @Deprecated(since = "1.0.11", forRemoval = true) - public static List getNearbyPlayers(float distance) { - if (!ClientUtils.hasPlayer() || !ClientUtils.hasWorld()) return new ArrayList<>(); - - World world = ClientUtils.getWorld(); - PlayerEntity clientPlayer = ClientUtils.getPlayer(); - - return world.getPlayers().stream() - .filter(player -> - player != clientPlayer && - player.distanceTo(clientPlayer) <= distance && - player.isAlive() - ).toList(); - } - - @Deprecated(since = "1.0.11", forRemoval = true) - public static boolean arePlayersNearby(float distance) { - return !getNearbyPlayers(distance).isEmpty(); - } - - @Deprecated(since = "1.0.11", forRemoval = true) - public static List getNearbyMobs(float distance) { - if (!ClientUtils.hasPlayer() || !ClientUtils.hasWorld()) return new ArrayList<>(); - - World world = ClientUtils.getWorld(); - PlayerEntity clientPlayer = ClientUtils.getPlayer(); - - return world.getEntitiesByClass(MobEntity.class, clientPlayer.getBoundingBox().expand(distance), LivingEntity::isAlive); - } - - @Deprecated(since = "1.0.11", forRemoval = true) - public static boolean areMobsNearby(float distance) { - return !getNearbyMobs(distance).isEmpty(); - } } From db7f77e3e356418e56bf531ea7cbc04b0b986058 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sun, 13 Jul 2025 14:07:54 +0200 Subject: [PATCH 04/41] =?UTF-8?q?=F0=9F=94=A7=20Improve=20logging,=20refac?= =?UTF-8?q?tor=20TaskManager,=20and=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 50 +++++++----- .../devpieter/utilize/http/AsyncRequest.java | 47 +++--------- .../devpieter/utilize/http/RequestHelper.java | 44 +---------- .../utilize/managers/TaskManager.java | 76 ------------------- .../mixins/ClientPlayerEntityMixin.java | 16 ++-- .../ClientPlayerInteractionManagerMixin.java | 3 +- .../utilize/setting/SettingManager.java | 17 +++-- .../devpieter/utilize/task/TaskManager.java | 46 +++++++++++ .../utilize/task/interfaces/ITask.java | 14 ++++ .../utilize/task/tasks/RunLaterTask.java | 62 +++++++++++++++ 10 files changed, 183 insertions(+), 192 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/managers/TaskManager.java create mode 100644 src/main/java/nl/devpieter/utilize/task/TaskManager.java create mode 100644 src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java create mode 100644 src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index aee3ef0..8dc9ada 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -1,15 +1,18 @@ package nl.devpieter.utilize; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; +import nl.devpieter.utilize.http.AsyncRequest; import nl.devpieter.utilize.listeners.packet.EntityTrackerUpdatePacketListener; import nl.devpieter.utilize.listeners.packet.OpenScreenPacketListener; import nl.devpieter.utilize.listeners.packet.SetTradeOffersPacketListener; import nl.devpieter.utilize.managers.PacketManager; +import nl.devpieter.utilize.task.TaskManager; import nl.devpieter.utilize.utils.ClientUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,33 +22,50 @@ public class Utilize implements ClientModInitializer { - private static final ModContainer MOD_CONTAINER = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); - public static final Logger LOGGER = LoggerFactory.getLogger("Utilize"); + private static Utilize INSTANCE; + + private final Logger logger = LoggerFactory.getLogger("Utilize"); + private final ModContainer modContainer = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); - private static boolean BLOCK_SWING_HAND_ONCE = false; private static final List BLOCK_SCREEN_IDS = new ArrayList<>(); @Override public void onInitializeClient() { + INSTANCE = this; + PacketManager packetManager = PacketManager.getInstance(); packetManager.subscribe(new EntityTrackerUpdatePacketListener()); packetManager.subscribe(new OpenScreenPacketListener()); packetManager.subscribe(new SetTradeOffersPacketListener()); - if (!ClientUtils.isDevEnv()) return; - LOGGER.info("Utilize is running in a development environment."); + ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { + this.logger.info("Shutting down Utilize..."); + + TaskManager.shutdown(); + AsyncRequest.shutdown(); + }); + + this.logger.info("Utilize initialized successfully! Version: {}", this.getUtilizeVersion()); + } + + public static Utilize getInstance() { + return INSTANCE; } - public static boolean shouldBlockSwingHandOnce() { - return BLOCK_SWING_HAND_ONCE; + public Logger getLogger() { + return this.logger; } - public static void blockSwingHandOnce() { - BLOCK_SWING_HAND_ONCE = true; + public String getUtilizeVersion() { + return this.modContainer.getMetadata().getVersion().getFriendlyString(); } - public static void blockedSwingHandOnce() { - BLOCK_SWING_HAND_ONCE = false; + public String getMinecraftVersion() { + return SharedConstants.getGameVersion().getName(); + } + + public String getUserAgent() { + return String.format("Utilize/%s (%s;)", this.getUtilizeVersion(), this.getMinecraftVersion()); } public static boolean shouldBlockScreenId(int screenId) { @@ -71,12 +91,4 @@ public static void blockScreenId(int screenId) { public static void blockedScreenId(int screenId) { BLOCK_SCREEN_IDS.removeIf(id -> id == screenId); } - - public static String getUtilizeVersion() { - return MOD_CONTAINER.getMetadata().getVersion().getFriendlyString(); - } - - public static String getMinecraftVersion() { - return SharedConstants.getGameVersion().getName(); - } } diff --git a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java index 580e501..59594bf 100644 --- a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java +++ b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java @@ -4,10 +4,7 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; public abstract class AsyncRequest extends RequestHelper { @@ -24,29 +21,25 @@ public AsyncRequest(@Nullable ResultConsumer requestCallback) { this.callbacks.add(requestCallback); } - /** - * Shuts down the executor service used for asynchronous requests. - */ public static void shutdown() { EXECUTOR_SERVICE.shutdown(); + + try { + if (EXECUTOR_SERVICE.awaitTermination(5, TimeUnit.SECONDS)) return; + EXECUTOR_SERVICE.shutdownNow(); + } catch (InterruptedException e) { + EXECUTOR_SERVICE.shutdownNow(); + Thread.currentThread().interrupt(); + } } protected abstract @Nullable T requestAsync() throws Exception; - /** - * Adds a callback to the list of callbacks. - * - * @param callback the callback to be added, can be null - */ public void addCallback(@Nullable ResultConsumer callback) { if (callback == null) return; this.callbacks.add(callback); } - /** - * Executes the asynchronous request. - * If the request is already in progress, this method does nothing. - */ public void execute() { if (this.future != null) return; @@ -62,40 +55,20 @@ public void execute() { }, EXECUTOR_SERVICE); } - /** - * Cancels the asynchronous request if it is in progress. - */ public void cancel() { this.future.cancel(true); } - /** - * Checks if the asynchronous request is done. - * - * @return true if the request is done, false otherwise - */ public boolean isDone() { return this.future.isDone(); } - /** - * Gets the result of the asynchronous request. - * - * @return the result of the request - * @throws ExecutionException if the computation threw an exception - * @throws InterruptedException if the current thread was interrupted while waiting - */ public T get() throws ExecutionException, InterruptedException { return this.future.get(); } - /** - * Gets the CompletableFuture representing the asynchronous request. - * - * @return the CompletableFuture representing the request - */ public CompletableFuture getFuture() { - return future; + return this.future; } private void callCallbacks(@Nullable T result, @Nullable Exception exception) { diff --git a/src/main/java/nl/devpieter/utilize/http/RequestHelper.java b/src/main/java/nl/devpieter/utilize/http/RequestHelper.java index 7e158a8..e124a86 100644 --- a/src/main/java/nl/devpieter/utilize/http/RequestHelper.java +++ b/src/main/java/nl/devpieter/utilize/http/RequestHelper.java @@ -15,71 +15,29 @@ public abstract class RequestHelper { protected static final HttpClient CLIENT = HttpClient.newHttpClient(); - /** - * Sends a simple GET request to the specified URI. - * - * @param uri the URI to send the GET request to - * @return the HttpResponse containing the response body as a String - * @throws IOException if an I/O error occurs when sending or receiving - * @throws InterruptedException if the operation is interrupted - */ public static @NotNull HttpResponse simpleGet(@NotNull URI uri) throws IOException, InterruptedException { HttpRequest request = createRequestBuilder(uri).GET().build(); return CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); } - /** - * Sends a simple POST request to the specified URI with the given body. - * - * @param uri the URI to send the POST request to - * @param bodyPublisher the body of the POST request - * @return the HttpResponse containing the response body as a String - * @throws IOException if an I/O error occurs when sending or receiving - * @throws InterruptedException if the operation is interrupted - */ public static @NotNull HttpResponse simplePost(@NotNull URI uri, @NotNull HttpRequest.BodyPublisher bodyPublisher) throws IOException, InterruptedException { HttpRequest request = createRequestBuilder(uri).POST(bodyPublisher).build(); return CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); } - /** - * Sends a simple PUT request to the specified URI with the given body. - * - * @param uri the URI to send the PUT request to - * @param bodyPublisher the body of the PUT request - * @return the HttpResponse containing the response body as a String - * @throws IOException if an I/O error occurs when sending or receiving - * @throws InterruptedException if the operation is interrupted - */ public static @NotNull HttpResponse simplePut(@NotNull URI uri, @NotNull HttpRequest.BodyPublisher bodyPublisher) throws IOException, InterruptedException { HttpRequest request = createRequestBuilder(uri).PUT(bodyPublisher).build(); return CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); } - /** - * Sends a simple DELETE request to the specified URI. - * - * @param uri the URI to send the DELETE request to - * @return the HttpResponse containing the response body as a String - * @throws IOException if an I/O error occurs when sending or receiving - * @throws InterruptedException if the operation is interrupted - */ public static @NotNull HttpResponse simpleDelete(@NotNull URI uri) throws IOException, InterruptedException { HttpRequest request = createRequestBuilder(uri).DELETE().build(); return CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); } - /** - * Creates a new HttpRequest.Builder with the specified URI and default headers. - * - * @param uri the URI to set in the request builder - * @return the HttpRequest.Builder with the specified URI and default headers - */ public static HttpRequest.Builder createRequestBuilder(@NotNull URI uri) { - String agent = String.format("Utilize/%s-%s", Utilize.getUtilizeVersion(), Utilize.getMinecraftVersion()); - return HttpRequest.newBuilder() - .header(USER_AGENT_HEADER, agent) + .header(USER_AGENT_HEADER, Utilize.getInstance().getUserAgent()) .header("Content-Type", "application/json") .header("Accept", "application/json") .uri(uri); diff --git a/src/main/java/nl/devpieter/utilize/managers/TaskManager.java b/src/main/java/nl/devpieter/utilize/managers/TaskManager.java deleted file mode 100644 index db332fe..0000000 --- a/src/main/java/nl/devpieter/utilize/managers/TaskManager.java +++ /dev/null @@ -1,76 +0,0 @@ -package nl.devpieter.utilize.managers; - -import java.util.ArrayList; -import java.util.List; - -public class TaskManager { - - private static TaskManager INSTANCE; - - private final List tasks = new ArrayList<>(); - - private TaskManager() { - } - - public static TaskManager getInstance() { - if (INSTANCE == null) INSTANCE = new TaskManager(); - return INSTANCE; - } - - public void addTask(ITask task) { - this.tasks.add(task); - } - - public void removeTask(ITask task) { - this.tasks.remove(task); - } - - public void tick() { - for (ITask task : new ArrayList<>(tasks)) { - task.tick(); - if (task.isFinished()) removeTask(task); - } - } - - public static interface ITask { - void tick(); - - void reset(); - - boolean isFinished(); - } - - public static class RunOnceTask implements ITask { - - private final Runnable runnable; - private final int startDelay; - - private boolean finished; - private int tickCounter; - - public RunOnceTask(Runnable runnable, int startDelay) { - this.runnable = runnable; - this.startDelay = startDelay; - this.tickCounter = 0; - } - - public void tick() { - if (finished) return; - - tickCounter++; - if (tickCounter < startDelay) return; - - runnable.run(); - finished = true; - } - - public void reset() { - this.finished = false; - this.tickCounter = 0; - } - - public boolean isFinished() { - return finished; - } - } -} diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index c1ed702..33c11bc 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -9,7 +9,7 @@ import nl.devpieter.utilize.events.tick.ClientTickEvent; import nl.devpieter.utilize.managers.DamageManager; import nl.devpieter.utilize.managers.SleepManager; -import nl.devpieter.utilize.managers.TaskManager; +import nl.devpieter.utilize.task.TaskManager; import nl.devpieter.utilize.managers.TotemManager; import nl.devpieter.utilize.setting.SettingManager; import org.spongepowered.asm.mixin.Mixin; @@ -59,11 +59,11 @@ private void onTickTail(CallbackInfo ci) { // this.sees.call(new ClientTickEvent()); // rename to ClientPlayerTickTailEvent, or something similar } - @Inject(at = @At("HEAD"), method = "swingHand", cancellable = true) - private void onSwingHand(CallbackInfo ci) { - if (!Utilize.shouldBlockSwingHandOnce()) return; - - ci.cancel(); - Utilize.blockedSwingHandOnce(); - } +// @Inject(at = @At("HEAD"), method = "swingHand", cancellable = true) +// private void onSwingHand(CallbackInfo ci) { +// if (!Utilize.shouldBlockSwingHandOnce()) return; +// +// ci.cancel(); +// Utilize.blockedSwingHandOnce(); +// } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 24f38b6..91995e3 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -111,11 +111,10 @@ private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnab @Inject(at = @At("HEAD"), method = "attackEntity", cancellable = true) private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) { - System.out.println("AttackEntityEvent called for " + target.getName().getString() + " by " + player.getName().getString()); if (!this.sees.dispatch(new AttackEntityEvent(target))) return; ci.cancel(); - Utilize.blockSwingHandOnce(); +// Utilize.blockSwingHandOnce(); } @Inject(at = @At("HEAD"), method = "interactEntity", cancellable = true) diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index 50f48b6..22b94c5 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -7,6 +7,7 @@ import nl.devpieter.utilize.setting.interfaces.ISetting; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; import java.io.*; import java.time.Duration; @@ -20,6 +21,8 @@ public class SettingManager { private static SettingManager INSTANCE; private final Gson gson = new Gson(); + private final Utilize utilize = Utilize.getInstance(); + private final Logger logger = this.utilize.getLogger(); private final Duration saveInterval = Duration.ofSeconds(15); private final HashMap>> saveQueue = new HashMap<>(); @@ -46,13 +49,13 @@ public void tick() { 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); + this.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.logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath()); } this.lastSaveTime = currentTime; @@ -88,13 +91,13 @@ public void forceSaveQueue() { 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); + this.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.logger.error("Failed to force save settings batch to file: {}", file.getAbsolutePath()); } this.saveQueue.clear(); @@ -127,7 +130,7 @@ private boolean loadSettingFromBatch(@NotNull ISetting setting, @Nullable return true; } - Utilize.LOGGER.warn("Failed to load setting: {} from batch", setting.getIdentifier()); + this.logger.warn("Failed to load setting: {} from batch", setting.getIdentifier()); return false; } @@ -150,7 +153,7 @@ private boolean saveBatchToFile(@NotNull File file, @NotNull List>>() { }.getType()); } catch (IOException e) { - Utilize.LOGGER.error("Failed to read settings batch from file: {}", file.getAbsolutePath(), e); + this.logger.error("Failed to read settings batch from file: {}", file.getAbsolutePath(), e); return null; } } diff --git a/src/main/java/nl/devpieter/utilize/task/TaskManager.java b/src/main/java/nl/devpieter/utilize/task/TaskManager.java new file mode 100644 index 0000000..448e358 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/task/TaskManager.java @@ -0,0 +1,46 @@ +package nl.devpieter.utilize.task; + +import nl.devpieter.utilize.task.interfaces.ITask; + +import java.util.ArrayList; +import java.util.List; + +public class TaskManager { + + private static TaskManager INSTANCE; + + private final List tasks = new ArrayList<>(); + + private TaskManager() { + } + + public static TaskManager getInstance() { + if (INSTANCE == null) INSTANCE = new TaskManager(); + return INSTANCE; + } + + public static void shutdown() { + if (INSTANCE == null) return; + + INSTANCE.tasks.clear(); + INSTANCE = null; + } + + public void addTask(ITask task) { + this.tasks.add(task); + } + + public void removeTask(ITask task) { + this.tasks.remove(task); + } + + public void tick() { + for (ITask task : this.tasks) { + task.tick(); + if (!task.isFinished()) continue; + + if (task.resetOnFinish()) task.reset(); + else this.removeTask(task); + } + } +} diff --git a/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java b/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java new file mode 100644 index 0000000..db60803 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java @@ -0,0 +1,14 @@ +package nl.devpieter.utilize.task.interfaces; + +public interface ITask { + + void tick(); + + void reset(); + + boolean isFinished(); + + default boolean resetOnFinish() { + return false; + } +} diff --git a/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java b/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java new file mode 100644 index 0000000..6a1ca0f --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java @@ -0,0 +1,62 @@ +package nl.devpieter.utilize.task.tasks; + +import nl.devpieter.utilize.task.interfaces.ITask; +import org.jetbrains.annotations.NotNull; + +import java.time.Duration; + +public class RunLaterTask implements ITask { + + private final Runnable runnable; + + private final int startDelayTicks; + private final boolean resetOnFinish; + + private boolean finished; + private int tickCounter; + + public RunLaterTask(@NotNull Runnable runnable, int startDelayTicks) { + this(runnable, startDelayTicks, false); + } + + public RunLaterTask(@NotNull Runnable runnable, @NotNull Duration startDelay) { + this(runnable, startDelay, false); + } + + public RunLaterTask(@NotNull Runnable runnable, @NotNull Duration startDelay, boolean resetOnFinish) { + this(runnable, (int) (startDelay.toMillis() / 50), resetOnFinish); + } + + public RunLaterTask(@NotNull Runnable runnable, int startDelayTicks, boolean resetOnFinish) { + this.runnable = runnable; + this.startDelayTicks = startDelayTicks; + this.resetOnFinish = resetOnFinish; + } + + @Override + public void tick() { + if (this.finished) return; + + this.tickCounter++; + if (this.tickCounter < this.startDelayTicks) return; + + this.runnable.run(); + this.finished = true; + } + + @Override + public void reset() { + this.finished = false; + this.tickCounter = 0; + } + + @Override + public boolean isFinished() { + return this.finished; + } + + @Override + public boolean resetOnFinish() { + return this.resetOnFinish; + } +} From b2b086cbd54a544b1427a192d818749c849bd1c1 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sun, 13 Jul 2025 14:26:03 +0200 Subject: [PATCH 05/41] =?UTF-8?q?=F0=9F=A7=B9=20Refactor=20utility=20class?= =?UTF-8?q?es=20to=20use=20a=20consistent=20package=20structure=20and=20im?= =?UTF-8?q?prove=20organization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nl/devpieter/utilize/Utilize.java | 2 +- .../listeners/packet/EntityTrackerUpdatePacketListener.java | 2 +- src/main/java/nl/devpieter/utilize/managers/TotemManager.java | 2 +- .../nl/devpieter/utilize/mixins/ClientConnectionMixin.java | 2 +- .../utilize/mixins/ClientPlayerInteractionManagerMixin.java | 3 +-- .../nl/devpieter/utilize/utils/{ => common}/MathUtils.java | 2 +- .../nl/devpieter/utilize/utils/{ => common}/RandomUtils.java | 2 +- .../devpieter/utilize/utils/{ => minecraft}/ClientUtils.java | 2 +- .../utilize/utils/{ => minecraft}/EnchantmentUtils.java | 2 +- .../utilize/utils/{ => minecraft}/InteractionUtils.java | 2 +- .../utilize/utils/{ => minecraft}/InventoryUtils.java | 2 +- .../devpieter/utilize/utils/{ => minecraft}/NetworkUtils.java | 2 +- .../devpieter/utilize/utils/{ => minecraft}/PlayerUtils.java | 2 +- .../nl/devpieter/utilize/utils/{ => minecraft}/SoundUtils.java | 2 +- .../nl/devpieter/utilize/utils/{ => minecraft}/TextUtils.java | 2 +- .../nl/devpieter/utilize/utils/{ => minecraft}/WorldUtils.java | 3 ++- 16 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/nl/devpieter/utilize/utils/{ => common}/MathUtils.java (97%) rename src/main/java/nl/devpieter/utilize/utils/{ => common}/RandomUtils.java (89%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/ClientUtils.java (97%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/EnchantmentUtils.java (98%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/InteractionUtils.java (89%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/InventoryUtils.java (98%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/NetworkUtils.java (94%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/PlayerUtils.java (97%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/SoundUtils.java (94%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/TextUtils.java (94%) rename src/main/java/nl/devpieter/utilize/utils/{ => minecraft}/WorldUtils.java (93%) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 8dc9ada..8749912 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -13,7 +13,7 @@ import nl.devpieter.utilize.listeners.packet.SetTradeOffersPacketListener; import nl.devpieter.utilize.managers.PacketManager; import nl.devpieter.utilize.task.TaskManager; -import nl.devpieter.utilize.utils.ClientUtils; +import nl.devpieter.utilize.utils.minecraft.ClientUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java index 5cb4147..4a7d025 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java @@ -8,7 +8,7 @@ import net.minecraft.village.VillagerProfession; import nl.devpieter.sees.Sees; import nl.devpieter.utilize.events.packet.ProfessionChangedPacketEvent; -import nl.devpieter.utilize.utils.WorldUtils; +import nl.devpieter.utilize.utils.minecraft.WorldUtils; import java.lang.reflect.Type; diff --git a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java index e2032a3..fca793d 100644 --- a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java @@ -4,7 +4,7 @@ import nl.devpieter.sees.Sees; import nl.devpieter.utilize.events.inventory.TotemCountChangedEvent; import nl.devpieter.utilize.events.inventory.TotemHoldingChangedEvent; -import nl.devpieter.utilize.utils.InventoryUtils; +import nl.devpieter.utilize.utils.minecraft.InventoryUtils; public class TotemManager { diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java index e17899b..05cc033 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java @@ -7,7 +7,7 @@ import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket; import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.managers.PacketManager; -import nl.devpieter.utilize.utils.NetworkUtils; +import nl.devpieter.utilize.utils.minecraft.NetworkUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 91995e3..598667e 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -11,7 +11,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.events.interaction.AttackEntityEvent; import nl.devpieter.utilize.events.interaction.InteractEntityEvent; import nl.devpieter.utilize.events.interaction.InteractItemEvent; @@ -19,7 +18,7 @@ import nl.devpieter.utilize.events.interaction.block.*; import nl.devpieter.utilize.events.inventory.HotbarSlotChangedEvent; import nl.devpieter.utilize.events.inventory.SlotClickEvent; -import nl.devpieter.utilize.utils.InventoryUtils; +import nl.devpieter.utilize.utils.minecraft.InventoryUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/nl/devpieter/utilize/utils/MathUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java similarity index 97% rename from src/main/java/nl/devpieter/utilize/utils/MathUtils.java rename to src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java index 1b9ad10..c0df3ea 100644 --- a/src/main/java/nl/devpieter/utilize/utils/MathUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.common; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; diff --git a/src/main/java/nl/devpieter/utilize/utils/RandomUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java similarity index 89% rename from src/main/java/nl/devpieter/utilize/utils/RandomUtils.java rename to src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java index e110cba..47e3cac 100644 --- a/src/main/java/nl/devpieter/utilize/utils/RandomUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.common; public class RandomUtils { diff --git a/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java similarity index 97% rename from src/main/java/nl/devpieter/utilize/utils/ClientUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java index 30fb87f..a1422cc 100644 --- a/src/main/java/nl/devpieter/utilize/utils/ClientUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java similarity index 98% rename from src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java index 7d1d56d..ce98f1c 100644 --- a/src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; diff --git a/src/main/java/nl/devpieter/utilize/utils/InteractionUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java similarity index 89% rename from src/main/java/nl/devpieter/utilize/utils/InteractionUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java index 64774e0..b02ec89 100644 --- a/src/main/java/nl/devpieter/utilize/utils/InteractionUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.screen.slot.SlotActionType; diff --git a/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java similarity index 98% rename from src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java index e5f5137..0bcbd97 100644 --- a/src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.Item; diff --git a/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java similarity index 94% rename from src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java index cbf3554..9df6a62 100644 --- a/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.network.packet.Packet; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java similarity index 97% rename from src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java index 5a12a8a..02efbcf 100644 --- a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.block.Block; import net.minecraft.block.BlockState; diff --git a/src/main/java/nl/devpieter/utilize/utils/SoundUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java similarity index 94% rename from src/main/java/nl/devpieter/utilize/utils/SoundUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java index 5fba0ba..dcffd54 100644 --- a/src/main/java/nl/devpieter/utilize/utils/SoundUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.sound.SoundInstance; diff --git a/src/main/java/nl/devpieter/utilize/utils/TextUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java similarity index 94% rename from src/main/java/nl/devpieter/utilize/utils/TextUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java index d592763..4aabdb4 100644 --- a/src/main/java/nl/devpieter/utilize/utils/TextUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.text.MutableText; import net.minecraft.text.Style; diff --git a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java similarity index 93% rename from src/main/java/nl/devpieter/utilize/utils/WorldUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java index fe233c8..373befb 100644 --- a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java @@ -1,4 +1,4 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -6,6 +6,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import nl.devpieter.utilize.utils.common.MathUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From fd692de9f7c7f81d2d426815b04f46d4b5268515 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:10:51 +0200 Subject: [PATCH 06/41] =?UTF-8?q?=F0=9F=94=A7=20Add=20interaction=20events?= =?UTF-8?q?=20for=20entity=20attacks=20and=20item=20interactions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/interaction/AttackEntityEvent.java | 17 ---- .../events/interaction/InteractItemEvent.java | 17 ---- .../interaction/entity/AttackEntityEvent.java | 21 +++++ .../entity/AttackEntityReturnEvent.java | 7 ++ .../entity/AttackEntityTailEvent.java | 7 ++ .../{ => entity}/InteractEntityEvent.java | 12 ++- .../entity/InteractEntityReturnEvent.java | 37 +++++++++ .../entity/InteractEntityTailEvent.java | 8 ++ .../interaction/item/InteractItemEvent.java | 21 +++++ .../item/InteractItemReturnEvent.java | 30 ++++++++ .../item/InteractItemTailEvent.java | 8 ++ .../ClientPlayerInteractionManagerMixin.java | 77 +++++++++++++------ 12 files changed, 199 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityTailEvent.java rename src/main/java/nl/devpieter/utilize/events/interaction/{ => entity}/InteractEntityEvent.java (55%) create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityTailEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemReturnEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemTailEvent.java diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java deleted file mode 100644 index 2c25d4e..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.devpieter.utilize.events.interaction; - -import net.minecraft.entity.Entity; -import nl.devpieter.sees.event.SCancelableEventBase; - -public class AttackEntityEvent extends SCancelableEventBase { - - private final Entity target; - - public AttackEntityEvent(Entity target) { - this.target = target; - } - - public Entity target() { - return target; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java deleted file mode 100644 index 2ba9706..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.devpieter.utilize.events.interaction; - -import net.minecraft.util.Hand; -import nl.devpieter.sees.event.SCancelableEventBase; - -public class InteractItemEvent extends SCancelableEventBase { - - private final Hand hand; - - public InteractItemEvent(Hand hand) { - this.hand = hand; - } - - public Hand hand() { - return hand; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityEvent.java new file mode 100644 index 0000000..825da1b --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityEvent.java @@ -0,0 +1,21 @@ +package nl.devpieter.utilize.events.interaction.entity; + +import net.minecraft.entity.Entity; +import nl.devpieter.sees.event.SCancelableEventBase; + +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.AttackKeyPressedEvent} to directly cancel the attack action. + */ +public class AttackEntityEvent extends SCancelableEventBase { + + private final Entity target; + + public AttackEntityEvent(Entity target) { + this.target = target; + } + + public Entity target() { + return this.target; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityReturnEvent.java new file mode 100644 index 0000000..28a343a --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityReturnEvent.java @@ -0,0 +1,7 @@ +package nl.devpieter.utilize.events.interaction.entity; + +import net.minecraft.entity.Entity; +import nl.devpieter.sees.event.SEvent; + +public record AttackEntityReturnEvent(Entity target) implements SEvent { +} \ No newline at end of file diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityTailEvent.java new file mode 100644 index 0000000..de30110 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/AttackEntityTailEvent.java @@ -0,0 +1,7 @@ +package nl.devpieter.utilize.events.interaction.entity; + +import net.minecraft.entity.Entity; +import nl.devpieter.sees.event.SEvent; + +public record AttackEntityTailEvent(Entity target) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityEvent.java similarity index 55% rename from src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java rename to src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityEvent.java index 5b57904..dbe3b83 100644 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityEvent.java @@ -1,24 +1,28 @@ -package nl.devpieter.utilize.events.interaction; +package nl.devpieter.utilize.events.interaction.entity; import net.minecraft.entity.Entity; import net.minecraft.util.Hand; import nl.devpieter.sees.event.SCancelableEventBase; +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.UseKeyPressedEvent} to directly cancel the use action. + */ public class InteractEntityEvent extends SCancelableEventBase { private final Entity target; private final Hand hand; public InteractEntityEvent(Entity target, Hand hand) { - this.target = target; this.hand = hand; + this.target = target; } public Entity target() { - return target; + return this.target; } public Hand hand() { - return hand; + return this.hand; } } diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityReturnEvent.java new file mode 100644 index 0000000..c02028c --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityReturnEvent.java @@ -0,0 +1,37 @@ +package nl.devpieter.utilize.events.interaction.entity; + +import net.minecraft.entity.Entity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import nl.devpieter.sees.event.SReturnableEvent; + +public class InteractEntityReturnEvent implements SReturnableEvent { + + private final Entity target; + private final Hand hand; + private ActionResult returnValue; + + public InteractEntityReturnEvent(Entity target, Hand hand, ActionResult returnValue) { + this.target = target; + this.hand = hand; + this.returnValue = returnValue; + } + + public Entity target() { + return this.target; + } + + public Hand hand() { + return this.hand; + } + + @Override + public ActionResult getResult() { + return this.returnValue; + } + + @Override + public void setResult(ActionResult result) { + this.returnValue = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityTailEvent.java new file mode 100644 index 0000000..823dec8 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityTailEvent.java @@ -0,0 +1,8 @@ +package nl.devpieter.utilize.events.interaction.entity; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Hand; +import nl.devpieter.sees.event.SEvent; + +public record InteractEntityTailEvent(Entity target, Hand hand) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemEvent.java new file mode 100644 index 0000000..fb8af87 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemEvent.java @@ -0,0 +1,21 @@ +package nl.devpieter.utilize.events.interaction.item; + +import net.minecraft.util.Hand; +import nl.devpieter.sees.event.SCancelableEventBase; + +/** + * It's not recommended to directly cancel this event, as it may cause issues with the game logic. + * Instead, use the {@link nl.devpieter.utilize.events.interaction.keybinding.UseKeyPressedEvent} to directly cancel the use action. + */ +public class InteractItemEvent extends SCancelableEventBase { + + private final Hand hand; + + public InteractItemEvent(Hand hand) { + this.hand = hand; + } + + public Hand hand() { + return this.hand; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemReturnEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemReturnEvent.java new file mode 100644 index 0000000..22d8bbe --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemReturnEvent.java @@ -0,0 +1,30 @@ +package nl.devpieter.utilize.events.interaction.item; + +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import nl.devpieter.sees.event.SReturnableEvent; + +public class InteractItemReturnEvent implements SReturnableEvent { + + private final Hand hand; + private ActionResult returnValue; + + public InteractItemReturnEvent(Hand hand, ActionResult returnValue) { + this.hand = hand; + this.returnValue = returnValue; + } + + public Hand hand() { + return this.hand; + } + + @Override + public ActionResult getResult() { + return this.returnValue; + } + + @Override + public void setResult(ActionResult result) { + this.returnValue = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemTailEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemTailEvent.java new file mode 100644 index 0000000..913bd5c --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/item/InteractItemTailEvent.java @@ -0,0 +1,8 @@ +package nl.devpieter.utilize.events.interaction.item; + +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import nl.devpieter.sees.event.SEvent; + +public record InteractItemTailEvent(Hand hand) implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 598667e..1ef8faa 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -11,11 +11,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.events.interaction.AttackEntityEvent; -import nl.devpieter.utilize.events.interaction.InteractEntityEvent; -import nl.devpieter.utilize.events.interaction.InteractItemEvent; import nl.devpieter.utilize.events.interaction.UpdateBlockBreakingProgressEvent; import nl.devpieter.utilize.events.interaction.block.*; +import nl.devpieter.utilize.events.interaction.entity.*; +import nl.devpieter.utilize.events.interaction.item.InteractItemEvent; +import nl.devpieter.utilize.events.interaction.item.InteractItemReturnEvent; +import nl.devpieter.utilize.events.interaction.item.InteractItemTailEvent; import nl.devpieter.utilize.events.inventory.HotbarSlotChangedEvent; import nl.devpieter.utilize.events.inventory.SlotClickEvent; import nl.devpieter.utilize.utils.minecraft.InventoryUtils; @@ -49,24 +50,6 @@ private void onUpdateBlockBreakingProgress(BlockPos pos, Direction direction, Ca cir.setReturnValue(false); } - @Inject(at = @At("HEAD"), method = "breakBlock", cancellable = true) - private void onBreakBlock(BlockPos pos, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new BreakBlockEvent(pos))) return; - - this.cancelBlockBreaking(); - cir.setReturnValue(false); - } - - @Inject(at = @At("RETURN"), method = "breakBlock", cancellable = true) - private void onBreakBlockReturn(BlockPos pos, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new BreakBlockReturnEvent(pos, cir.getReturnValue()))); - } - - @Inject(at = @At("TAIL"), method = "breakBlock") - private void onBreakBlockTail(BlockPos pos, CallbackInfoReturnable cir) { - this.sees.dispatch(new BreakBlockTailEvent(pos)); - } - @Inject(at = @At("HEAD"), method = "attackBlock", cancellable = true) private void onAttackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { if (!this.sees.dispatch(new AttackBlockEvent(pos, direction))) return; @@ -85,6 +68,24 @@ private void onAttackBlockTail(BlockPos pos, Direction direction, CallbackInfoRe this.sees.dispatch(new AttackBlockTailEvent(pos, direction)); } + @Inject(at = @At("HEAD"), method = "breakBlock", cancellable = true) + private void onBreakBlock(BlockPos pos, CallbackInfoReturnable cir) { + if (!this.sees.dispatch(new BreakBlockEvent(pos))) return; + + this.cancelBlockBreaking(); + cir.setReturnValue(false); + } + + @Inject(at = @At("RETURN"), method = "breakBlock", cancellable = true) + private void onBreakBlockReturn(BlockPos pos, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new BreakBlockReturnEvent(pos, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "breakBlock") + private void onBreakBlockTail(BlockPos pos, CallbackInfoReturnable cir) { + this.sees.dispatch(new BreakBlockTailEvent(pos)); + } + @Inject(at = @At("HEAD"), method = "interactBlock", cancellable = true) private void onInteractBlock(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { if (!this.sees.dispatch(new InteractBlockEvent(hand, hitResult))) return; @@ -105,22 +106,48 @@ private void onInteractBlockTail(ClientPlayerEntity player, Hand hand, BlockHitR private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { if (!this.sees.dispatch(new InteractItemEvent(hand))) return; cir.setReturnValue(ActionResult.FAIL); - cir.cancel(); + } + + @Inject(at = @At("RETURN"), method = "interactItem", cancellable = true) + private void onInteractItemReturn(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new InteractItemReturnEvent(hand, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "interactItem") + private void onInteractItemTail(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { + this.sees.dispatch(new InteractItemTailEvent(hand)); } @Inject(at = @At("HEAD"), method = "attackEntity", cancellable = true) private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) { if (!this.sees.dispatch(new AttackEntityEvent(target))) return; - ci.cancel(); -// Utilize.blockSwingHandOnce(); + } + + @Inject(at = @At("RETURN"), method = "attackEntity") + private void onAttackEntityReturn(PlayerEntity player, Entity target, CallbackInfo ci) { + this.sees.dispatch(new AttackEntityReturnEvent(target)); + } + + @Inject(at = @At("TAIL"), method = "attackEntity") + private void onAttackEntityTail(PlayerEntity player, Entity target, CallbackInfo ci) { + this.sees.dispatch(new AttackEntityTailEvent(target)); } @Inject(at = @At("HEAD"), method = "interactEntity", cancellable = true) private void onInteractEntity(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { if (!this.sees.dispatch(new InteractEntityEvent(target, hand))) return; cir.setReturnValue(ActionResult.FAIL); - cir.cancel(); + } + + @Inject(at = @At("RETURN"), method = "interactEntity", cancellable = true) + private void onInteractEntityReturn(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { + cir.setReturnValue(this.sees.dispatchWithResult(new InteractEntityReturnEvent(target, hand, cir.getReturnValue()))); + } + + @Inject(at = @At("TAIL"), method = "interactEntity") + private void onInteractEntityTail(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { + this.sees.dispatch(new InteractEntityTailEvent(target, hand)); } @Inject(at = @At("HEAD"), method = "clickSlot", cancellable = true) From 91d8de325be1055d8b3a7ae4ceabbeba4bfb2ca3 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:06:53 +0200 Subject: [PATCH 07/41] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20Implement=20shutdown?= =?UTF-8?q?=20method=20in=20SettingManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nl/devpieter/utilize/Utilize.java | 2 ++ .../java/nl/devpieter/utilize/setting/SettingManager.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 8749912..12f5fef 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -12,6 +12,7 @@ import nl.devpieter.utilize.listeners.packet.OpenScreenPacketListener; import nl.devpieter.utilize.listeners.packet.SetTradeOffersPacketListener; import nl.devpieter.utilize.managers.PacketManager; +import nl.devpieter.utilize.setting.SettingManager; import nl.devpieter.utilize.task.TaskManager; import nl.devpieter.utilize.utils.minecraft.ClientUtils; import org.slf4j.Logger; @@ -42,6 +43,7 @@ public void onInitializeClient() { this.logger.info("Shutting down Utilize..."); TaskManager.shutdown(); + SettingManager.shutdown(); AsyncRequest.shutdown(); }); diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index 22b94c5..cc3da25 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -38,6 +38,13 @@ public static SettingManager getInstance() { return INSTANCE; } + public static void shutdown() { + if (INSTANCE == null) return; + + INSTANCE.forceSaveQueue(); + INSTANCE = null; + } + public void tick() { if (this.saveQueue.isEmpty()) return; From 4d4dfc1fd8fab8e009254c2501d554416c276161 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:21:55 +0200 Subject: [PATCH 08/41] =?UTF-8?q?=F0=9F=94=A7=20Update=20logger=20initiali?= =?UTF-8?q?zation=20in=20SettingManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nl/devpieter/utilize/Utilize.java | 1 + .../java/nl/devpieter/utilize/setting/SettingManager.java | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 12f5fef..7efb77b 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -51,6 +51,7 @@ public void onInitializeClient() { } public static Utilize getInstance() { + if (INSTANCE == null) throw new IllegalStateException("Utilize has not been initialized yet!"); return INSTANCE; } diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index cc3da25..bb9c874 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -3,11 +3,11 @@ 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.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.*; import java.time.Duration; @@ -21,8 +21,7 @@ public class SettingManager { private static SettingManager INSTANCE; private final Gson gson = new Gson(); - private final Utilize utilize = Utilize.getInstance(); - private final Logger logger = this.utilize.getLogger(); + private final Logger logger = LoggerFactory.getLogger("Utilize - SettingManager"); private final Duration saveInterval = Duration.ofSeconds(15); private final HashMap>> saveQueue = new HashMap<>(); From f12adb354bf9945c3260b235a6b3263cae369a4e Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:51:14 +0200 Subject: [PATCH 09/41] =?UTF-8?q?=F0=9F=94=A7=20Remove=20static=20methods?= =?UTF-8?q?=20+=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 20 ++++++++----------- .../devpieter/utilize/http/AsyncRequest.java | 5 +++-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 7efb77b..05344f8 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -28,7 +28,7 @@ public class Utilize implements ClientModInitializer { private final Logger logger = LoggerFactory.getLogger("Utilize"); private final ModContainer modContainer = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); - private static final List BLOCK_SCREEN_IDS = new ArrayList<>(); + private final List blockScreenIds = new ArrayList<>(); @Override public void onInitializeClient() { @@ -55,10 +55,6 @@ public static Utilize getInstance() { return INSTANCE; } - public Logger getLogger() { - return this.logger; - } - public String getUtilizeVersion() { return this.modContainer.getMetadata().getVersion().getFriendlyString(); } @@ -71,13 +67,13 @@ public String getUserAgent() { return String.format("Utilize/%s (%s;)", this.getUtilizeVersion(), this.getMinecraftVersion()); } - public static boolean shouldBlockScreenId(int screenId) { - return BLOCK_SCREEN_IDS.contains(screenId); + public boolean shouldBlockScreenId(int screenId) { + return blockScreenIds.contains(screenId); } - public static void blockScreenId(int screenId) { - if (BLOCK_SCREEN_IDS.contains(screenId)) return; - BLOCK_SCREEN_IDS.add(screenId); + public void blockScreenId(int screenId) { + if (this.blockScreenIds.contains(screenId)) return; + this.blockScreenIds.add(screenId); if (!ClientUtils.hasPlayer()) return; MinecraftClient client = MinecraftClient.getInstance(); @@ -91,7 +87,7 @@ public static void blockScreenId(int screenId) { }); } - public static void blockedScreenId(int screenId) { - BLOCK_SCREEN_IDS.removeIf(id -> id == screenId); + public void blockedScreenId(int screenId) { + this.blockScreenIds.removeIf(id -> id == screenId); } } diff --git a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java index 59594bf..6ea8538 100644 --- a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java +++ b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java @@ -13,11 +13,14 @@ public abstract class AsyncRequest extends RequestHelper { private final List> callbacks = new ArrayList<>(); private CompletableFuture future; + protected abstract @Nullable T requestAsync() throws Exception; + public AsyncRequest() { this(null); } public AsyncRequest(@Nullable ResultConsumer requestCallback) { + if (requestCallback == null) return; this.callbacks.add(requestCallback); } @@ -33,8 +36,6 @@ public static void shutdown() { } } - protected abstract @Nullable T requestAsync() throws Exception; - public void addCallback(@Nullable ResultConsumer callback) { if (callback == null) return; this.callbacks.add(callback); From 05d737c35cb9d1d30dba3cb4d7552e2f6be66f3f Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:53:09 +0200 Subject: [PATCH 10/41] =?UTF-8?q?=F0=9F=90=9E=20Fix=20still=20using=20stat?= =?UTF-8?q?ic=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utilize/listeners/packet/OpenScreenPacketListener.java | 2 +- .../listeners/packet/SetTradeOffersPacketListener.java | 2 +- .../nl/devpieter/utilize/mixins/ClientConnectionMixin.java | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java index 40b7190..4d8d77b 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java @@ -21,7 +21,7 @@ public boolean onPacket(OpenScreenS2CPacket packet) { ScreenOpenedPacketEvent event = new ScreenOpenedPacketEvent(packet.getSyncId(), packet.getScreenHandlerType(), packet.getName()); if (!this.sees.dispatch(event)) return false; - Utilize.blockScreenId(packet.getSyncId()); + Utilize.getInstance().blockScreenId(packet.getSyncId()); return false; } } diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java index cdc5742..af6ec22 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java @@ -21,7 +21,7 @@ public boolean onPacket(SetTradeOffersS2CPacket packet) { TradesOfferedPacketEvent event = new TradesOfferedPacketEvent(packet.getSyncId(), packet.getOffers()); if (!this.sees.dispatch(event)) return false; - Utilize.blockScreenId(packet.getSyncId()); + Utilize.getInstance().blockScreenId(packet.getSyncId()); return true; } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java index 05cc033..edde4dd 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java @@ -29,11 +29,13 @@ private static void onHandlePacket(Packet packet, private static void onHandlePacketTail(Packet packet, PacketListener listener, CallbackInfo ci) { if (packet instanceof OpenScreenS2CPacket openScreenPacket) { + Utilize utilize = Utilize.getInstance(); + int syncId = openScreenPacket.getSyncId(); - if (!Utilize.shouldBlockScreenId(syncId)) return; + if (!utilize.shouldBlockScreenId(syncId)) return; NetworkUtils.sendPacket(new CloseHandledScreenC2SPacket(openScreenPacket.getSyncId())); - Utilize.blockedScreenId(syncId); + utilize.blockedScreenId(syncId); ci.cancel(); } } From db3cc257e774f4594be7e563eca1b55917bdce65 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:10:35 +0200 Subject: [PATCH 11/41] =?UTF-8?q?=F0=9F=94=A7=20Update=20maven-publish.yml?= =?UTF-8?q?=20to=20trigger=20builds=20on=20snapshot=20branches=20instead?= =?UTF-8?q?=20of=20dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 4fe5bde..5848e62 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -4,7 +4,7 @@ on: pull_request: branches: - main - - dev + - snapshot/* types: [ closed ] workflow_dispatch: @@ -38,7 +38,7 @@ jobs: run: chmod +x gradlew - name: Build and publish to Maven repository (snapshot) - if: github.ref_name == 'dev' + if: startsWith(github.ref_name, 'snapshot/') run: ./gradlew publish env: SNAPSHOT_BUILD: true From 8b41b0b5f08ddc4dc58896740ffff8ea6cc25021 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:54:23 +0200 Subject: [PATCH 12/41] Update versioning scheme to include build number for snapshot releases --- .github/workflows/maven-publish.yml | 2 ++ build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 5848e62..6f8729e 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -42,6 +42,7 @@ jobs: run: ./gradlew publish env: SNAPSHOT_BUILD: true + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_SNAPSHOT }} @@ -50,6 +51,7 @@ jobs: if: github.ref_name == 'main' run: ./gradlew publish env: + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_RELEASE }} diff --git a/build.gradle b/build.gradle index afc366a..d184aaf 100644 --- a/build.gradle +++ b/build.gradle @@ -6,12 +6,12 @@ plugins { def targetJavaVersion = 21 -def hash = System.getenv("GITHUB_SHA")?.substring(0, 7) ?: "dev" def isSnapshot = System.getenv('SNAPSHOT_BUILD')?.toBoolean() ?: false +def buildNumber = System.getenv('BUILD_NUMBER') ?: 'dev' group = maven_group archivesBaseName = archives_base_name -version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-${hash}-SNAPSHOT" : "") +version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-SNAPSHOT+${buildNumber}" : "") repositories { maven { From 9e1b454d1ec6a4c1f39187f71bd83865dc29d78d Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:56:17 +0200 Subject: [PATCH 13/41] Update versioning scheme to include build number for snapshot releases (#14) --- .github/workflows/maven-publish.yml | 2 ++ build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 5848e62..6f8729e 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -42,6 +42,7 @@ jobs: run: ./gradlew publish env: SNAPSHOT_BUILD: true + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_SNAPSHOT }} @@ -50,6 +51,7 @@ jobs: if: github.ref_name == 'main' run: ./gradlew publish env: + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_RELEASE }} diff --git a/build.gradle b/build.gradle index 855e0e0..d14ba6b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,12 +6,12 @@ plugins { def targetJavaVersion = 21 -def hash = System.getenv("GITHUB_SHA")?.substring(0, 7) ?: "dev" def isSnapshot = System.getenv('SNAPSHOT_BUILD')?.toBoolean() ?: false +def buildNumber = System.getenv('BUILD_NUMBER') ?: 'dev' group = maven_group archivesBaseName = archives_base_name -version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-${hash}-SNAPSHOT" : "") +version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-SNAPSHOT+${buildNumber}" : "") repositories { repositories { From f76322e8009335b1bd1e16f73095ac0516bf77fc Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:57:48 +0200 Subject: [PATCH 14/41] Update versioning scheme to include build number for snapshot releases (#14) (#15) --- .github/workflows/maven-publish.yml | 2 ++ build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 5848e62..6f8729e 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -42,6 +42,7 @@ jobs: run: ./gradlew publish env: SNAPSHOT_BUILD: true + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_SNAPSHOT }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_SNAPSHOT }} @@ -50,6 +51,7 @@ jobs: if: github.ref_name == 'main' run: ./gradlew publish env: + BUILD_NUMBER: ${{ github.run_number }} ORG_GRADLE_PROJECT_mavenRepositoryUrl: ${{ secrets.MAVEN_REPOSITORY_URL_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryUsername: ${{ secrets.MAVEN_REPOSITORY_USERNAME_RELEASE }} ORG_GRADLE_PROJECT_mavenRepositoryPassword: ${{ secrets.MAVEN_REPOSITORY_PASSWORD_RELEASE }} diff --git a/build.gradle b/build.gradle index 855e0e0..d14ba6b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,12 +6,12 @@ plugins { def targetJavaVersion = 21 -def hash = System.getenv("GITHUB_SHA")?.substring(0, 7) ?: "dev" def isSnapshot = System.getenv('SNAPSHOT_BUILD')?.toBoolean() ?: false +def buildNumber = System.getenv('BUILD_NUMBER') ?: 'dev' group = maven_group archivesBaseName = archives_base_name -version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-${hash}-SNAPSHOT" : "") +version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-SNAPSHOT+${buildNumber}" : "") repositories { repositories { From 1af6136b4aca1a7e29ce1cfc4d4e2d4b9ff76aa6 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 18 Jul 2025 11:10:06 +0200 Subject: [PATCH 15/41] =?UTF-8?q?=F0=9F=91=8C=20Refactor=20FileUtils,=20Ma?= =?UTF-8?q?thUtils,=20and=20RandomUtils=20for=20improved=20functionality?= =?UTF-8?q?=20and=20clarity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utilize/utils/common/FileUtils.java | 34 +++++++++- .../utilize/utils/common/MathUtils.java | 10 +-- .../utilize/utils/common/RandomUtils.java | 65 ++++++++++++++++++- 3 files changed, 101 insertions(+), 8 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java index 5e4c640..2e10dd6 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java @@ -4,7 +4,23 @@ public class FileUtils { - public static boolean tryCreateDirectories(File file) { + public static boolean doesFileExist(File file) { + try { + return file.exists(); + } catch (Exception e) { + return false; + } + } + + public static boolean doesDirectoryExist(File directory) { + try { + return directory.exists() && directory.isDirectory(); + } catch (Exception e) { + return false; + } + } + + public static boolean tryCreateParentDirectories(File file) { try { File parentDir = file.getParentFile(); if (parentDir.exists()) return true; @@ -16,13 +32,27 @@ public static boolean tryCreateDirectories(File file) { } public static boolean tryCreateFile(File file) { + return tryCreateFile(file, true); + } + + public static boolean tryCreateFile(File file, boolean createParentDirectories) { try { if (file.exists()) return true; - if (!tryCreateDirectories(file)) return false; + if (createParentDirectories && !tryCreateParentDirectories(file)) return false; return file.createNewFile(); } catch (Exception e) { return false; } } + + public static boolean tryDeleteFile(File file) { + try { + if (!file.exists()) return true; + + return file.delete(); + } catch (Exception e) { + return false; + } + } } diff --git a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java index c0df3ea..02e79a2 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java @@ -18,11 +18,11 @@ public class MathUtils { } public static double notNegative(double value) { - return value < 0 ? 0 : value; + return Math.max(0, value); } public static double notPositive(double value) { - return value > 0 ? 0 : value; + return Math.min(0, value); } public static double notBelow(double value, double min) { @@ -34,21 +34,21 @@ public static double notAbove(double value, double max) { } /** - * @param percentage The percentage to reduce by (0-100). + * @param percentage The percentage to reduce by (e.g., 10 for 10%). */ public static double reduceByPercentage(double value, double percentage) { return value - (value * (percentage / 100)); } /** - * @param percentage The percentage to increase by (0-100). + * @param percentage The percentage to increase by (e.g., 10 for 10%). */ public static double increaseByPercentage(double value, double percentage) { return value + (value * (percentage / 100)); } /** - * @param percentage The percentage of the value to return (0-100). + * @param percentage The percentage of the value to return (e.g., 10 for 10%). */ public static double getPercentage(double value, double percentage) { return value * (percentage / 100); diff --git a/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java index 47e3cac..09e1bcb 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java @@ -3,13 +3,76 @@ public class RandomUtils { /** - * @param chanceForTrue The chance to return true (0-100). + * @param chanceForTrue The chance to return true (0 to 100). + * @return True with the specified probability percentage. */ public static boolean randomChance(double chanceForTrue) { + if (chanceForTrue <= 0) return false; + if (chanceForTrue >= 100) return true; + return Math.random() * 100 < chanceForTrue; } + /** + * @param min The minimum value (inclusive). + * @param max The maximum value (inclusive). + * @return A random integer between min and max, inclusive. + */ public static int randomIntInclusive(int min, int max) { + if (min == max) return min; + + if (min > max) { + int temp = min; + min = max; + max = temp; + } + return (int) (Math.random() * (max - min + 1)) + min; } + + /** + * @param min The minimum value (inclusive). + * @param max The maximum value (inclusive). + * @param precision The precision to round the result to. (e.g., 0.01 for two decimal places). + * @return A random double between min and max, inclusive, rounded to the specified precision. + */ + public static double randomDoubleInclusive(double min, double max, double precision) { + if (precision <= 0) throw new IllegalArgumentException("Precision must be positive."); + if (min == max) return min; + + if (min > max) { + double temp = min; + min = max; + max = temp; + } + + double range = max - min; + double randomValue = Math.random() * range + min; + + double rounded = Math.round(randomValue / precision) * precision; + return Math.min(rounded, max); + } + + /** + * @param min The minimum value (inclusive). + * @param max The maximum value (inclusive). + * @param precision The precision to round the result to. (e.g., 0.01f for two decimal places). + * @return A random float between min and max, inclusive, rounded to the specified precision. + */ + public static float randomFloatInclusive(float min, float max, float precision) { + if (precision <= 0f) throw new IllegalArgumentException("Precision must be positive."); + if (min == max) return min; + + if (min > max) { + float temp = min; + min = max; + max = temp; + } + + float range = max - min; + float randomValue = (float) Math.random() * range + min; + + float rounded = Math.round(randomValue / precision) * precision; + return Math.min(rounded, max); + } } From f67e284df9b48a42dc02b886feb66ade5136da4c Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 18 Jul 2025 11:36:54 +0200 Subject: [PATCH 16/41] Align version/1.1.0 with main (#21) * Update issue templates (#16) * Update issue templates (#17) --- .github/ISSUE_TEMPLATE/bug_report.md | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..6939294 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Version** + - Mod Version [e.g. 1.21.1] + - Minecraft Version [e.g. 1.2.3] + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. From 5901dc66b7ff4acdeded9f56845518ea3d9605bf Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sat, 30 Aug 2025 16:12:22 +0200 Subject: [PATCH 17/41] =?UTF-8?q?=E2=9C=A8=20Implement=20shutdown=20functi?= =?UTF-8?q?onality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nl/devpieter/utilize/Utilize.java | 10 ++++++++++ .../nl/devpieter/utilize/setting/SettingManager.java | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 65a33d8..9595236 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -1,15 +1,18 @@ package nl.devpieter.utilize; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; +import nl.devpieter.utilize.http.AsyncRequest; import nl.devpieter.utilize.listeners.packet.EntityTrackerUpdatePacketListener; import nl.devpieter.utilize.listeners.packet.OpenScreenPacketListener; import nl.devpieter.utilize.listeners.packet.SetTradeOffersPacketListener; import nl.devpieter.utilize.managers.PacketManager; +import nl.devpieter.utilize.setting.SettingManager; import nl.devpieter.utilize.utils.ClientUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,6 +37,13 @@ public void onInitializeClient() { packetManager.subscribe(new OpenScreenPacketListener()); packetManager.subscribe(new SetTradeOffersPacketListener()); + ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { + LOGGER.info("Shutting down Utilize..."); + + SettingManager.shutdown(); + AsyncRequest.shutdown(); + }); + if (!ClientUtils.isDevEnv()) return; LOGGER.info("Utilize is running in a development environment."); } diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index 50f48b6..c472464 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -35,6 +35,13 @@ public static SettingManager getInstance() { return INSTANCE; } + public static void shutdown() { + if (INSTANCE == null) return; + + INSTANCE.forceSaveQueue(); + INSTANCE = null; + } + public void tick() { if (this.saveQueue.isEmpty()) return; From 132d36137b481032d15d19eb4348ddf3abd2bcfb Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sat, 30 Aug 2025 16:42:04 +0200 Subject: [PATCH 18/41] =?UTF-8?q?=E2=9C=A8=20Refactor=20setting=20manager?= =?UTF-8?q?=20initialization=20and=20tick=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nl/devpieter/utilize/Utilize.java | 17 +++++++++++++++-- .../utilize/mixins/ClientPlayerEntityMixin.java | 4 ---- .../utilize/mixins/MinecraftClientMixin.java | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 9595236..0a516dd 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -22,6 +22,9 @@ public class Utilize implements ClientModInitializer { + private static Utilize INSTANCE; + private static boolean INITIALIZED = false; + private static final ModContainer MOD_CONTAINER = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); @Deprecated(since = "1.0.11", forRemoval = true) @@ -32,6 +35,8 @@ public class Utilize implements ClientModInitializer { @Override public void onInitializeClient() { + INSTANCE = this; + PacketManager packetManager = PacketManager.getInstance(); packetManager.subscribe(new EntityTrackerUpdatePacketListener()); packetManager.subscribe(new OpenScreenPacketListener()); @@ -44,8 +49,16 @@ public void onInitializeClient() { AsyncRequest.shutdown(); }); - if (!ClientUtils.isDevEnv()) return; - LOGGER.info("Utilize is running in a development environment."); + INITIALIZED = true; + } + + public static Utilize getInstance() { + if (INSTANCE == null) throw new IllegalStateException("Utilize has not been initialized yet!"); + return INSTANCE; + } + + public static boolean isInitialized() { + return INITIALIZED; } @Deprecated(since = "1.0.11", forRemoval = true) diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index b01970d..d23ac13 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -21,9 +21,6 @@ @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - @Unique - private final SettingManager settingManager = SettingManager.getInstance(); - @Unique private final Sees sees = Sees.getInstance(); @@ -45,7 +42,6 @@ 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/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index bfe254c..4a89871 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -3,7 +3,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import nl.devpieter.sees.Sees; +import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.events.screen.ScreenChangedEvent; +import nl.devpieter.utilize.setting.SettingManager; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -22,6 +24,9 @@ public class MinecraftClientMixin { @Unique private final Sees sees = Sees.getInstance(); + @Unique + private SettingManager settingManager; + @Unique private Screen previousScreen; @@ -34,4 +39,16 @@ private void onSetScreenHead(Screen screen, CallbackInfo ci) { private void onSetScreenTail(Screen screen, CallbackInfo ci) { this.sees.call(new ScreenChangedEvent(this.previousScreen, screen)); } + + @Inject(at = @At("TAIL"), method = "tick") + private void onTick(CallbackInfo ci) { + if (settingManager == null) { + if (!Utilize.isInitialized()) return; + settingManager = SettingManager.getInstance(); + } + + if (settingManager != null) { + settingManager.tick(); + } + } } From c8c39652104691828f3efd0441bce7d71e12bd82 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Sat, 30 Aug 2025 16:43:19 +0200 Subject: [PATCH 19/41] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Bump=20version=20to?= =?UTF-8?q?=201.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 70aa46c..bfc3d12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ loader_version=0.16.10 # Mod Properties artifact_id=utilize -mod_version=1.0.11 +mod_version=1.0.12 maven_group=nl.devpieter archives_base_name=Utilize From 572964f5d13e8381e988ac9e34874a37121603d0 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:51:17 +0200 Subject: [PATCH 20/41] =?UTF-8?q?=F0=9F=91=8C=20Enhance=20null=20handling?= =?UTF-8?q?=20in=20ISetting=20and=20SettingBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nl/devpieter/utilize/setting/base/SettingBase.java | 4 ++++ .../nl/devpieter/utilize/setting/interfaces/ISetting.java | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java index 08c4705..d2d8997 100644 --- a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java +++ b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java @@ -45,6 +45,10 @@ public T getDefault() { @Override public void setValue(T value) { + if (!allowNull && value == null) { + throw new IllegalArgumentException("Null value not allowed for setting: " + identifier); + } + this.value = value; } } diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java index 7a45f1e..f7eeab7 100644 --- a/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java @@ -23,7 +23,13 @@ default void reset() { } default boolean isDefaultValueSet() { - return !this.getValue().equals(this.getDefault()); + T value = getValue(); + T defaultValue = getDefault(); + + if (value == null && defaultValue == null) return true; + if (value == null || defaultValue == null) return false; + + return value.equals(defaultValue); } default KeyedSetting asKeyedSetting() { From 07fe9068fffaeb45680a39631118ceff44055147 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:52:03 +0200 Subject: [PATCH 21/41] =?UTF-8?q?=F0=9F=9A=80=20Introduce=20IMapSetting=20?= =?UTF-8?q?and=20IPolymorphicSetting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utilize/models/PolymorphicValue.java | 41 ++++++++++++ .../setting/interfaces/IMapSetting.java | 18 ++++++ .../interfaces/IPolymorphicSetting.java | 15 +++++ .../utilize/setting/settings/MapSetting.java | 62 +++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/IMapSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/interfaces/IPolymorphicSetting.java create mode 100644 src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java diff --git a/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java b/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java new file mode 100644 index 0000000..209c04d --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java @@ -0,0 +1,41 @@ +package nl.devpieter.utilize.models; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import org.jetbrains.annotations.NotNull; + +public class PolymorphicValue { + + private static final Gson gson = new Gson(); + + private String className; + private JsonElement data; + + private transient T instance; + + public PolymorphicValue() { + } + + public PolymorphicValue(@NotNull T value) { + this.className = value.getClass().getName(); + this.data = gson.toJsonTree(value); + this.instance = value; + } + + public T getValue(Class baseType) { + if (instance != null) return instance; + + try { + Class clazz = Class.forName(className); + instance = baseType.cast(gson.fromJson(data, clazz)); + + return instance; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void sync() { + this.data = gson.toJsonTree(instance); + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/IMapSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/IMapSetting.java new file mode 100644 index 0000000..5ecc667 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/IMapSetting.java @@ -0,0 +1,18 @@ +package nl.devpieter.utilize.setting.interfaces; + +import java.util.Map; + +public interface IMapSetting extends ISetting> { + + boolean containsKey(T key); + + boolean containsValue(V value); + + V get(T key); + + void put(T key, V value); + + void remove(T key); + + void clear(); +} diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/IPolymorphicSetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/IPolymorphicSetting.java new file mode 100644 index 0000000..66267bc --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/IPolymorphicSetting.java @@ -0,0 +1,15 @@ +package nl.devpieter.utilize.setting.interfaces; + +import com.google.common.reflect.TypeToken; +import nl.devpieter.utilize.models.PolymorphicValue; + +import java.lang.reflect.Type; + +public interface IPolymorphicSetting extends ISetting> { + + @Override + default Type getType() { + return new TypeToken>() { + }.getType(); + } +} diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java new file mode 100644 index 0000000..83a5abc --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java @@ -0,0 +1,62 @@ +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.IMapSetting; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Type; +import java.util.Map; + +public class MapSetting extends SettingBase> implements IMapSetting { + + public MapSetting(@NotNull String identifier, Map defaultValue) { + super(identifier, defaultValue); + } + + public MapSetting(@NotNull String identifier, Map defaultValue, boolean allowNull) { + super(identifier, defaultValue, allowNull); + } + + @Override + public boolean containsKey(T key) { + if (this.getValue() == null) return false; + return this.getValue().containsKey(key); + } + + @Override + public boolean containsValue(V value) { + if (this.getValue() == null) return false; + return this.getValue().containsValue(value); + } + + @Override + public V get(T key) { + if (this.getValue() == null) return null; + return this.getValue().get(key); + } + + @Override + public void put(T key, V value) { + if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot put element."); + this.getValue().put(key, value); + } + + @Override + public void remove(T key) { + if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot remove element."); + this.getValue().remove(key); + } + + @Override + public void clear() { + if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot clear elements."); + this.getValue().clear(); + } + + @Override + public Type getType() { + return new TypeToken>() { + }.getType(); + } +} From 1b8c7a2d41cb4bf46ca2d2f431243767b154d9e4 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:06:04 +0200 Subject: [PATCH 22/41] =?UTF-8?q?=E2=9C=A8=20Refactor=20setting=20manager?= =?UTF-8?q?=20tick=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 32 ++++++++++++++++++- .../mixins/ClientPlayerEntityMixin.java | 4 --- .../utilize/mixins/MinecraftClientMixin.java | 19 ++++++++++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 05344f8..23e7dbc 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -30,6 +30,8 @@ public class Utilize implements ClientModInitializer { private final List blockScreenIds = new ArrayList<>(); + private boolean isInitialized; + @Override public void onInitializeClient() { INSTANCE = this; @@ -48,13 +50,41 @@ public void onInitializeClient() { }); this.logger.info("Utilize initialized successfully! Version: {}", this.getUtilizeVersion()); + this.isInitialized = true; + } + + /** + * Checks if Utilize has been initialized. + * + * @return true if the mod instance exists and is initialized, false otherwise + */ + public static boolean initialized() { + return INSTANCE != null && INSTANCE.isInitialized; } + /** + * Returns the singleton instance of Utilize. + * + * @return the initialized Utilize instance + * @throws IllegalStateException if Utilize has not been initialized yet + */ public static Utilize getInstance() { - if (INSTANCE == null) throw new IllegalStateException("Utilize has not been initialized yet!"); + if (INSTANCE == null || !INSTANCE.isInitialized) { + throw new IllegalStateException("Utilize has not been initialized yet!"); + } + return INSTANCE; } + /** + * Indicates whether this Utilize instance has completed initialization. + * + * @return true if initialized, false otherwise + */ + public boolean isInitialized() { + return this.isInitialized; + } + public String getUtilizeVersion() { return this.modContainer.getMetadata().getVersion().getFriendlyString(); } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index 33c11bc..ac43ec6 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -21,9 +21,6 @@ @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - @Unique - private final SettingManager settingManager = SettingManager.getInstance(); - @Unique private final Sees sees = Sees.getInstance(); @@ -50,7 +47,6 @@ private void onTick(CallbackInfo ci) { @Inject(at = @At("TAIL"), method = "tick") private void onTickTail(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/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index b42ccd8..2e0e344 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -3,7 +3,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import nl.devpieter.sees.Sees; +import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.events.screen.ScreenChangedEvent; +import nl.devpieter.utilize.setting.SettingManager; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -19,11 +21,14 @@ public class MinecraftClientMixin { @Nullable public Screen currentScreen; + @Unique + private Screen previousScreen; + @Unique private final Sees sees = Sees.getInstance(); @Unique - private Screen previousScreen; + private SettingManager settingManager; @Inject(at = @At("HEAD"), method = "setScreen") private void onSetScreenHead(Screen screen, CallbackInfo ci) { @@ -34,4 +39,16 @@ private void onSetScreenHead(Screen screen, CallbackInfo ci) { private void onSetScreenTail(Screen screen, CallbackInfo ci) { this.sees.dispatch(new ScreenChangedEvent(this.previousScreen, screen)); } + + @Inject(at = @At("TAIL"), method = "tick") + private void onTick(CallbackInfo ci) { + if (settingManager == null) { + if (!Utilize.getInstance().isInitialized()) return; + settingManager = SettingManager.getInstance(); + } + + if (settingManager != null) { + settingManager.tick(); + } + } } From ee0999a0e643bdcb3e4eb29928af67406b7035ee Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 15 Sep 2025 13:30:49 +0200 Subject: [PATCH 23/41] =?UTF-8?q?=F0=9F=A7=B9=20Remove=20unused=20managers?= =?UTF-8?q?=20and=20events?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 4 -- .../inventory/TotemCountChangedEvent.java | 6 -- .../inventory/TotemHoldingChangedEvent.java | 9 --- .../packet/ProfessionChangedPacketEvent.java | 9 --- .../packet/TradesOfferedPacketEvent.java | 23 ------- .../events/player/SleepStateChangedEvent.java | 14 ---- .../EntityTrackerUpdatePacketListener.java | 46 ------------- .../packet/SetTradeOffersPacketListener.java | 27 -------- .../utilize/managers/SleepManager.java | 49 -------------- .../utilize/managers/TotemManager.java | 65 ------------------- .../mixins/ClientPlayerEntityMixin.java | 12 ---- 11 files changed, 264 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java delete mode 100644 src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java delete mode 100644 src/main/java/nl/devpieter/utilize/managers/SleepManager.java delete mode 100644 src/main/java/nl/devpieter/utilize/managers/TotemManager.java diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 23e7dbc..b8c1664 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -8,9 +8,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import nl.devpieter.utilize.http.AsyncRequest; -import nl.devpieter.utilize.listeners.packet.EntityTrackerUpdatePacketListener; import nl.devpieter.utilize.listeners.packet.OpenScreenPacketListener; -import nl.devpieter.utilize.listeners.packet.SetTradeOffersPacketListener; import nl.devpieter.utilize.managers.PacketManager; import nl.devpieter.utilize.setting.SettingManager; import nl.devpieter.utilize.task.TaskManager; @@ -37,9 +35,7 @@ public void onInitializeClient() { INSTANCE = this; PacketManager packetManager = PacketManager.getInstance(); - packetManager.subscribe(new EntityTrackerUpdatePacketListener()); packetManager.subscribe(new OpenScreenPacketListener()); - packetManager.subscribe(new SetTradeOffersPacketListener()); ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { this.logger.info("Shutting down Utilize..."); diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java deleted file mode 100644 index 8e7dc94..0000000 --- a/src/main/java/nl/devpieter/utilize/events/inventory/TotemCountChangedEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package nl.devpieter.utilize.events.inventory; - -import nl.devpieter.sees.event.SEvent; - -public record TotemCountChangedEvent(int previous, int current) implements SEvent { -} diff --git a/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java deleted file mode 100644 index 0247a4d..0000000 --- a/src/main/java/nl/devpieter/utilize/events/inventory/TotemHoldingChangedEvent.java +++ /dev/null @@ -1,9 +0,0 @@ -package nl.devpieter.utilize.events.inventory; - -import nl.devpieter.sees.event.SEvent; - -public record TotemHoldingChangedEvent( - boolean previousMainHand, boolean currentMainHand, - boolean previousOffhand, boolean currentOffhand -) implements SEvent { -} diff --git a/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java deleted file mode 100644 index 3f4a6c2..0000000 --- a/src/main/java/nl/devpieter/utilize/events/packet/ProfessionChangedPacketEvent.java +++ /dev/null @@ -1,9 +0,0 @@ -package nl.devpieter.utilize.events.packet; - -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.village.VillagerProfession; -import nl.devpieter.sees.event.SEvent; -import org.jetbrains.annotations.NotNull; - -public record ProfessionChangedPacketEvent(@NotNull VillagerEntity villager, @NotNull VillagerProfession previous, @NotNull VillagerProfession current) implements SEvent { -} diff --git a/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java deleted file mode 100644 index eb6fd43..0000000 --- a/src/main/java/nl/devpieter/utilize/events/packet/TradesOfferedPacketEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package nl.devpieter.utilize.events.packet; - -import net.minecraft.village.TradeOfferList; -import nl.devpieter.sees.event.SCancelableEventBase; - -public class TradesOfferedPacketEvent extends SCancelableEventBase { - - private final int syncId; - private final TradeOfferList tradeOffers; - - public TradesOfferedPacketEvent(int syncId, TradeOfferList tradeOffers) { - this.syncId = syncId; - this.tradeOffers = tradeOffers; - } - - public int syncId() { - return syncId; - } - - public TradeOfferList tradeOffers() { - return tradeOffers; - } -} diff --git a/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java b/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java deleted file mode 100644 index ef7091a..0000000 --- a/src/main/java/nl/devpieter/utilize/events/player/SleepStateChangedEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package nl.devpieter.utilize.events.player; - -import nl.devpieter.sees.event.SEvent; -import org.jetbrains.annotations.NotNull; - -public record SleepStateChangedEvent(@NotNull SleepState previous, @NotNull SleepState current) implements SEvent { - - public enum SleepState { - AWAKE, - FALLING_ASLEEP, - SLEEPING, - WAKING_UP - } -} diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java deleted file mode 100644 index 4a7d025..0000000 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java +++ /dev/null @@ -1,46 +0,0 @@ -package nl.devpieter.utilize.listeners.packet; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket; -import net.minecraft.village.VillagerData; -import net.minecraft.village.VillagerProfession; -import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.events.packet.ProfessionChangedPacketEvent; -import nl.devpieter.utilize.utils.minecraft.WorldUtils; - -import java.lang.reflect.Type; - -public class EntityTrackerUpdatePacketListener implements IPacketListener { - - private final Sees sees = Sees.getInstance(); - - @Override - public Type getPacketType() { - return EntityTrackerUpdateS2CPacket.class; - } - - @Override - public boolean onPacket(EntityTrackerUpdateS2CPacket packet) { - Entity entity = WorldUtils.getEntity(packet.id()); - if (!(entity instanceof VillagerEntity villager)) return false; - - for (DataTracker.SerializedEntry entry : packet.trackedValues()) { - if (!(entry.value() instanceof VillagerData newVillagerData)) continue; - - //#if MC>=12105 - VillagerProfession previous = villager.getVillagerData().profession().value(); - VillagerProfession current = newVillagerData.profession().value(); - //#else - //$$ VillagerProfession previous = villager.getVillagerData().getProfession(); - //$$ VillagerProfession current = newVillagerData.getProfession(); - //#endif - - if (previous == current) continue; - this.sees.dispatch(new ProfessionChangedPacketEvent(villager, previous, current)); - } - - return false; - } -} diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java deleted file mode 100644 index af6ec22..0000000 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package nl.devpieter.utilize.listeners.packet; - -import net.minecraft.network.packet.s2c.play.SetTradeOffersS2CPacket; -import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.Utilize; -import nl.devpieter.utilize.events.packet.TradesOfferedPacketEvent; - -import java.lang.reflect.Type; - -public class SetTradeOffersPacketListener implements IPacketListener { - - private final Sees sees = Sees.getInstance(); - - @Override - public Type getPacketType() { - return SetTradeOffersS2CPacket.class; - } - - @Override - public boolean onPacket(SetTradeOffersS2CPacket packet) { - TradesOfferedPacketEvent event = new TradesOfferedPacketEvent(packet.getSyncId(), packet.getOffers()); - if (!this.sees.dispatch(event)) return false; - - Utilize.getInstance().blockScreenId(packet.getSyncId()); - return true; - } -} diff --git a/src/main/java/nl/devpieter/utilize/managers/SleepManager.java b/src/main/java/nl/devpieter/utilize/managers/SleepManager.java deleted file mode 100644 index be8be95..0000000 --- a/src/main/java/nl/devpieter/utilize/managers/SleepManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package nl.devpieter.utilize.managers; - -import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.events.player.SleepStateChangedEvent; - -public class SleepManager { - - private static SleepManager INSTANCE; - - private final Sees sees = Sees.getInstance(); - - private SleepStateChangedEvent.SleepState currentState = SleepStateChangedEvent.SleepState.AWAKE; - - private SleepManager() { - } - - public static SleepManager getInstance() { - if (INSTANCE == null) INSTANCE = new SleepManager(); - return INSTANCE; - } - - public void tick(boolean isSleeping, float sleepTimer) { - SleepStateChangedEvent.SleepState previous = this.currentState; - - switch (this.currentState) { - case AWAKE: - if (isSleeping) this.currentState = SleepStateChangedEvent.SleepState.FALLING_ASLEEP; - break; - case FALLING_ASLEEP: - if (!isSleeping) this.currentState = SleepStateChangedEvent.SleepState.AWAKE; - else if (sleepTimer == 100) this.currentState = SleepStateChangedEvent.SleepState.SLEEPING; - break; - case SLEEPING: - if (!isSleeping) this.currentState = SleepStateChangedEvent.SleepState.WAKING_UP; - break; - case WAKING_UP: - if (!isSleeping) this.currentState = SleepStateChangedEvent.SleepState.AWAKE; - else if (sleepTimer == 0) this.currentState = SleepStateChangedEvent.SleepState.SLEEPING; - break; - } - - if (previous == this.currentState) return; - this.sees.dispatch(new SleepStateChangedEvent(previous, this.currentState)); - } - - public SleepStateChangedEvent.SleepState getCurrentState() { - return this.currentState; - } -} diff --git a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java deleted file mode 100644 index fca793d..0000000 --- a/src/main/java/nl/devpieter/utilize/managers/TotemManager.java +++ /dev/null @@ -1,65 +0,0 @@ -package nl.devpieter.utilize.managers; - -import net.minecraft.item.Items; -import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.events.inventory.TotemCountChangedEvent; -import nl.devpieter.utilize.events.inventory.TotemHoldingChangedEvent; -import nl.devpieter.utilize.utils.minecraft.InventoryUtils; - -public class TotemManager { - - private static TotemManager INSTANCE; - - private final Sees sees = Sees.getInstance(); - - private int currentTotems = 0; - private boolean holdingMainHand = false; - private boolean holdingOffhand = false; - - private TotemManager() { - } - - public static TotemManager getInstance() { - if (INSTANCE == null) INSTANCE = new TotemManager(); - return INSTANCE; - } - - public void tick() { - this.tickTotemCount(); - this.tickHoldingTotem(); - } - - public int getCurrentTotems() { - return this.currentTotems; - } - - public boolean isHoldingTotem() { - return this.holdingMainHand || this.holdingOffhand; - } - - public boolean isHoldingTotemInMainHand() { - return this.holdingMainHand; - } - - public boolean isHoldingTotemInOffhand() { - return this.holdingOffhand; - } - - private void tickTotemCount() { - int totemCount = InventoryUtils.countItem(Items.TOTEM_OF_UNDYING); - if (totemCount == this.currentTotems) return; - - this.sees.dispatch(new TotemCountChangedEvent(this.currentTotems, totemCount)); - this.currentTotems = totemCount; - } - - private void tickHoldingTotem() { - boolean mainHand = InventoryUtils.isMainHandOf(Items.TOTEM_OF_UNDYING); - boolean offhand = InventoryUtils.isOffhandOf(Items.TOTEM_OF_UNDYING); - if (mainHand == this.holdingMainHand && offhand == this.holdingOffhand) return; - - this.sees.dispatch(new TotemHoldingChangedEvent(this.holdingMainHand, mainHand, this.holdingOffhand, offhand)); - this.holdingMainHand = mainHand; - this.holdingOffhand = offhand; - } -} diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index ac43ec6..b3de410 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -5,13 +5,9 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.events.tick.ClientTickEvent; import nl.devpieter.utilize.managers.DamageManager; -import nl.devpieter.utilize.managers.SleepManager; import nl.devpieter.utilize.task.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; @@ -27,15 +23,9 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Unique private final DamageManager damageManager = DamageManager.getInstance(); - @Unique - private final SleepManager sleepManager = SleepManager.getInstance(); - @Unique private final TaskManager taskManager = TaskManager.getInstance(); - @Unique - private final TotemManager totemManager = TotemManager.getInstance(); - public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { super(world, profile); } @@ -48,9 +38,7 @@ private void onTick(CallbackInfo ci) { @Inject(at = @At("TAIL"), method = "tick") private void onTickTail(CallbackInfo ci) { this.damageManager.tick(this.getHealth()); - this.sleepManager.tick(this.isSleeping(), this.getSleepTimer()); this.taskManager.tick(); - this.totemManager.tick(); // this.sees.call(new ClientTickEvent()); // rename to ClientPlayerTickTailEvent, or something similar } From 7fa1073a1b9579480f43af4aa5fc538907132817 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 15 Sep 2025 13:52:34 +0200 Subject: [PATCH 24/41] =?UTF-8?q?=F0=9F=9A=80=20Refactor=20tick=20events;?= =?UTF-8?q?=20QoL=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nl/devpieter/utilize/Utilize.java | 32 ++++++++++++++++++- .../events/tick/ClientPlayerTickEvent.java | 6 ++++ .../tick/ClientPlayerTickTailEvent.java | 6 ++++ .../events/tick/ClientTickTailEvent.java | 6 ++++ .../devpieter/utilize/http/RequestHelper.java | 9 +++++- .../mixins/ClientPlayerEntityMixin.java | 15 +++------ .../utilize/mixins/MinecraftClientMixin.java | 11 ++++++- 7 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index b8c1664..ac9932e 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -89,8 +89,38 @@ public String getMinecraftVersion() { return SharedConstants.getGameVersion().getName(); } + /** + * Constructs a default User-Agent string for Utilize. + * The format is: "Utilize/{utilizeVersion} (Mc/{minecraftVersion}; Java/{javaVersion})" + * + * @return the User-Agent string containing Utilize, Minecraft, and Java versions + */ public String getUserAgent() { - return String.format("Utilize/%s (%s;)", this.getUtilizeVersion(), this.getMinecraftVersion()); + return String.format( + "Utilize/%s (Mc/%s; Java/%s)", + this.getUtilizeVersion(), + this.getMinecraftVersion(), + System.getProperty("java.version") + ); + } + + /** + * Constructs a custom User-Agent string with the provided name and version. + * The format is: "{name}/{version} (Utilize/{utilizeVersion}; Mc/{minecraftVersion}; Java/{javaVersion})" + * + * @param name the name to include in the User-Agent + * @param version the version to include in the User-Agent + * @return the User-Agent string containing the custom name/version, Utilize, Minecraft, and Java versions + */ + public String getUserAgent(String name, String version) { + return String.format( + "%s/%s (Utilize/%s; Mc/%s; Java/%s)", + name, + version, + this.getUtilizeVersion(), + this.getMinecraftVersion(), + System.getProperty("java.version") + ); } public boolean shouldBlockScreenId(int screenId) { diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java new file mode 100644 index 0000000..74258f8 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.tick; + +import nl.devpieter.sees.event.SEvent; + +public record ClientPlayerTickEvent() implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java new file mode 100644 index 0000000..03d90c8 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.tick; + +import nl.devpieter.sees.event.SEvent; + +public record ClientPlayerTickTailEvent() implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java new file mode 100644 index 0000000..e5fb68f --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.tick; + +import nl.devpieter.sees.event.SEvent; + +public record ClientTickTailEvent() implements SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/http/RequestHelper.java b/src/main/java/nl/devpieter/utilize/http/RequestHelper.java index e124a86..58340a4 100644 --- a/src/main/java/nl/devpieter/utilize/http/RequestHelper.java +++ b/src/main/java/nl/devpieter/utilize/http/RequestHelper.java @@ -36,8 +36,15 @@ public abstract class RequestHelper { } public static HttpRequest.Builder createRequestBuilder(@NotNull URI uri) { + return createRequestBuilder(uri, Utilize.getInstance().getUserAgent()); + } + + /** + * @see Utilize#getUserAgent(String, String) + */ + public static HttpRequest.Builder createRequestBuilder(@NotNull URI uri, @NotNull String userAgent) { return HttpRequest.newBuilder() - .header(USER_AGENT_HEADER, Utilize.getInstance().getUserAgent()) + .header(USER_AGENT_HEADER, userAgent) .header("Content-Type", "application/json") .header("Accept", "application/json") .uri(uri); diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index b3de410..a9763b7 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -5,7 +5,8 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.events.tick.ClientTickEvent; +import nl.devpieter.utilize.events.tick.ClientPlayerTickEvent; +import nl.devpieter.utilize.events.tick.ClientPlayerTickTailEvent; import nl.devpieter.utilize.managers.DamageManager; import nl.devpieter.utilize.task.TaskManager; import org.spongepowered.asm.mixin.Mixin; @@ -32,7 +33,7 @@ public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { @Inject(at = @At("HEAD"), method = "tick") private void onTick(CallbackInfo ci) { - this.sees.dispatch(new ClientTickEvent()); // rename to ClientPlayerTickEvent, or something similar + this.sees.dispatch(new ClientPlayerTickEvent()); } @Inject(at = @At("TAIL"), method = "tick") @@ -40,14 +41,6 @@ private void onTickTail(CallbackInfo ci) { this.damageManager.tick(this.getHealth()); this.taskManager.tick(); - // this.sees.call(new ClientTickEvent()); // rename to ClientPlayerTickTailEvent, or something similar + this.sees.dispatch(new ClientPlayerTickTailEvent()); } - -// @Inject(at = @At("HEAD"), method = "swingHand", cancellable = true) -// private void onSwingHand(CallbackInfo ci) { -// if (!Utilize.shouldBlockSwingHandOnce()) return; -// -// ci.cancel(); -// Utilize.blockedSwingHandOnce(); -// } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index 2e0e344..bfcd085 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -5,6 +5,8 @@ import nl.devpieter.sees.Sees; import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.events.screen.ScreenChangedEvent; +import nl.devpieter.utilize.events.tick.ClientTickEvent; +import nl.devpieter.utilize.events.tick.ClientTickTailEvent; import nl.devpieter.utilize.setting.SettingManager; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -40,8 +42,13 @@ private void onSetScreenTail(Screen screen, CallbackInfo ci) { this.sees.dispatch(new ScreenChangedEvent(this.previousScreen, screen)); } - @Inject(at = @At("TAIL"), method = "tick") + @Inject(at = @At("HEAD"), method = "tick") private void onTick(CallbackInfo ci) { + this.sees.dispatch(new ClientTickEvent()); + } + + @Inject(at = @At("TAIL"), method = "tick") + private void onTickTail(CallbackInfo ci) { if (settingManager == null) { if (!Utilize.getInstance().isInitialized()) return; settingManager = SettingManager.getInstance(); @@ -50,5 +57,7 @@ private void onTick(CallbackInfo ci) { if (settingManager != null) { settingManager.tick(); } + + this.sees.dispatch(new ClientTickTailEvent()); } } From 9b314483325f6941e56b00dba7df691be3d05696 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:07:43 +0200 Subject: [PATCH 25/41] =?UTF-8?q?=E2=9C=A8=20Add=20ITickEvent=20interface?= =?UTF-8?q?=20and=20SeesMixin=20for=20dispatch=20logging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/tick/ClientPlayerTickEvent.java | 4 +-- .../tick/ClientPlayerTickTailEvent.java | 4 +-- .../utilize/events/tick/ClientTickEvent.java | 4 +-- .../events/tick/ClientTickTailEvent.java | 4 +-- .../utilize/events/tick/ITickEvent.java | 6 ++++ .../devpieter/utilize/mixins/SeesMixin.java | 33 +++++++++++++++++++ src/main/resources/utilize.mixins.json | 3 +- 7 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 src/main/java/nl/devpieter/utilize/events/tick/ITickEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java index 74258f8..ffb136a 100644 --- a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickEvent.java @@ -1,6 +1,4 @@ package nl.devpieter.utilize.events.tick; -import nl.devpieter.sees.event.SEvent; - -public record ClientPlayerTickEvent() implements SEvent { +public record ClientPlayerTickEvent() implements ITickEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java index 03d90c8..8e8cd13 100644 --- a/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientPlayerTickTailEvent.java @@ -1,6 +1,4 @@ package nl.devpieter.utilize.events.tick; -import nl.devpieter.sees.event.SEvent; - -public record ClientPlayerTickTailEvent() implements SEvent { +public record ClientPlayerTickTailEvent() implements ITickEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java index d0603e6..df75c70 100644 --- a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickEvent.java @@ -1,6 +1,4 @@ package nl.devpieter.utilize.events.tick; -import nl.devpieter.sees.event.SEvent; - -public record ClientTickEvent() implements SEvent { +public record ClientTickEvent() implements ITickEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java index e5fb68f..f512b87 100644 --- a/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java +++ b/src/main/java/nl/devpieter/utilize/events/tick/ClientTickTailEvent.java @@ -1,6 +1,4 @@ package nl.devpieter.utilize.events.tick; -import nl.devpieter.sees.event.SEvent; - -public record ClientTickTailEvent() implements SEvent { +public record ClientTickTailEvent() implements ITickEvent { } diff --git a/src/main/java/nl/devpieter/utilize/events/tick/ITickEvent.java b/src/main/java/nl/devpieter/utilize/events/tick/ITickEvent.java new file mode 100644 index 0000000..78a0d1b --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/tick/ITickEvent.java @@ -0,0 +1,6 @@ +package nl.devpieter.utilize.events.tick; + +import nl.devpieter.sees.event.SEvent; + +public interface ITickEvent extends SEvent { +} diff --git a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java new file mode 100644 index 0000000..f5ead45 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java @@ -0,0 +1,33 @@ +package nl.devpieter.utilize.mixins; + +import net.minecraft.text.Text; +import nl.devpieter.sees.Sees; +import nl.devpieter.sees.event.SEvent; +import nl.devpieter.utilize.events.tick.ITickEvent; +import nl.devpieter.utilize.utils.minecraft.ClientUtils; +import nl.devpieter.utilize.utils.minecraft.PlayerUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = Sees.class, remap = false) +public class SeesMixin { + + @Unique + private final Logger logger = LoggerFactory.getLogger("Utilize/SeesMixin"); + + @Inject( + method = "dispatch(Lnl/devpieter/sees/event/SEvent;)Z", + at = @At("RETURN") + ) + private void onDispatch(SEvent event, CallbackInfoReturnable cir) { + if (event instanceof ITickEvent) return; + if (!ClientUtils.isDevEnv()) return; + + this.logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); + } +} diff --git a/src/main/resources/utilize.mixins.json b/src/main/resources/utilize.mixins.json index d31a0b6..61bbf28 100644 --- a/src/main/resources/utilize.mixins.json +++ b/src/main/resources/utilize.mixins.json @@ -15,6 +15,7 @@ "defaultRequire": 1 }, "mixins": [ - "ClientConnectionMixin" + "ClientConnectionMixin", + "SeesMixin" ] } From c43e54d6465ff437d5bede2f364789b09ca3fadf Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 3 Oct 2025 10:24:22 +0200 Subject: [PATCH 26/41] =?UTF-8?q?=F0=9F=9A=80=20Update=20to=20Minecraft=20?= =?UTF-8?q?1.21.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- root.gradle | 6 +++++- settings.gradle | 2 ++ .../java/nl/devpieter/utilize/Utilize.java | 6 +++++- .../utilize/mixins/DebugRendererMixin.java | 19 +++++++++++++++---- versions/1.21.6/gradle.properties | 6 ++++++ versions/1.21.9/gradle.properties | 6 ++++++ versions/mainProject | 2 +- 8 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 versions/1.21.6/gradle.properties create mode 100644 versions/1.21.9/gradle.properties diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a79..ca025c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/root.gradle b/root.gradle index c1f89ef..0820ee6 100644 --- a/root.gradle +++ b/root.gradle @@ -1,13 +1,17 @@ plugins { - id 'fabric-loom' version '1.10-SNAPSHOT' apply false + id 'fabric-loom' version '1.11-SNAPSHOT' apply false id 'com.replaymod.preprocess' version '79307437eb' } preprocess { + def mc12109 = createNode('1.21.9', 12109, "yarn") + def mc12106 = createNode('1.21.6', 12106, "yarn") def mc12105 = createNode('1.21.5', 12105, "yarn") def mc12102 = createNode('1.21.2', 12102, "yarn") def mc12100 = createNode('1.21.0', 12100, "yarn") + mc12109.link(mc12106, null) + mc12106.link(mc12105, null) mc12105.link(mc12102, null) mc12102.link(mc12100, null) } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 2ffd16a..8bfc5d8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -23,6 +23,8 @@ pluginManagement { rootProject.buildFileName = "root.gradle" var versions = [ + "1.21.9", + "1.21.6", "1.21.5", "1.21.2", "1.21.0" diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index 0a516dd..8b6258d 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -108,6 +108,10 @@ public static String getUtilizeVersion() { } public static String getMinecraftVersion() { - return SharedConstants.getGameVersion().getName(); + //#if MC>=12106 + return SharedConstants.getGameVersion().name(); + //#else + //$$ return SharedConstants.getGameVersion().getName(); + //#endif } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java b/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java index 92bd801..26918c8 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java @@ -4,6 +4,7 @@ import net.minecraft.client.render.debug.DebugRenderer; import net.minecraft.client.util.math.MatrixStack; import nl.devpieter.utilize.managers.DebugManager; +import nl.devpieter.utilize.utils.ClientUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -14,6 +15,10 @@ import net.minecraft.client.render.Frustum; //#endif +//#if MC>=12109 +import net.minecraft.world.debug.DebugDataStore; +//#endif + @Mixin(DebugRenderer.class) public class DebugRendererMixin { @@ -21,14 +26,20 @@ public class DebugRendererMixin { private final DebugManager debugManager = DebugManager.getInstance(); @Inject(at = @At("HEAD"), method = "render") - //#if MC>=12102 - private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + //#if MC>=12109 + private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, boolean lateDebug, CallbackInfo ci) { + //#elseif MC>=12102 + //$$ private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { //#else //$$ public void render(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { //#endif - for (DebugRenderer.Renderer renderer : this.debugManager.getRenderers()) { - renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); + //#if MC>=12109 + DebugDataStore debugDataStore = ClientUtils.getNetworkHandler().getDebugDataStore(); + renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ, debugDataStore, frustum); + //#else + //$$ renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); + //#endif } } } diff --git a/versions/1.21.6/gradle.properties b/versions/1.21.6/gradle.properties new file mode 100644 index 0000000..ee93499 --- /dev/null +++ b/versions/1.21.6/gradle.properties @@ -0,0 +1,6 @@ +# check this on https://modmuss50.me/fabric.html +minecraft_version=1.21.6 +max_minecraft_version=1.21.8 + +yarn_mappings=1.21.8+build.1 +fabric_version=0.128.2+1.21.6 \ No newline at end of file diff --git a/versions/1.21.9/gradle.properties b/versions/1.21.9/gradle.properties new file mode 100644 index 0000000..a94908d --- /dev/null +++ b/versions/1.21.9/gradle.properties @@ -0,0 +1,6 @@ +# check this on https://modmuss50.me/fabric.html +minecraft_version=1.21.9 +max_minecraft_version=1.21.9 + +yarn_mappings=1.21.9+build.1 +fabric_version=0.134.0+1.21.9 \ No newline at end of file diff --git a/versions/mainProject b/versions/mainProject index d6a49eb..3434b8f 100644 --- a/versions/mainProject +++ b/versions/mainProject @@ -1 +1 @@ -1.21.5 \ No newline at end of file +1.21.9 \ No newline at end of file From c47ca669de5d826fdf5341361211abf99188f391 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 3 Oct 2025 10:32:07 +0200 Subject: [PATCH 27/41] =?UTF-8?q?=F0=9F=94=A7=20Update=20max=20Minecraft?= =?UTF-8?q?=20version=20to=201.21.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versions/1.21.5/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versions/1.21.5/gradle.properties b/versions/1.21.5/gradle.properties index ff29f9a..c66c1e1 100644 --- a/versions/1.21.5/gradle.properties +++ b/versions/1.21.5/gradle.properties @@ -1,6 +1,6 @@ # check this on https://modmuss50.me/fabric.html minecraft_version=1.21.5 -max_minecraft_version=1.21.8 +max_minecraft_version=1.21.5 yarn_mappings=1.21.5+build.1 fabric_version=0.128.1+1.21.5 \ No newline at end of file From ab88a49d46b4bfdf3196b01f3a0e5a6fa5c8fb06 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Fri, 3 Oct 2025 10:33:10 +0200 Subject: [PATCH 28/41] Version/1.0.12 (#27) (#28) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ Implement shutdown functionality * ✨ Refactor setting manager initialization and tick handling * ⬆️ Bump version to 1.0.12 From 1ad5fe7a99cbfea7ba52c35f44ed16bd06fb5d84 Mon Sep 17 00:00:00 2001 From: Pieter <51260315+DevPieter@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:28:35 +0200 Subject: [PATCH 29/41] =?UTF-8?q?=F0=9F=94=A7=20Update=20max=20Minecraft?= =?UTF-8?q?=20version=20to=201.21.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versions/1.21.9/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versions/1.21.9/gradle.properties b/versions/1.21.9/gradle.properties index a94908d..3cdedd2 100644 --- a/versions/1.21.9/gradle.properties +++ b/versions/1.21.9/gradle.properties @@ -1,6 +1,6 @@ # check this on https://modmuss50.me/fabric.html minecraft_version=1.21.9 -max_minecraft_version=1.21.9 +max_minecraft_version=1.21.10 yarn_mappings=1.21.9+build.1 fabric_version=0.134.0+1.21.9 \ No newline at end of file From 5467ca16958438a0ad6f996c7f4f52db31bbdd3b Mon Sep 17 00:00:00 2001 From: Pieter Date: Sat, 10 Jan 2026 17:11:00 +0100 Subject: [PATCH 30/41] Drop support for versions 1.21.8 and below --- build.gradle | 2 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- root.gradle | 17 ++++++++++------- settings.gradle | 4 +--- src/main/java/nl/devpieter/utilize/Utilize.java | 2 +- .../utilize/mixins/DebugRendererMixin.java | 12 ++++++------ .../utilize/mixins/KeyBindingMixin.java | 12 ++++++------ .../utilize/utils/minecraft/InventoryUtils.java | 10 ---------- versions/1.21.0/gradle.properties | 6 ------ versions/1.21.2/gradle.properties | 6 ------ versions/1.21.5/gradle.properties | 6 ------ versions/1.21.9/gradle.properties | 6 ++++++ versions/mainProject | 2 +- 14 files changed, 34 insertions(+), 55 deletions(-) delete mode 100644 versions/1.21.0/gradle.properties delete mode 100644 versions/1.21.2/gradle.properties delete mode 100644 versions/1.21.5/gradle.properties create mode 100644 versions/1.21.9/gradle.properties diff --git a/build.gradle b/build.gradle index d14ba6b..483af95 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ def isSnapshot = System.getenv('SNAPSHOT_BUILD')?.toBoolean() ?: false def buildNumber = System.getenv('BUILD_NUMBER') ?: 'dev' group = maven_group -archivesBaseName = archives_base_name +//archivesBaseName = archives_base_name version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-SNAPSHOT+${buildNumber}" : "") repositories { diff --git a/gradle.properties b/gradle.properties index d751d28..75a22e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -loader_version=0.16.10 +loader_version=0.18.4 # Mod Properties artifact_id=utilize diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a79..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/root.gradle b/root.gradle index c1f89ef..565ff69 100644 --- a/root.gradle +++ b/root.gradle @@ -1,13 +1,16 @@ plugins { - id 'fabric-loom' version '1.10-SNAPSHOT' apply false - id 'com.replaymod.preprocess' version '79307437eb' + id 'fabric-loom' version '1.14-SNAPSHOT' apply false +// id 'com.replaymod.preprocess' version '79307437eb' + id 'com.replaymod.preprocess' version '521df70941' } preprocess { - def mc12105 = createNode('1.21.5', 12105, "yarn") - def mc12102 = createNode('1.21.2', 12102, "yarn") - def mc12100 = createNode('1.21.0', 12100, "yarn") +// def mc12105 = createNode('1.21.5', 12105, "yarn") +// def mc12102 = createNode('1.21.2', 12102, "yarn") +// def mc12100 = createNode('1.21.0', 12100, "yarn") - mc12105.link(mc12102, null) - mc12102.link(mc12100, null) +// mc12105.link(mc12102, null) +// mc12102.link(mc12100, null) + + def mc12109 = createNode('1.21.9', 12109, "yarn") } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 2ffd16a..99ee0aa 100644 --- a/settings.gradle +++ b/settings.gradle @@ -23,9 +23,7 @@ pluginManagement { rootProject.buildFileName = "root.gradle" var versions = [ - "1.21.5", - "1.21.2", - "1.21.0" + "1.21.9" ] versions.forEach { version -> diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index ac9932e..ed649a7 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -86,7 +86,7 @@ public String getUtilizeVersion() { } public String getMinecraftVersion() { - return SharedConstants.getGameVersion().getName(); + return SharedConstants.getGameVersion().name(); } /** diff --git a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java b/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java index 92bd801..63661e9 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java @@ -20,15 +20,15 @@ public class DebugRendererMixin { @Unique private final DebugManager debugManager = DebugManager.getInstance(); - @Inject(at = @At("HEAD"), method = "render") +// @Inject(at = @At("HEAD"), method = "render") //#if MC>=12102 - private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { +// private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { //#else //$$ public void render(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { //#endif - for (DebugRenderer.Renderer renderer : this.debugManager.getRenderers()) { - renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); - } - } +// for (DebugRenderer.Renderer renderer : this.debugManager.getRenderers()) { +// renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); +// } +// } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java index 5cc67e5..76280f7 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java @@ -14,8 +14,8 @@ @Mixin(KeyBinding.class) public abstract class KeyBindingMixin { - @Shadow - public abstract String getTranslationKey(); +// @Shadow +// public abstract String getTranslationKey(); @Shadow private int timesPressed; @@ -30,16 +30,16 @@ public abstract class KeyBindingMixin { private void isPressed(CallbackInfoReturnable cir) { if (!cir.getReturnValue()) return; - if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); - else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); +// if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); +// else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); } @Inject(at = @At("RETURN"), method = "wasPressed", cancellable = true) private void wasPressed(CallbackInfoReturnable cir) { if (!cir.getReturnValue()) return; - if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); - else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); +// if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); +// else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); } @Unique diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java index 0bcbd97..c2bcb51 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java @@ -50,22 +50,12 @@ public static boolean isOffhandOf(@Nullable Item item) { public static void selectHotbarSlot(int slot) { if (slot < 0 || slot > 8 || !hasInventory()) return; - - //#if MC>=12105 getInventory().setSelectedSlot(slot); - //#else - //$$ getInventory().selectedSlot = slot; - //#endif } public static int getSelectedHotbarSlot() { if (!hasInventory()) return -1; - - //#if MC>=12105 return getInventory().getSelectedSlot(); - //#else - //$$ return getInventory().selectedSlot; - //#endif } public static @NotNull List findHotbarSlots(@Nullable Item item) { diff --git a/versions/1.21.0/gradle.properties b/versions/1.21.0/gradle.properties deleted file mode 100644 index bdc45f1..0000000 --- a/versions/1.21.0/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# check this on https://modmuss50.me/fabric.html -minecraft_version=1.21 -max_minecraft_version=1.21.1 - -yarn_mappings=1.21+build.9 -fabric_version=0.102.0+1.21 \ No newline at end of file diff --git a/versions/1.21.2/gradle.properties b/versions/1.21.2/gradle.properties deleted file mode 100644 index 467c105..0000000 --- a/versions/1.21.2/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# check this on https://modmuss50.me/fabric.html -minecraft_version=1.21.2 -max_minecraft_version=1.21.4 - -yarn_mappings=1.21.2+build.1 -fabric_version=0.106.1+1.21.2 \ No newline at end of file diff --git a/versions/1.21.5/gradle.properties b/versions/1.21.5/gradle.properties deleted file mode 100644 index 2fb8141..0000000 --- a/versions/1.21.5/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# check this on https://modmuss50.me/fabric.html -minecraft_version=1.21.5 -max_minecraft_version=1.21.7 - -yarn_mappings=1.21.5+build.1 -fabric_version=0.128.1+1.21.5 \ No newline at end of file diff --git a/versions/1.21.9/gradle.properties b/versions/1.21.9/gradle.properties new file mode 100644 index 0000000..1ead45f --- /dev/null +++ b/versions/1.21.9/gradle.properties @@ -0,0 +1,6 @@ +# check this on https://modmuss50.me/fabric.html +minecraft_version=1.21.9 +max_minecraft_version=1.21.11 + +yarn_mappings=1.21.9+build.1 +fabric_version=0.134.1+1.21.9 \ No newline at end of file diff --git a/versions/mainProject b/versions/mainProject index d6a49eb..3434b8f 100644 --- a/versions/mainProject +++ b/versions/mainProject @@ -1 +1 @@ -1.21.5 \ No newline at end of file +1.21.9 \ No newline at end of file From 441a5d5be03fef9a51ea31357a3ec78bf07be068 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 13:10:15 +0100 Subject: [PATCH 31/41] Refactor task manager; Cleanup managers; QoL --- .../java/nl/devpieter/utilize/Utilize.java | 39 --------- .../packet/ScreenOpenedPacketEvent.java | 30 ------- .../packet/OpenScreenPacketListener.java | 27 ------ .../utilize/managers/DamageManager.java | 21 +++-- .../utilize/managers/DebugManager.java | 13 ++- .../utilize/managers/PacketManager.java | 9 +- .../utilize/mixins/ClientConnectionMixin.java | 19 ----- .../mixins/ClientPlayerEntityMixin.java | 9 +- .../utilize/mixins/MinecraftClientMixin.java | 35 ++++++-- .../utilize/setting/SettingManager.java | 78 +++++++++--------- .../devpieter/utilize/task/TaskManager.java | 82 +++++++++++++++---- .../utilize/task/interfaces/ITask.java | 12 +-- .../utilize/task/tasks/RunLaterTask.java | 46 +++-------- .../utilize/utils/common/MathUtils.java | 14 ++++ 14 files changed, 183 insertions(+), 251 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java delete mode 100644 src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index ed649a7..bccdf04 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -5,20 +5,11 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.SharedConstants; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; import nl.devpieter.utilize.http.AsyncRequest; -import nl.devpieter.utilize.listeners.packet.OpenScreenPacketListener; -import nl.devpieter.utilize.managers.PacketManager; import nl.devpieter.utilize.setting.SettingManager; -import nl.devpieter.utilize.task.TaskManager; -import nl.devpieter.utilize.utils.minecraft.ClientUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; - public class Utilize implements ClientModInitializer { private static Utilize INSTANCE; @@ -26,21 +17,15 @@ public class Utilize implements ClientModInitializer { private final Logger logger = LoggerFactory.getLogger("Utilize"); private final ModContainer modContainer = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); - private final List blockScreenIds = new ArrayList<>(); - private boolean isInitialized; @Override public void onInitializeClient() { INSTANCE = this; - PacketManager packetManager = PacketManager.getInstance(); - packetManager.subscribe(new OpenScreenPacketListener()); - ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { this.logger.info("Shutting down Utilize..."); - TaskManager.shutdown(); SettingManager.shutdown(); AsyncRequest.shutdown(); }); @@ -122,28 +107,4 @@ public String getUserAgent(String name, String version) { System.getProperty("java.version") ); } - - public boolean shouldBlockScreenId(int screenId) { - return blockScreenIds.contains(screenId); - } - - public void blockScreenId(int screenId) { - if (this.blockScreenIds.contains(screenId)) return; - this.blockScreenIds.add(screenId); - - if (!ClientUtils.hasPlayer()) return; - MinecraftClient client = MinecraftClient.getInstance(); - ClientPlayerEntity player = ClientUtils.getPlayer(); - - client.execute(() -> { - if (player == null || player.currentScreenHandler.syncId != screenId) return; - - player.closeHandledScreen(); - blockedScreenId(screenId); - }); - } - - public void blockedScreenId(int screenId) { - this.blockScreenIds.removeIf(id -> id == screenId); - } } diff --git a/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java b/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java deleted file mode 100644 index 0c5defd..0000000 --- a/src/main/java/nl/devpieter/utilize/events/packet/ScreenOpenedPacketEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package nl.devpieter.utilize.events.packet; - -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.text.Text; -import nl.devpieter.sees.event.SCancelableEventBase; - -public class ScreenOpenedPacketEvent extends SCancelableEventBase { - - private final int syncId; - private final ScreenHandlerType type; - private final Text name; - - public ScreenOpenedPacketEvent(int syncId, ScreenHandlerType type, Text name) { - this.syncId = syncId; - this.type = type; - this.name = name; - } - - public int syncId() { - return syncId; - } - - public ScreenHandlerType type() { - return type; - } - - public Text name() { - return name; - } -} diff --git a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java deleted file mode 100644 index 4d8d77b..0000000 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package nl.devpieter.utilize.listeners.packet; - -import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket; -import nl.devpieter.sees.Sees; -import nl.devpieter.utilize.Utilize; -import nl.devpieter.utilize.events.packet.ScreenOpenedPacketEvent; - -import java.lang.reflect.Type; - -public class OpenScreenPacketListener implements IPacketListener { - - private final Sees sees = Sees.getInstance(); - - @Override - public Type getPacketType() { - return OpenScreenS2CPacket.class; - } - - @Override - public boolean onPacket(OpenScreenS2CPacket packet) { - ScreenOpenedPacketEvent event = new ScreenOpenedPacketEvent(packet.getSyncId(), packet.getScreenHandlerType(), packet.getName()); - if (!this.sees.dispatch(event)) return false; - - Utilize.getInstance().blockScreenId(packet.getSyncId()); - return false; - } -} diff --git a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java index f6fd174..6c5ffd1 100644 --- a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java @@ -4,38 +4,37 @@ import nl.devpieter.utilize.events.player.PlayerDamagedEvent; import nl.devpieter.utilize.events.player.PlayerHealedEvent; -public class DamageManager { +public final class DamageManager { - private static DamageManager INSTANCE; + private static final DamageManager INSTANCE = new DamageManager(); private final Sees sees = Sees.getInstance(); - private double currentHealth = -1; + private double currentCurrentHealth = -1; private DamageManager() { } public static DamageManager getInstance() { - if (INSTANCE == null) INSTANCE = new DamageManager(); return INSTANCE; } public void tick(double currentHealth) { - if (this.currentHealth == -1) { - this.currentHealth = currentHealth; + if (currentCurrentHealth == -1) { + currentCurrentHealth = currentHealth; return; } - double difference = this.currentHealth - currentHealth; - this.currentHealth = currentHealth; + double difference = currentCurrentHealth - currentHealth; + currentCurrentHealth = currentHealth; if (difference == 0) return; - if (difference > 0) this.sees.dispatch(new PlayerDamagedEvent(currentHealth, difference)); - else if (difference < 0) this.sees.dispatch(new PlayerHealedEvent(currentHealth, -difference)); + if (difference > 0) sees.dispatch(new PlayerDamagedEvent(currentHealth, difference)); + else if (difference < 0) sees.dispatch(new PlayerHealedEvent(currentHealth, -difference)); } public double getCurrentHealth() { - return this.currentHealth; + return currentCurrentHealth; } } diff --git a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java b/src/main/java/nl/devpieter/utilize/managers/DebugManager.java index b4c9629..1d67823 100644 --- a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/DebugManager.java @@ -6,9 +6,9 @@ import java.util.ArrayList; import java.util.List; -public class DebugManager { +public final class DebugManager { - private static DebugManager INSTANCE; + private static final DebugManager INSTANCE = new DebugManager(); private final List renderers = new ArrayList<>(); @@ -16,20 +16,19 @@ private DebugManager() { } public static DebugManager getInstance() { - if (INSTANCE == null) INSTANCE = new DebugManager(); return INSTANCE; } public void addRenderer(@NotNull DebugRenderer.Renderer renderer) { - if (this.renderers.contains(renderer)) return; - this.renderers.add(renderer); + if (renderers.contains(renderer)) return; + renderers.add(renderer); } public void removeRenderer(@NotNull DebugRenderer.Renderer renderer) { - this.renderers.remove(renderer); + renderers.remove(renderer); } public List getRenderers() { - return this.renderers; + return renderers; } } diff --git a/src/main/java/nl/devpieter/utilize/managers/PacketManager.java b/src/main/java/nl/devpieter/utilize/managers/PacketManager.java index 7fe0510..040b2e8 100644 --- a/src/main/java/nl/devpieter/utilize/managers/PacketManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/PacketManager.java @@ -6,9 +6,9 @@ import java.util.ArrayList; import java.util.List; -public class PacketManager { +public final class PacketManager { - private static PacketManager INSTANCE; + private static final PacketManager INSTANCE = new PacketManager(); private final List> listeners = new ArrayList<>(); @@ -16,16 +16,15 @@ private PacketManager() { } public static PacketManager getInstance() { - if (INSTANCE == null) INSTANCE = new PacketManager(); return INSTANCE; } public void subscribe(IPacketListener listener) { - this.listeners.add(listener); + listeners.add(listener); } public void unsubscribe(IPacketListener listener) { - this.listeners.remove(listener); + listeners.remove(listener); } public boolean packetReceived(Packet packet) { diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java index edde4dd..ac769a5 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java @@ -3,11 +3,7 @@ import net.minecraft.network.ClientConnection; import net.minecraft.network.listener.PacketListener; import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket; -import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket; -import nl.devpieter.utilize.Utilize; import nl.devpieter.utilize.managers.PacketManager; -import nl.devpieter.utilize.utils.minecraft.NetworkUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -24,19 +20,4 @@ public class ClientConnectionMixin { private static void onHandlePacket(Packet packet, PacketListener listener, CallbackInfo ci) { if (packetManager.packetReceived(packet)) ci.cancel(); } - - @Inject(at = @At("TAIL"), method = "handlePacket", cancellable = true) - private static void onHandlePacketTail(Packet packet, PacketListener listener, CallbackInfo ci) { - - if (packet instanceof OpenScreenS2CPacket openScreenPacket) { - Utilize utilize = Utilize.getInstance(); - - int syncId = openScreenPacket.getSyncId(); - if (!utilize.shouldBlockScreenId(syncId)) return; - - NetworkUtils.sendPacket(new CloseHandledScreenC2SPacket(openScreenPacket.getSyncId())); - utilize.blockedScreenId(syncId); - ci.cancel(); - } - } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index a9763b7..c1be55e 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -33,14 +33,15 @@ public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { @Inject(at = @At("HEAD"), method = "tick") private void onTick(CallbackInfo ci) { - this.sees.dispatch(new ClientPlayerTickEvent()); + taskManager.tick(TaskManager.TickPhase.PLAYER_HEAD); + sees.dispatch(new ClientPlayerTickEvent()); } @Inject(at = @At("TAIL"), method = "tick") private void onTickTail(CallbackInfo ci) { - this.damageManager.tick(this.getHealth()); - this.taskManager.tick(); + damageManager.tick(getHealth()); + taskManager.tick(TaskManager.TickPhase.PLAYER_TAIL); - this.sees.dispatch(new ClientPlayerTickTailEvent()); + sees.dispatch(new ClientPlayerTickTailEvent()); } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index bfcd085..3ba292c 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -8,6 +8,7 @@ import nl.devpieter.utilize.events.tick.ClientTickEvent; import nl.devpieter.utilize.events.tick.ClientTickTailEvent; import nl.devpieter.utilize.setting.SettingManager; +import nl.devpieter.utilize.task.TaskManager; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -32,32 +33,50 @@ public class MinecraftClientMixin { @Unique private SettingManager settingManager; + @Unique + private TaskManager taskManager; + @Inject(at = @At("HEAD"), method = "setScreen") private void onSetScreenHead(Screen screen, CallbackInfo ci) { - this.previousScreen = this.currentScreen; + previousScreen = currentScreen; } @Inject(at = @At("TAIL"), method = "setScreen") private void onSetScreenTail(Screen screen, CallbackInfo ci) { - this.sees.dispatch(new ScreenChangedEvent(this.previousScreen, screen)); + sees.dispatch(new ScreenChangedEvent(previousScreen, screen)); } @Inject(at = @At("HEAD"), method = "tick") private void onTick(CallbackInfo ci) { - this.sees.dispatch(new ClientTickEvent()); + tryInitializeManagers(); + + if (taskManager != null) { + taskManager.beginTick(); + taskManager.tick(TaskManager.TickPhase.CLIENT_HEAD); + } + + sees.dispatch(new ClientTickEvent()); } @Inject(at = @At("TAIL"), method = "tick") private void onTickTail(CallbackInfo ci) { + if (settingManager != null) settingManager.tick(); + if (taskManager != null) taskManager.tick(TaskManager.TickPhase.CLIENT_TAIL); + + sees.dispatch(new ClientTickTailEvent()); + } + + @Unique + private void tryInitializeManagers() { + if (settingManager != null || taskManager != null) return; + if (!Utilize.getInstance().isInitialized()) return; + if (settingManager == null) { - if (!Utilize.getInstance().isInitialized()) return; settingManager = SettingManager.getInstance(); } - if (settingManager != null) { - settingManager.tick(); + if (taskManager == null) { + taskManager = TaskManager.getInstance(); } - - this.sees.dispatch(new ClientTickTailEvent()); } } diff --git a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index bb9c874..ad48d86 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -16,9 +16,9 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -public class SettingManager { +public final class SettingManager { - private static SettingManager INSTANCE; + private static final SettingManager INSTANCE = new SettingManager(); private final Gson gson = new Gson(); private final Logger logger = LoggerFactory.getLogger("Utilize - SettingManager"); @@ -33,39 +33,35 @@ private SettingManager() { } public static SettingManager getInstance() { - if (INSTANCE == null) INSTANCE = new SettingManager(); return INSTANCE; } public static void shutdown() { - if (INSTANCE == null) return; - INSTANCE.forceSaveQueue(); - INSTANCE = null; } public void tick() { - if (this.saveQueue.isEmpty()) return; + if (saveQueue.isEmpty()) return; long currentTime = System.currentTimeMillis(); - if (currentTime - this.lastSaveTime < this.saveInterval.toMillis()) return; + if (currentTime - lastSaveTime < saveInterval.toMillis()) return; - if (this.saveFuture != null && !this.saveFuture.isDone()) return; + if (saveFuture != null && !saveFuture.isDone()) return; - this.saveFuture = CompletableFuture.supplyAsync(() -> { - int files = this.saveQueue.size(); - int size = this.saveQueue.values().stream().mapToInt(List::size).sum(); - this.logger.info("Starting periodic 'setting batch save' for {} files and {} settings", files, size); + saveFuture = CompletableFuture.supplyAsync(() -> { + int files = saveQueue.size(); + int size = saveQueue.values().stream().mapToInt(List::size).sum(); + logger.info("Starting periodic 'setting batch save' for {} files and {} settings", files, size); - for (String path : this.saveQueue.keySet()) { + for (String path : saveQueue.keySet()) { File file = new File(path); - if (this.saveBatchToFile(file, this.saveQueue.get(path))) continue; - this.logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath()); + if (saveBatchToFile(file, saveQueue.get(path))) continue; + logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath()); } - this.lastSaveTime = currentTime; - this.saveQueue.clear(); + lastSaveTime = currentTime; + saveQueue.clear(); return true; }); } @@ -74,11 +70,11 @@ public boolean queueSave(@NotNull File file, @NotNull ISetting setting) { String path = file.getAbsolutePath(); KeyedSetting keyedSetting = setting.asKeyedSetting(); - List> settingsList = this.saveQueue.getOrDefault(path, new ArrayList<>()); + List> settingsList = saveQueue.getOrDefault(path, new ArrayList<>()); settingsList.removeIf(s -> s.key().equals(keyedSetting.key())); settingsList.add(keyedSetting); - this.saveQueue.put(path, settingsList); + saveQueue.put(path, settingsList); return true; } @@ -86,37 +82,37 @@ public boolean queueSave(@NotNull File file, @NotNull List> settings boolean success = true; for (ISetting setting : settings) { - if (!this.queueSave(file, setting)) success = false; + if (!queueSave(file, setting)) success = false; } return success; } public void forceSaveQueue() { - if (this.saveQueue.isEmpty()) return; + if (saveQueue.isEmpty()) return; - int files = this.saveQueue.size(); - int size = this.saveQueue.values().stream().mapToInt(List::size).sum(); - this.logger.info("Forced starting 'setting batch save' for {} files and {} settings", files, size); + int files = saveQueue.size(); + int size = saveQueue.values().stream().mapToInt(List::size).sum(); + logger.info("Forced starting 'setting batch save' for {} files and {} settings", files, size); - for (String path : this.saveQueue.keySet()) { + for (String path : saveQueue.keySet()) { File file = new File(path); - if (this.saveBatchToFile(file, this.saveQueue.get(path))) continue; - this.logger.error("Failed to force save settings batch to file: {}", file.getAbsolutePath()); + if (saveBatchToFile(file, saveQueue.get(path))) continue; + logger.error("Failed to force save settings batch to file: {}", file.getAbsolutePath()); } - this.saveQueue.clear(); + saveQueue.clear(); } public boolean loadSetting(@NotNull File file, @NotNull ISetting setting) { - List> batch = this.readBatchFromFile(file); - return this.loadSettingFromBatch(setting, batch); + List> batch = readBatchFromFile(file); + return loadSettingFromBatch(setting, batch); } public boolean loadSettings(@NotNull File file, @NotNull List> settings) { - List> batch = this.readBatchFromFile(file); - for (ISetting setting : settings) this.loadSettingFromBatch(setting, batch); + List> batch = readBatchFromFile(file); + for (ISetting setting : settings) loadSettingFromBatch(setting, batch); return true; } @@ -129,19 +125,19 @@ private boolean loadSettingFromBatch(@NotNull ISetting setting, @Nullable for (KeyedSetting keyedSetting : batch) { if (!keyedSetting.key().equals(setting.getIdentifier())) continue; - JsonElement jsonElement = this.gson.toJsonTree(keyedSetting.value()); - T value = this.gson.fromJson(jsonElement, setting.getType()); + JsonElement jsonElement = gson.toJsonTree(keyedSetting.value()); + T value = gson.fromJson(jsonElement, setting.getType()); setting.setValue(setting.shouldAllowNull() ? value : value != null ? value : setting.getDefault()); return true; } - this.logger.warn("Failed to load setting: {} from batch", setting.getIdentifier()); + logger.warn("Failed to load setting: {} from batch", setting.getIdentifier()); return false; } private boolean saveBatchToFile(@NotNull File file, @NotNull List> settings) { - List> currentSettings = this.readBatchFromFile(file); + List> currentSettings = readBatchFromFile(file); if (currentSettings == null) currentSettings = new ArrayList<>(); HashMap> settingsMap = new HashMap<>(); @@ -156,20 +152,20 @@ private boolean saveBatchToFile(@NotNull File file, @NotNull List(settingsMap.values()); try (FileWriter writer = new FileWriter(file)) { - this.gson.toJson(currentSettings, writer); + gson.toJson(currentSettings, writer); return true; } catch (IOException e) { - this.logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath(), e); + logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath(), e); return false; } } private @Nullable List> readBatchFromFile(@NotNull File file) { try (Reader reader = new FileReader(file)) { - return this.gson.fromJson(reader, new TypeToken>>() { + return gson.fromJson(reader, new TypeToken>>() { }.getType()); } catch (IOException e) { - this.logger.error("Failed to read settings batch from file: {}", file.getAbsolutePath(), e); + logger.error("Failed to read settings batch from file: {}", file.getAbsolutePath(), e); return null; } } diff --git a/src/main/java/nl/devpieter/utilize/task/TaskManager.java b/src/main/java/nl/devpieter/utilize/task/TaskManager.java index 448e358..187f5b5 100644 --- a/src/main/java/nl/devpieter/utilize/task/TaskManager.java +++ b/src/main/java/nl/devpieter/utilize/task/TaskManager.java @@ -3,44 +3,90 @@ import nl.devpieter.utilize.task.interfaces.ITask; import java.util.ArrayList; +import java.util.EnumMap; import java.util.List; -public class TaskManager { +public final class TaskManager { - private static TaskManager INSTANCE; + private static final TaskManager INSTANCE = new TaskManager(); - private final List tasks = new ArrayList<>(); + private final List pendingTasks = new ArrayList<>(); + private final EnumMap> taskMap = new EnumMap<>(TickPhase.class); private TaskManager() { + taskMap.put(TickPhase.PLAYER_HEAD, new ArrayList<>()); + taskMap.put(TickPhase.PLAYER_TAIL, new ArrayList<>()); + taskMap.put(TickPhase.CLIENT_HEAD, new ArrayList<>()); + taskMap.put(TickPhase.CLIENT_TAIL, new ArrayList<>()); } public static TaskManager getInstance() { - if (INSTANCE == null) INSTANCE = new TaskManager(); return INSTANCE; } - public static void shutdown() { - if (INSTANCE == null) return; - - INSTANCE.tasks.clear(); - INSTANCE = null; + public void addTask(ITask task) { + addTask(task, TickPhase.PLAYER_TAIL); } - public void addTask(ITask task) { - this.tasks.add(task); + public void addTask(ITask task, TickPhase phase) { + pendingTasks.add(new TaskEntry(task, phase)); } public void removeTask(ITask task) { - this.tasks.remove(task); + pendingTasks.removeIf(entry -> entry.task() == task); + + for (List tasks : taskMap.values()) { + tasks.remove(task); + } } - public void tick() { - for (ITask task : this.tasks) { - task.tick(); - if (!task.isFinished()) continue; + public void beginTick() { + flushPendingTasks(); + } - if (task.resetOnFinish()) task.reset(); - else this.removeTask(task); + public void tick(TickPhase phase) { + List tasks = taskMap.get(phase); + if (tasks == null || tasks.isEmpty()) return; + + List toRemove = new ArrayList<>(); + + for (ITask task : tasks) { + TickResult result = task.tick(); + + if (result == TickResult.FINISHED) { + toRemove.add(task); + } else if (result == TickResult.REQUEUE) { + toRemove.add(task); + addTask(task, phase); + } } + + tasks.removeAll(toRemove); + } + + private void flushPendingTasks() { + if (pendingTasks.isEmpty()) return; + + for (TaskEntry entry : pendingTasks) { + taskMap.get(entry.phase()).add(entry.task()); + } + + pendingTasks.clear(); + } + + public enum TickPhase { + PLAYER_HEAD, + PLAYER_TAIL, + CLIENT_HEAD, + CLIENT_TAIL + } + + public enum TickResult { + CONTINUE, + FINISHED, + REQUEUE + } + + private record TaskEntry(ITask task, TickPhase phase) { } } diff --git a/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java b/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java index db60803..b2fd1a0 100644 --- a/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java +++ b/src/main/java/nl/devpieter/utilize/task/interfaces/ITask.java @@ -1,14 +1,8 @@ package nl.devpieter.utilize.task.interfaces; -public interface ITask { - - void tick(); +import nl.devpieter.utilize.task.TaskManager; - void reset(); - - boolean isFinished(); +public interface ITask { - default boolean resetOnFinish() { - return false; - } + TaskManager.TickResult tick(); } diff --git a/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java b/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java index 6a1ca0f..e056da3 100644 --- a/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java +++ b/src/main/java/nl/devpieter/utilize/task/tasks/RunLaterTask.java @@ -1,6 +1,8 @@ package nl.devpieter.utilize.task.tasks; +import nl.devpieter.utilize.task.TaskManager; import nl.devpieter.utilize.task.interfaces.ITask; +import nl.devpieter.utilize.utils.common.MathUtils; import org.jetbrains.annotations.NotNull; import java.time.Duration; @@ -10,53 +12,31 @@ public class RunLaterTask implements ITask { private final Runnable runnable; private final int startDelayTicks; - private final boolean resetOnFinish; private boolean finished; private int tickCounter; - public RunLaterTask(@NotNull Runnable runnable, int startDelayTicks) { - this(runnable, startDelayTicks, false); - } - public RunLaterTask(@NotNull Runnable runnable, @NotNull Duration startDelay) { - this(runnable, startDelay, false); + this(runnable, MathUtils.durationToTicks(startDelay)); } - public RunLaterTask(@NotNull Runnable runnable, @NotNull Duration startDelay, boolean resetOnFinish) { - this(runnable, (int) (startDelay.toMillis() / 50), resetOnFinish); - } - - public RunLaterTask(@NotNull Runnable runnable, int startDelayTicks, boolean resetOnFinish) { + public RunLaterTask(@NotNull Runnable runnable, int startDelayTicks) { this.runnable = runnable; this.startDelayTicks = startDelayTicks; - this.resetOnFinish = resetOnFinish; } @Override - public void tick() { - if (this.finished) return; - - this.tickCounter++; - if (this.tickCounter < this.startDelayTicks) return; + public TaskManager.TickResult tick() { + if (finished) return TaskManager.TickResult.FINISHED; - this.runnable.run(); - this.finished = true; - } + tickCounter++; + if (tickCounter < startDelayTicks) { + return TaskManager.TickResult.CONTINUE; + } - @Override - public void reset() { - this.finished = false; - this.tickCounter = 0; - } + runnable.run(); + finished = true; - @Override - public boolean isFinished() { - return this.finished; - } - - @Override - public boolean resetOnFinish() { - return this.resetOnFinish; + return TaskManager.TickResult.FINISHED; } } diff --git a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java index 02e79a2..aa69f3e 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java @@ -5,8 +5,22 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import java.time.Duration; + public class MathUtils { + public static int secondsToTicks(int seconds) { + return seconds * 20; + } + + public static int ticksToSeconds(int ticks) { + return ticks / 20; + } + + public static int durationToTicks(Duration duration) { + return (int) (duration.toMillis() / 50); + } + @Contract("_ -> new") public static @NotNull Vec3d from(@NotNull Vec3i vec3i) { return new Vec3d(vec3i.getX(), vec3i.getY(), vec3i.getZ()); From 98057c9f864375d01876b1ec25ff8c8c105d03ab Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 13:13:37 +0100 Subject: [PATCH 32/41] Make util classes final --- .../java/nl/devpieter/utilize/utils/common/FileUtils.java | 5 ++++- .../java/nl/devpieter/utilize/utils/common/MathUtils.java | 5 ++++- .../java/nl/devpieter/utilize/utils/common/RandomUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/ClientUtils.java | 5 ++++- .../devpieter/utilize/utils/minecraft/EnchantmentUtils.java | 5 ++++- .../devpieter/utilize/utils/minecraft/InteractionUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/InventoryUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/NetworkUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/PlayerUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/SoundUtils.java | 5 ++++- .../java/nl/devpieter/utilize/utils/minecraft/TextUtils.java | 5 ++++- .../nl/devpieter/utilize/utils/minecraft/WorldUtils.java | 5 ++++- 12 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java index 2e10dd6..28131ad 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/FileUtils.java @@ -2,7 +2,10 @@ import java.io.File; -public class FileUtils { +public final class FileUtils { + + private FileUtils() { + } public static boolean doesFileExist(File file) { try { diff --git a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java index aa69f3e..a79bb51 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/MathUtils.java @@ -7,7 +7,10 @@ import java.time.Duration; -public class MathUtils { +public final class MathUtils { + + private MathUtils() { + } public static int secondsToTicks(int seconds) { return seconds * 20; diff --git a/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java index 09e1bcb..b53506d 100644 --- a/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/common/RandomUtils.java @@ -1,6 +1,9 @@ package nl.devpieter.utilize.utils.common; -public class RandomUtils { +public final class RandomUtils { + + private RandomUtils() { + } /** * @param chanceForTrue The chance to return true (0 to 100). diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java index a1422cc..a50737d 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java @@ -8,7 +8,10 @@ import net.minecraft.client.sound.SoundManager; import net.minecraft.client.world.ClientWorld; -public class ClientUtils { +public final class ClientUtils { + + private ClientUtils() { + } public static boolean isDevEnv() { return FabricLoader.getInstance().isDevelopmentEnvironment(); diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java index ce98f1c..b17db70 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java @@ -12,7 +12,10 @@ import java.util.Set; -public class EnchantmentUtils { +public final class EnchantmentUtils { + + private EnchantmentUtils() { + } public static boolean isMaxLevel(@NotNull RegistryEntry enchantment, int level) { return level == enchantment.value().getMaxLevel(); diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java index b02ec89..c17d3af 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/InteractionUtils.java @@ -2,7 +2,10 @@ import net.minecraft.screen.slot.SlotActionType; -public class InteractionUtils { +public final class InteractionUtils { + + private InteractionUtils() { + } public static void clickInventorySlot(int syncId, int packetSlot, int button, SlotActionType actionType) { if (!ClientUtils.hasInteractionManager() || !ClientUtils.hasPlayer()) return; diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java index c2bcb51..406f430 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java @@ -13,7 +13,10 @@ import java.util.ArrayList; import java.util.List; -public class InventoryUtils { +public final class InventoryUtils { + + private InventoryUtils() { + } public static boolean hasInventory() { return ClientUtils.hasPlayer() && ClientUtils.getPlayer().getInventory() != null; diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java index 9df6a62..e3ae13f 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java @@ -3,7 +3,10 @@ import net.minecraft.network.packet.Packet; import org.jetbrains.annotations.NotNull; -public class NetworkUtils { +public final class NetworkUtils { + + private NetworkUtils() { + } public static void sendPacket(@NotNull Packet packet) { if (!ClientUtils.hasNetworkHandler()) return; diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java index 02efbcf..9f5bb71 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java @@ -8,7 +8,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PlayerUtils { +public final class PlayerUtils { + + private PlayerUtils() { + } public static void sendMessage(@NotNull Text message, boolean overlay) { if (!ClientUtils.hasPlayer()) return; diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java index dcffd54..f1b533e 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/SoundUtils.java @@ -5,7 +5,10 @@ import net.minecraft.sound.SoundEvent; import org.jetbrains.annotations.NotNull; -public class SoundUtils { +public final class SoundUtils { + + private SoundUtils() { + } public static void playOnMaster(@NotNull SoundEvent soundEvent) { playOnMaster(soundEvent, 1.0F, 1.0F); diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java index 4aabdb4..72603bd 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/TextUtils.java @@ -5,7 +5,10 @@ import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; -public class TextUtils { +public final class TextUtils { + + private TextUtils() { + } public static MutableText currentOrDefaultStyle(@NotNull Text text, @NotNull Style defaultStyle) { return Text.of("").copy().setStyle(defaultStyle).append(text); diff --git a/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java index 373befb..bac83d7 100644 --- a/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java @@ -10,7 +10,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class WorldUtils { +public final class WorldUtils { + + private WorldUtils() { + } public static @Nullable BlockState getStateAt(@NotNull Vec3d vec3d) { return getStateAt(MathUtils.from(vec3d)); From 184233b2189d014bfd6359b3b029823df6885e41 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 13:23:23 +0100 Subject: [PATCH 33/41] Refactor code to remove unnecessary 'this' references --- .../java/nl/devpieter/utilize/Utilize.java | 18 +++--- .../devpieter/utilize/http/AsyncRequest.java | 22 ++++---- .../utilize/mixins/ChatHudMixin.java | 10 ++-- .../ClientPlayerInteractionManagerMixin.java | 56 +++++++++---------- .../devpieter/utilize/mixins/SeesMixin.java | 4 +- .../utilize/models/PolymorphicValue.java | 8 +-- .../utilize/setting/base/SettingBase.java | 8 +-- .../setting/settings/BooleanSetting.java | 8 +-- .../setting/settings/FloatSetting.java | 24 ++++---- .../utilize/setting/settings/IntSetting.java | 24 ++++---- .../utilize/setting/settings/ListSetting.java | 34 +++++------ .../utilize/setting/settings/MapSetting.java | 24 ++++---- 12 files changed, 119 insertions(+), 121 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index bccdf04..82a703a 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -24,14 +24,14 @@ public void onInitializeClient() { INSTANCE = this; ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { - this.logger.info("Shutting down Utilize..."); + logger.info("Shutting down Utilize..."); SettingManager.shutdown(); AsyncRequest.shutdown(); }); - this.logger.info("Utilize initialized successfully! Version: {}", this.getUtilizeVersion()); - this.isInitialized = true; + logger.info("Utilize initialized successfully! Version: {}", getUtilizeVersion()); + isInitialized = true; } /** @@ -63,11 +63,11 @@ public static Utilize getInstance() { * @return true if initialized, false otherwise */ public boolean isInitialized() { - return this.isInitialized; + return isInitialized; } public String getUtilizeVersion() { - return this.modContainer.getMetadata().getVersion().getFriendlyString(); + return modContainer.getMetadata().getVersion().getFriendlyString(); } public String getMinecraftVersion() { @@ -83,8 +83,8 @@ public String getMinecraftVersion() { public String getUserAgent() { return String.format( "Utilize/%s (Mc/%s; Java/%s)", - this.getUtilizeVersion(), - this.getMinecraftVersion(), + getUtilizeVersion(), + getMinecraftVersion(), System.getProperty("java.version") ); } @@ -102,8 +102,8 @@ public String getUserAgent(String name, String version) { "%s/%s (Utilize/%s; Mc/%s; Java/%s)", name, version, - this.getUtilizeVersion(), - this.getMinecraftVersion(), + getUtilizeVersion(), + getMinecraftVersion(), System.getProperty("java.version") ); } diff --git a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java index 6ea8538..f8b74a5 100644 --- a/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java +++ b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java @@ -21,7 +21,7 @@ public AsyncRequest() { public AsyncRequest(@Nullable ResultConsumer requestCallback) { if (requestCallback == null) return; - this.callbacks.add(requestCallback); + callbacks.add(requestCallback); } public static void shutdown() { @@ -38,42 +38,42 @@ public static void shutdown() { public void addCallback(@Nullable ResultConsumer callback) { if (callback == null) return; - this.callbacks.add(callback); + callbacks.add(callback); } public void execute() { - if (this.future != null) return; + if (future != null) return; - this.future = CompletableFuture.supplyAsync(() -> { + future = CompletableFuture.supplyAsync(() -> { try { T result = requestAsync(); - this.callCallbacks(result, null); + callCallbacks(result, null); return result; } catch (Exception e) { - this.callCallbacks(null, e); + callCallbacks(null, e); throw new RuntimeException(e); } }, EXECUTOR_SERVICE); } public void cancel() { - this.future.cancel(true); + future.cancel(true); } public boolean isDone() { - return this.future.isDone(); + return future.isDone(); } public T get() throws ExecutionException, InterruptedException { - return this.future.get(); + return future.get(); } public CompletableFuture getFuture() { - return this.future; + return future; } private void callCallbacks(@Nullable T result, @Nullable Exception exception) { - for (ResultConsumer callback : this.callbacks) { + for (ResultConsumer callback : callbacks) { if (callback != null) callback.accept(result, exception); } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java index 17d59ac..8074108 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java @@ -38,7 +38,7 @@ public abstract class ChatHudMixin { @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", cancellable = true) public void onAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, CallbackInfo ci) { ReceiveMessageEvent event = new ReceiveMessageEvent(message); // rename to ChatHudMessageAddEvent, or something similar - Text result = this.sees.dispatchWithResult(event); + Text result = sees.dispatchWithResult(event); if (event.isCancelled()) { ci.cancel(); @@ -46,10 +46,10 @@ public void onAddMessage(Text message, MessageSignatureData signatureData, Messa } // TODO - Optimize - ChatHudLine chatHudLine = new ChatHudLine(this.client.inGameHud.getTicks(), result, signatureData, indicator); - this.logChatMessage(chatHudLine); - this.addVisibleMessage(chatHudLine); - this.addMessage(chatHudLine); + ChatHudLine chatHudLine = new ChatHudLine(client.inGameHud.getTicks(), result, signatureData, indicator); + logChatMessage(chatHudLine); + addVisibleMessage(chatHudLine); + addMessage(chatHudLine); ci.cancel(); } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 1ef8faa..096b8b7 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -42,117 +42,117 @@ public abstract class ClientPlayerInteractionManagerMixin { @Inject(at = @At("HEAD"), method = "updateBlockBreakingProgress", cancellable = true) private void onUpdateBlockBreakingProgress(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new UpdateBlockBreakingProgressEvent(pos, direction))) return; + if (!sees.dispatch(new UpdateBlockBreakingProgressEvent(pos, direction))) return; // TODO - Make not cancelable? - this.cancelBlockBreaking(); + cancelBlockBreaking(); cir.setReturnValue(false); } @Inject(at = @At("HEAD"), method = "attackBlock", cancellable = true) private void onAttackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new AttackBlockEvent(pos, direction))) return; + if (!sees.dispatch(new AttackBlockEvent(pos, direction))) return; - this.cancelBlockBreaking(); + cancelBlockBreaking(); cir.setReturnValue(false); } @Inject(at = @At("RETURN"), method = "attackBlock", cancellable = true) private void onAttackBlockReturn(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new AttackBlockReturnEvent(pos, direction, cir.getReturnValue()))); + cir.setReturnValue(sees.dispatchWithResult(new AttackBlockReturnEvent(pos, direction, cir.getReturnValue()))); } @Inject(at = @At("TAIL"), method = "attackBlock") private void onAttackBlockTail(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { - this.sees.dispatch(new AttackBlockTailEvent(pos, direction)); + sees.dispatch(new AttackBlockTailEvent(pos, direction)); } @Inject(at = @At("HEAD"), method = "breakBlock", cancellable = true) private void onBreakBlock(BlockPos pos, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new BreakBlockEvent(pos))) return; + if (!sees.dispatch(new BreakBlockEvent(pos))) return; - this.cancelBlockBreaking(); + cancelBlockBreaking(); cir.setReturnValue(false); } @Inject(at = @At("RETURN"), method = "breakBlock", cancellable = true) private void onBreakBlockReturn(BlockPos pos, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new BreakBlockReturnEvent(pos, cir.getReturnValue()))); + cir.setReturnValue(sees.dispatchWithResult(new BreakBlockReturnEvent(pos, cir.getReturnValue()))); } @Inject(at = @At("TAIL"), method = "breakBlock") private void onBreakBlockTail(BlockPos pos, CallbackInfoReturnable cir) { - this.sees.dispatch(new BreakBlockTailEvent(pos)); + sees.dispatch(new BreakBlockTailEvent(pos)); } @Inject(at = @At("HEAD"), method = "interactBlock", cancellable = true) private void onInteractBlock(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new InteractBlockEvent(hand, hitResult))) return; + if (!sees.dispatch(new InteractBlockEvent(hand, hitResult))) return; cir.setReturnValue(ActionResult.FAIL); } @Inject(at = @At("RETURN"), method = "interactBlock", cancellable = true) private void onInteractBlockReturn(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new InteractBlockReturnEvent(hand, hitResult, cir.getReturnValue()))); + cir.setReturnValue(sees.dispatchWithResult(new InteractBlockReturnEvent(hand, hitResult, cir.getReturnValue()))); } @Inject(at = @At("TAIL"), method = "interactBlock") private void onInteractBlockTail(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - this.sees.dispatch(new InteractBlockTailEvent(hand, hitResult)); + sees.dispatch(new InteractBlockTailEvent(hand, hitResult)); } @Inject(at = @At("HEAD"), method = "interactItem", cancellable = true) private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new InteractItemEvent(hand))) return; + if (!sees.dispatch(new InteractItemEvent(hand))) return; cir.setReturnValue(ActionResult.FAIL); } @Inject(at = @At("RETURN"), method = "interactItem", cancellable = true) private void onInteractItemReturn(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new InteractItemReturnEvent(hand, cir.getReturnValue()))); + cir.setReturnValue(sees.dispatchWithResult(new InteractItemReturnEvent(hand, cir.getReturnValue()))); } @Inject(at = @At("TAIL"), method = "interactItem") private void onInteractItemTail(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - this.sees.dispatch(new InteractItemTailEvent(hand)); + sees.dispatch(new InteractItemTailEvent(hand)); } @Inject(at = @At("HEAD"), method = "attackEntity", cancellable = true) private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) { - if (!this.sees.dispatch(new AttackEntityEvent(target))) return; + if (!sees.dispatch(new AttackEntityEvent(target))) return; ci.cancel(); } @Inject(at = @At("RETURN"), method = "attackEntity") private void onAttackEntityReturn(PlayerEntity player, Entity target, CallbackInfo ci) { - this.sees.dispatch(new AttackEntityReturnEvent(target)); + sees.dispatch(new AttackEntityReturnEvent(target)); } @Inject(at = @At("TAIL"), method = "attackEntity") private void onAttackEntityTail(PlayerEntity player, Entity target, CallbackInfo ci) { - this.sees.dispatch(new AttackEntityTailEvent(target)); + sees.dispatch(new AttackEntityTailEvent(target)); } @Inject(at = @At("HEAD"), method = "interactEntity", cancellable = true) private void onInteractEntity(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { - if (!this.sees.dispatch(new InteractEntityEvent(target, hand))) return; + if (!sees.dispatch(new InteractEntityEvent(target, hand))) return; cir.setReturnValue(ActionResult.FAIL); } @Inject(at = @At("RETURN"), method = "interactEntity", cancellable = true) private void onInteractEntityReturn(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { - cir.setReturnValue(this.sees.dispatchWithResult(new InteractEntityReturnEvent(target, hand, cir.getReturnValue()))); + cir.setReturnValue(sees.dispatchWithResult(new InteractEntityReturnEvent(target, hand, cir.getReturnValue()))); } @Inject(at = @At("TAIL"), method = "interactEntity") private void onInteractEntityTail(PlayerEntity player, Entity target, Hand hand, CallbackInfoReturnable cir) { - this.sees.dispatch(new InteractEntityTailEvent(target, hand)); + sees.dispatch(new InteractEntityTailEvent(target, hand)); } @Inject(at = @At("HEAD"), method = "clickSlot", cancellable = true) private void onClickSlot(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci) { - if (!this.sees.dispatch(new SlotClickEvent(syncId, slotId, button, actionType))) return; + if (!sees.dispatch(new SlotClickEvent(syncId, slotId, button, actionType))) return; ci.cancel(); } @@ -160,14 +160,14 @@ private void onClickSlot(int syncId, int slotId, int button, SlotActionType acti private void onSyncSelectedSlot(CallbackInfo ci) { int slot = InventoryUtils.getSelectedHotbarSlot(); - if (this.lastSelectedHotbarSlot == -1) { - this.lastSelectedHotbarSlot = slot; + if (lastSelectedHotbarSlot == -1) { + lastSelectedHotbarSlot = slot; return; } - if (slot == this.lastSelectedHotbarSlot) return; - this.lastSelectedHotbarSlot = slot; + if (slot == lastSelectedHotbarSlot) return; + lastSelectedHotbarSlot = slot; - this.sees.dispatch(new HotbarSlotChangedEvent(this.lastSelectedHotbarSlot, slot)); + sees.dispatch(new HotbarSlotChangedEvent(lastSelectedHotbarSlot, slot)); } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java index f5ead45..efaa107 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java @@ -1,11 +1,9 @@ package nl.devpieter.utilize.mixins; -import net.minecraft.text.Text; import nl.devpieter.sees.Sees; import nl.devpieter.sees.event.SEvent; import nl.devpieter.utilize.events.tick.ITickEvent; import nl.devpieter.utilize.utils.minecraft.ClientUtils; -import nl.devpieter.utilize.utils.minecraft.PlayerUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongepowered.asm.mixin.Mixin; @@ -28,6 +26,6 @@ private void onDispatch(SEvent event, CallbackInfoReturnable cir) { if (event instanceof ITickEvent) return; if (!ClientUtils.isDevEnv()) return; - this.logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); + logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); } } diff --git a/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java b/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java index 209c04d..755b600 100644 --- a/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java +++ b/src/main/java/nl/devpieter/utilize/models/PolymorphicValue.java @@ -17,9 +17,9 @@ public PolymorphicValue() { } public PolymorphicValue(@NotNull T value) { - this.className = value.getClass().getName(); - this.data = gson.toJsonTree(value); - this.instance = value; + className = value.getClass().getName(); + data = gson.toJsonTree(value); + instance = value; } public T getValue(Class baseType) { @@ -36,6 +36,6 @@ public T getValue(Class baseType) { } public void sync() { - this.data = gson.toJsonTree(instance); + data = gson.toJsonTree(instance); } } diff --git a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java index d2d8997..c36ddae 100644 --- a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java +++ b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java @@ -25,22 +25,22 @@ public SettingBase(@NotNull String identifier, T defaultValue, boolean allowNull @Override public String getIdentifier() { - return this.identifier; + return identifier; } @Override public boolean shouldAllowNull() { - return this.allowNull; + return allowNull; } @Override public T getValue() { - return this.value; + return value; } @Override public T getDefault() { - return this.defaultValue; + return defaultValue; } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java index 7f3a287..4ef0a54 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/BooleanSetting.java @@ -16,17 +16,17 @@ public BooleanSetting(@NotNull String identifier, Boolean defaultValue, boolean @Override public void toggle() { - if (this.getValue() == null) throw new IllegalStateException("Cannot toggle a null value. Use setValue() instead."); - this.setValue(!this.getValue()); + if (getValue() == null) throw new IllegalStateException("Cannot toggle a null value. Use setValue() instead."); + setValue(!getValue()); } @Override public void setTrue() { - this.setValue(true); + setValue(true); } @Override public void setFalse() { - this.setValue(false); + 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 index 0a67876..e974858 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/FloatSetting.java @@ -19,32 +19,32 @@ public FloatSetting(@NotNull String identifier, Float defaultValue, boolean allo @Override public void increment() { - if (this.getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); - this.setValue(this.getValue() + 1.0F); + if (getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); + setValue(getValue() + 1.0F); } @Override public void increment(@Nullable Float amount) { - if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + if (amount == null && !shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); - if (amount == null) this.setValue(0.0F); - else if (this.getValue() == null) this.setValue(amount); - else this.setValue(this.getValue() + amount); + if (amount == null) setValue(0.0F); + else if (getValue() == null) setValue(amount); + else setValue(getValue() + amount); } @Override public void decrement() { - if (this.getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); - this.setValue(this.getValue() - 1.0F); + if (getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); + setValue(getValue() - 1.0F); } @Override public void decrement(@Nullable Float amount) { - if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + if (amount == null && !shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); - if (amount == null) this.setValue(0.0F); - else if (this.getValue() == null) this.setValue(-amount); - else this.setValue(this.getValue() - amount); + if (amount == null) setValue(0.0F); + else if (getValue() == null) setValue(-amount); + else setValue(getValue() - amount); } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java index e23e8af..a7a93b7 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/IntSetting.java @@ -19,32 +19,32 @@ public IntSetting(@NotNull String identifier, Integer defaultValue, boolean allo @Override public void increment() { - if (this.getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); - this.setValue(this.getValue() + 1); + if (getValue() == null) throw new IllegalStateException("Cannot increment a null value. Use setValue() instead."); + setValue(getValue() + 1); } @Override public void increment(@Nullable Integer amount) { - if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + if (amount == null && !shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); - if (amount == null) this.setValue(0); - else if (this.getValue() == null) this.setValue(amount); - else this.setValue(this.getValue() + amount); + if (amount == null) setValue(0); + else if (getValue() == null) setValue(amount); + else setValue(getValue() + amount); } @Override public void decrement() { - if (this.getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); - this.setValue(this.getValue() - 1); + if (getValue() == null) throw new IllegalStateException("Cannot decrement a null value. Use setValue() instead."); + setValue(getValue() - 1); } @Override public void decrement(@Nullable Integer amount) { - if (amount == null && !this.shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); + if (amount == null && !shouldAllowNull()) throw new IllegalArgumentException("Amount cannot be null"); - if (amount == null) this.setValue(0); - else if (this.getValue() == null) this.setValue(-amount); - else this.setValue(this.getValue() - amount); + if (amount == null) setValue(0); + else if (getValue() == null) setValue(-amount); + else setValue(getValue() - amount); } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java index 1e93924..e939954 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/ListSetting.java @@ -19,50 +19,50 @@ public ListSetting(String identifier, List defaultValue, boolean allowNull) { @Override public boolean contains(T value) { - if (this.getValue() == null) return false; - return this.getValue().contains(value); + if (getValue() == null) return false; + return getValue().contains(value); } @Override public void add(T value) { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot add element."); - this.getValue().add(value); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot add element."); + getValue().add(value); } @Override public void remove(T value) { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove element."); - this.getValue().remove(value); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot remove element."); + getValue().remove(value); } @Override public void removeAt(int index) { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove element at index."); - if (index < 0 || index >= this.getValue().size()) throw new IndexOutOfBoundsException("Index out of bounds for list."); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot remove element at index."); + if (index < 0 || index >= getValue().size()) throw new IndexOutOfBoundsException("Index out of bounds for list."); - this.getValue().remove(index); + getValue().remove(index); } @Override public void removeFirst() { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove first element."); - if (this.getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove first element."); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot remove first element."); + if (getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove first element."); - this.getValue().removeFirst(); + getValue().removeFirst(); } @Override public void removeLast() { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot remove last element."); - if (this.getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove last element."); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot remove last element."); + if (getValue().isEmpty()) throw new IllegalStateException("List is empty, cannot remove last element."); - this.getValue().removeLast(); + getValue().removeLast(); } @Override public void clear() { - if (this.getValue() == null) throw new IllegalStateException("List value is null, cannot clear."); - this.getValue().clear(); + if (getValue() == null) throw new IllegalStateException("List value is null, cannot clear."); + getValue().clear(); } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java b/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java index 83a5abc..cd498c8 100644 --- a/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/settings/MapSetting.java @@ -20,38 +20,38 @@ public MapSetting(@NotNull String identifier, Map defaultValue, boolean al @Override public boolean containsKey(T key) { - if (this.getValue() == null) return false; - return this.getValue().containsKey(key); + if (getValue() == null) return false; + return getValue().containsKey(key); } @Override public boolean containsValue(V value) { - if (this.getValue() == null) return false; - return this.getValue().containsValue(value); + if (getValue() == null) return false; + return getValue().containsValue(value); } @Override public V get(T key) { - if (this.getValue() == null) return null; - return this.getValue().get(key); + if (getValue() == null) return null; + return getValue().get(key); } @Override public void put(T key, V value) { - if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot put element."); - this.getValue().put(key, value); + if (getValue() == null) throw new IllegalStateException("Map value is null, cannot put element."); + getValue().put(key, value); } @Override public void remove(T key) { - if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot remove element."); - this.getValue().remove(key); + if (getValue() == null) throw new IllegalStateException("Map value is null, cannot remove element."); + getValue().remove(key); } @Override public void clear() { - if (this.getValue() == null) throw new IllegalStateException("Map value is null, cannot clear elements."); - this.getValue().clear(); + if (getValue() == null) throw new IllegalStateException("Map value is null, cannot clear elements."); + getValue().clear(); } @Override From f46928ecf3953eb5106d58a8870801d3782290a5 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 13:35:57 +0100 Subject: [PATCH 34/41] Fix DebugManager --- .../utilize/managers/DebugManager.java | 12 ++++--- .../utilize/mixins/DebugRendererMixin.java | 34 ------------------- .../accessors/DebugRendererAccessor.java | 17 ++++++++++ src/main/resources/utilize.mixins.json | 4 +-- 4 files changed, 27 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java create mode 100644 src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java diff --git a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java b/src/main/java/nl/devpieter/utilize/managers/DebugManager.java index 1d67823..0fe87db 100644 --- a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/DebugManager.java @@ -1,16 +1,17 @@ package nl.devpieter.utilize.managers; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.debug.DebugRenderer; +import nl.devpieter.utilize.mixins.accessors.DebugRendererAccessor; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; public final class DebugManager { private static final DebugManager INSTANCE = new DebugManager(); - private final List renderers = new ArrayList<>(); + private final MinecraftClient minecraftClient = MinecraftClient.getInstance(); private DebugManager() { } @@ -20,15 +21,18 @@ public static DebugManager getInstance() { } public void addRenderer(@NotNull DebugRenderer.Renderer renderer) { + List renderers = getAccessor().utilize$getDebugRenderers(); if (renderers.contains(renderer)) return; + renderers.add(renderer); } public void removeRenderer(@NotNull DebugRenderer.Renderer renderer) { + List renderers = getAccessor().utilize$getDebugRenderers(); renderers.remove(renderer); } - public List getRenderers() { - return renderers; + private DebugRendererAccessor getAccessor() { + return (DebugRendererAccessor) minecraftClient.worldRenderer.debugRenderer; } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java b/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java deleted file mode 100644 index 63661e9..0000000 --- a/src/main/java/nl/devpieter/utilize/mixins/DebugRendererMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package nl.devpieter.utilize.mixins; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.debug.DebugRenderer; -import net.minecraft.client.util.math.MatrixStack; -import nl.devpieter.utilize.managers.DebugManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -//#if MC>=12102 -import net.minecraft.client.render.Frustum; -//#endif - -@Mixin(DebugRenderer.class) -public class DebugRendererMixin { - - @Unique - private final DebugManager debugManager = DebugManager.getInstance(); - -// @Inject(at = @At("HEAD"), method = "render") - //#if MC>=12102 -// private void onRender(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { - //#else - //$$ public void render(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { - //#endif - -// for (DebugRenderer.Renderer renderer : this.debugManager.getRenderers()) { -// renderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); -// } -// } -} diff --git a/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java b/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java new file mode 100644 index 0000000..273b214 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java @@ -0,0 +1,17 @@ +package nl.devpieter.utilize.mixins.accessors; + +import net.minecraft.client.render.debug.DebugRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(DebugRenderer.class) +public interface DebugRendererAccessor { + + @Accessor("debugRenderers") + List utilize$getDebugRenderers(); + + @Accessor("lateDebugRenderers") + List utilize$getLateDebugRenderers(); +} diff --git a/src/main/resources/utilize.mixins.json b/src/main/resources/utilize.mixins.json index 61bbf28..9e41a1d 100644 --- a/src/main/resources/utilize.mixins.json +++ b/src/main/resources/utilize.mixins.json @@ -7,9 +7,9 @@ "ChatHudMixin", "ClientPlayerEntityMixin", "ClientPlayerInteractionManagerMixin", - "DebugRendererMixin", "KeyBindingMixin", - "MinecraftClientMixin" + "MinecraftClientMixin", + "accessors.DebugRendererAccessor" ], "injectors": { "defaultRequire": 1 From 5756a88bb2ccd4033c3cb18a42c59f27cf57baa2 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 14:20:08 +0100 Subject: [PATCH 35/41] Refactor key binding events --- .../utilize/enums/KeyActionOverride.java | 7 +++ .../KeyBindingPressedCheckEvent.java | 29 ++++++++++ .../keybinding/KeyBindingPressedEvent.java | 29 ++++++++++ .../utilize/mixins/KeyBindingMixin.java | 55 +++++++++++++------ .../devpieter/utilize/mixins/SeesMixin.java | 3 +- 5 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 src/main/java/nl/devpieter/utilize/enums/KeyActionOverride.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedCheckEvent.java create mode 100644 src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedEvent.java diff --git a/src/main/java/nl/devpieter/utilize/enums/KeyActionOverride.java b/src/main/java/nl/devpieter/utilize/enums/KeyActionOverride.java new file mode 100644 index 0000000..e8b4dd3 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/enums/KeyActionOverride.java @@ -0,0 +1,7 @@ +package nl.devpieter.utilize.enums; + +public enum KeyActionOverride { + NONE, + FORCE_PRESS, + FORCE_RELEASE +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedCheckEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedCheckEvent.java new file mode 100644 index 0000000..abdc253 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedCheckEvent.java @@ -0,0 +1,29 @@ +package nl.devpieter.utilize.events.interaction.keybinding; + +import nl.devpieter.sees.event.SReturnableEvent; +import nl.devpieter.utilize.enums.KeyActionOverride; +import org.jetbrains.annotations.NotNull; + +public class KeyBindingPressedCheckEvent implements SReturnableEvent { + + private final String keyId; + private KeyActionOverride override = KeyActionOverride.NONE; + + public KeyBindingPressedCheckEvent(@NotNull String keyId) { + this.keyId = keyId; + } + + public @NotNull String getKeyId() { + return keyId; + } + + @Override + public KeyActionOverride getResult() { + return override; + } + + @Override + public void setResult(KeyActionOverride result) { + override = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedEvent.java new file mode 100644 index 0000000..38a7d83 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/keybinding/KeyBindingPressedEvent.java @@ -0,0 +1,29 @@ +package nl.devpieter.utilize.events.interaction.keybinding; + +import nl.devpieter.sees.event.SReturnableEvent; +import nl.devpieter.utilize.enums.KeyActionOverride; +import org.jetbrains.annotations.NotNull; + +public class KeyBindingPressedEvent implements SReturnableEvent { + + private final String keyId; + private KeyActionOverride override = KeyActionOverride.NONE; + + public KeyBindingPressedEvent(@NotNull String keyId) { + this.keyId = keyId; + } + + public @NotNull String getKeyId() { + return keyId; + } + + @Override + public KeyActionOverride getResult() { + return override; + } + + @Override + public void setResult(KeyActionOverride result) { + override = result; + } +} diff --git a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java index 76280f7..f1db70d 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java @@ -2,8 +2,12 @@ import net.minecraft.client.option.KeyBinding; import nl.devpieter.sees.Sees; +import nl.devpieter.utilize.enums.KeyActionOverride; import nl.devpieter.utilize.events.interaction.keybinding.AttackKeyPressedEvent; +import nl.devpieter.utilize.events.interaction.keybinding.KeyBindingPressedCheckEvent; +import nl.devpieter.utilize.events.interaction.keybinding.KeyBindingPressedEvent; import nl.devpieter.utilize.events.interaction.keybinding.UseKeyPressedEvent; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -14,48 +18,63 @@ @Mixin(KeyBinding.class) public abstract class KeyBindingMixin { -// @Shadow -// public abstract String getTranslationKey(); - @Shadow private int timesPressed; @Shadow public abstract void setPressed(boolean pressed); + @Shadow + public abstract String getId(); + @Unique private final Sees sees = Sees.getInstance(); @Inject(at = @At("RETURN"), method = "isPressed", cancellable = true) private void isPressed(CallbackInfoReturnable cir) { - if (!cir.getReturnValue()) return; - -// if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); -// else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); + handle(cir); + if (cir.getReturnValue()) handlePress(cir); } @Inject(at = @At("RETURN"), method = "wasPressed", cancellable = true) private void wasPressed(CallbackInfoReturnable cir) { - if (!cir.getReturnValue()) return; - -// if (this.getTranslationKey().equals("key.attack")) this.handleAttackKeyPressed(cir); -// else if (this.getTranslationKey().equals("key.use")) this.handleUseKeyPressed(cir); + handle(cir); + if (cir.getReturnValue()) handlePress(cir); } @Unique - private void handleAttackKeyPressed(CallbackInfoReturnable cir) { - if (this.sees.dispatch(new AttackKeyPressedEvent())) this.cancel(cir); + private void handle(@NotNull CallbackInfoReturnable cir) { + KeyActionOverride override = sees.dispatchWithResult(new KeyBindingPressedCheckEvent(getId())); + if (override == KeyActionOverride.FORCE_RELEASE) forceRelease(cir); + else if (override == KeyActionOverride.FORCE_PRESS) forcePress(cir); } @Unique - private void handleUseKeyPressed(CallbackInfoReturnable cir) { - if (this.sees.dispatch(new UseKeyPressedEvent())) this.cancel(cir); + private void handlePress(@NotNull CallbackInfoReturnable cir) { + String keyId = getId(); + + if (keyId.equals("key.attack")) { + if (sees.dispatch(new AttackKeyPressedEvent())) forceRelease(cir); + } else if (keyId.equals("key.use")) { + if (sees.dispatch(new UseKeyPressedEvent())) forceRelease(cir); + } + + KeyActionOverride override = sees.dispatchWithResult(new KeyBindingPressedEvent(keyId)); + if (override == KeyActionOverride.FORCE_RELEASE) forceRelease(cir); + else if (override == KeyActionOverride.FORCE_PRESS) forcePress(cir); } @Unique - private void cancel(CallbackInfoReturnable cir) { - this.timesPressed = 0; - this.setPressed(false); + private void forceRelease(CallbackInfoReturnable cir) { + timesPressed = 0; + setPressed(false); cir.setReturnValue(false); } + + @Unique + private void forcePress(CallbackInfoReturnable cir) { + if (timesPressed < 1) timesPressed = 1; + setPressed(true); + cir.setReturnValue(true); + } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java index efaa107..a569f3a 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java @@ -2,6 +2,7 @@ import nl.devpieter.sees.Sees; import nl.devpieter.sees.event.SEvent; +import nl.devpieter.utilize.events.interaction.keybinding.KeyBindingPressedCheckEvent; import nl.devpieter.utilize.events.tick.ITickEvent; import nl.devpieter.utilize.utils.minecraft.ClientUtils; import org.slf4j.Logger; @@ -23,7 +24,7 @@ public class SeesMixin { at = @At("RETURN") ) private void onDispatch(SEvent event, CallbackInfoReturnable cir) { - if (event instanceof ITickEvent) return; + if (event instanceof ITickEvent || event instanceof KeyBindingPressedCheckEvent) return; if (!ClientUtils.isDevEnv()) return; logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); From 5d2ef16efe0dc16653b244e7de2768a4d2cc7474 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 14:37:29 +0100 Subject: [PATCH 36/41] Remove DebugManager, giving too much trouble every release --- .../utilize/managers/DebugManager.java | 38 ------------------- .../accessors/DebugRendererAccessor.java | 17 --------- src/main/resources/utilize.mixins.json | 3 +- 3 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 src/main/java/nl/devpieter/utilize/managers/DebugManager.java delete mode 100644 src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java diff --git a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java b/src/main/java/nl/devpieter/utilize/managers/DebugManager.java deleted file mode 100644 index 0fe87db..0000000 --- a/src/main/java/nl/devpieter/utilize/managers/DebugManager.java +++ /dev/null @@ -1,38 +0,0 @@ -package nl.devpieter.utilize.managers; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.debug.DebugRenderer; -import nl.devpieter.utilize.mixins.accessors.DebugRendererAccessor; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public final class DebugManager { - - private static final DebugManager INSTANCE = new DebugManager(); - - private final MinecraftClient minecraftClient = MinecraftClient.getInstance(); - - private DebugManager() { - } - - public static DebugManager getInstance() { - return INSTANCE; - } - - public void addRenderer(@NotNull DebugRenderer.Renderer renderer) { - List renderers = getAccessor().utilize$getDebugRenderers(); - if (renderers.contains(renderer)) return; - - renderers.add(renderer); - } - - public void removeRenderer(@NotNull DebugRenderer.Renderer renderer) { - List renderers = getAccessor().utilize$getDebugRenderers(); - renderers.remove(renderer); - } - - private DebugRendererAccessor getAccessor() { - return (DebugRendererAccessor) minecraftClient.worldRenderer.debugRenderer; - } -} diff --git a/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java b/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java deleted file mode 100644 index 273b214..0000000 --- a/src/main/java/nl/devpieter/utilize/mixins/accessors/DebugRendererAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.devpieter.utilize.mixins.accessors; - -import net.minecraft.client.render.debug.DebugRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(DebugRenderer.class) -public interface DebugRendererAccessor { - - @Accessor("debugRenderers") - List utilize$getDebugRenderers(); - - @Accessor("lateDebugRenderers") - List utilize$getLateDebugRenderers(); -} diff --git a/src/main/resources/utilize.mixins.json b/src/main/resources/utilize.mixins.json index 9e41a1d..4140fc6 100644 --- a/src/main/resources/utilize.mixins.json +++ b/src/main/resources/utilize.mixins.json @@ -8,8 +8,7 @@ "ClientPlayerEntityMixin", "ClientPlayerInteractionManagerMixin", "KeyBindingMixin", - "MinecraftClientMixin", - "accessors.DebugRendererAccessor" + "MinecraftClientMixin" ], "injectors": { "defaultRequire": 1 From d6f9b17edb10c4eadf2b2f49a3a2efced3bc48a4 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Jan 2026 13:54:50 +0100 Subject: [PATCH 37/41] Update sees to 1.2.1; Update build.gradle --- build.gradle | 46 ++++++++----------- .../utilize/managers/DamageManager.java | 2 +- .../utilize/mixins/ChatHudMixin.java | 2 +- .../mixins/ClientPlayerEntityMixin.java | 2 +- .../ClientPlayerInteractionManagerMixin.java | 2 +- .../utilize/mixins/KeyBindingMixin.java | 2 +- .../utilize/mixins/MinecraftClientMixin.java | 6 ++- .../devpieter/utilize/mixins/SeesMixin.java | 20 ++++---- 8 files changed, 39 insertions(+), 43 deletions(-) diff --git a/build.gradle b/build.gradle index c43c22f..0784e65 100644 --- a/build.gradle +++ b/build.gradle @@ -6,38 +6,32 @@ plugins { def targetJavaVersion = 21 -def isSnapshot = System.getenv('SNAPSHOT_BUILD')?.toBoolean() ?: false +def isSnapshot = providers.environmentVariable("SNAPSHOT_BUILD").map { it.toBoolean() }.orElse(false).get() def buildNumber = System.getenv('BUILD_NUMBER') ?: 'dev' group = maven_group -//archivesBaseName = archives_base_name version = "${mod_version}+${minecraft_version}-${max_minecraft_version}" + (isSnapshot ? "-SNAPSHOT+${buildNumber}" : "") -repositories { - repositories { - maven { - name "Pietr Space Releases" - url "https://maven.pietr.space/releases" - } - } +base { + archivesName = archives_base_name +} - repositories { - maven { - name "Pietr Space Snapshots" - url "https://maven.pietr.space/snapshots" - } +repositories { + maven { + name "Pietr Space Releases" + url "https://maven.pietr.space/releases" } } dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings "net.fabricmc:yarn:${yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" - implementation "nl.devpieter:sees:1.2.0-dd2c322-SNAPSHOT" - include "nl.devpieter:sees:1.2.0-dd2c322-SNAPSHOT" + implementation "nl.devpieter:sees:1.2.1" + include "nl.devpieter:sees:1.2.1" } preprocess { @@ -61,8 +55,7 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - it.options.release.set(targetJavaVersion) + options.encoding = "UTF-8" } java { @@ -73,8 +66,7 @@ java { jar { from("LICENSE") { - //rename { "${it}_${project.archivesBaseName}" } - rename { "${it}_Utilize" } + rename { "${it}_${base.archivesName.get()}" } } } @@ -87,10 +79,10 @@ publishing { } repositories { maven { - url = findProperty('mavenRepositoryUrl') + url = uri(providers.gradleProperty("mavenRepositoryUrl").orNull ?: "http://localhost:8081/releases/nl/devpieter/utilize") credentials { - username = findProperty('mavenRepositoryUsername') - password = findProperty('mavenRepositoryPassword') + username = providers.gradleProperty("mavenRepositoryUsername").orNull + password = providers.gradleProperty("mavenRepositoryPassword").orNull } } } diff --git a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java index 6c5ffd1..aa6bdfc 100644 --- a/src/main/java/nl/devpieter/utilize/managers/DamageManager.java +++ b/src/main/java/nl/devpieter/utilize/managers/DamageManager.java @@ -8,7 +8,7 @@ public final class DamageManager { private static final DamageManager INSTANCE = new DamageManager(); - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); private double currentCurrentHealth = -1; diff --git a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java index 8074108..8c85c2e 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ChatHudMixin.java @@ -33,7 +33,7 @@ public abstract class ChatHudMixin { protected abstract void addMessage(ChatHudLine message); @Unique - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", cancellable = true) public void onAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, CallbackInfo ci) { diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index c1be55e..724a6b8 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java @@ -19,7 +19,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { @Unique - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); @Unique private final DamageManager damageManager = DamageManager.getInstance(); diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java index 096b8b7..0754270 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerInteractionManagerMixin.java @@ -38,7 +38,7 @@ public abstract class ClientPlayerInteractionManagerMixin { private int lastSelectedHotbarSlot = -1; @Unique - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); @Inject(at = @At("HEAD"), method = "updateBlockBreakingProgress", cancellable = true) private void onUpdateBlockBreakingProgress(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { diff --git a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java index f1db70d..b6705e6 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/KeyBindingMixin.java @@ -28,7 +28,7 @@ public abstract class KeyBindingMixin { public abstract String getId(); @Unique - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); @Inject(at = @At("RETURN"), method = "isPressed", cancellable = true) private void isPressed(CallbackInfoReturnable cir) { diff --git a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java index 3ba292c..f9c26cd 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/MinecraftClientMixin.java @@ -28,7 +28,7 @@ public class MinecraftClientMixin { private Screen previousScreen; @Unique - private final Sees sees = Sees.getInstance(); + private final Sees sees = Sees.getSharedInstance(); @Unique private SettingManager settingManager; @@ -66,6 +66,10 @@ private void onTickTail(CallbackInfo ci) { sees.dispatch(new ClientTickTailEvent()); } + /** + * We need to initialize the managers here because Utilize may not be fully initialized + * when MinecraftClient is being constructed, leading to potential null references. + */ @Unique private void tryInitializeManagers() { if (settingManager != null || taskManager != null) return; diff --git a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java index a569f3a..d60e598 100644 --- a/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java +++ b/src/main/java/nl/devpieter/utilize/mixins/SeesMixin.java @@ -19,14 +19,14 @@ public class SeesMixin { @Unique private final Logger logger = LoggerFactory.getLogger("Utilize/SeesMixin"); - @Inject( - method = "dispatch(Lnl/devpieter/sees/event/SEvent;)Z", - at = @At("RETURN") - ) - private void onDispatch(SEvent event, CallbackInfoReturnable cir) { - if (event instanceof ITickEvent || event instanceof KeyBindingPressedCheckEvent) return; - if (!ClientUtils.isDevEnv()) return; - - logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); - } +// @Inject( +// method = "dispatch(Lnl/devpieter/sees/event/SEvent;)Z", +// at = @At("RETURN") +// ) +// private void onDispatch(SEvent event, CallbackInfoReturnable cir) { +// if (event instanceof ITickEvent || event instanceof KeyBindingPressedCheckEvent) return; +// if (!ClientUtils.isDevEnv()) return; +// +// logger.info("Dispatched event: {} (canceled: {})", event.getClass().getSimpleName(), cir.getReturnValue()); +// } } From ac74bc059106b5b733c5c219ec10f2a58d502375 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Jan 2026 13:56:22 +0100 Subject: [PATCH 38/41] Bump mod version to 1.1.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 75a22e1..658e81a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ loader_version=0.18.4 # Mod Properties artifact_id=utilize -mod_version=1.1.0 +mod_version=1.1.1 maven_group=nl.devpieter archives_base_name=Utilize From edf64289f912743a5b78b6c513102e0780b189f4 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Jan 2026 14:12:29 +0100 Subject: [PATCH 39/41] Remove 1.21.6 versions folder --- versions/1.21.6/gradle.properties | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 versions/1.21.6/gradle.properties diff --git a/versions/1.21.6/gradle.properties b/versions/1.21.6/gradle.properties deleted file mode 100644 index ee93499..0000000 --- a/versions/1.21.6/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# check this on https://modmuss50.me/fabric.html -minecraft_version=1.21.6 -max_minecraft_version=1.21.8 - -yarn_mappings=1.21.8+build.1 -fabric_version=0.128.2+1.21.6 \ No newline at end of file From 23432aaa408c4306d7de79472b13870fad9ffd74 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Jan 2026 14:16:39 +0100 Subject: [PATCH 40/41] Refactor code to remove unnecessary 'this' references --- .../nl/devpieter/utilize/setting/base/SettingBase.java | 8 ++++---- .../nl/devpieter/utilize/setting/interfaces/ISetting.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java index d2d8997..c36ddae 100644 --- a/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java +++ b/src/main/java/nl/devpieter/utilize/setting/base/SettingBase.java @@ -25,22 +25,22 @@ public SettingBase(@NotNull String identifier, T defaultValue, boolean allowNull @Override public String getIdentifier() { - return this.identifier; + return identifier; } @Override public boolean shouldAllowNull() { - return this.allowNull; + return allowNull; } @Override public T getValue() { - return this.value; + return value; } @Override public T getDefault() { - return this.defaultValue; + return defaultValue; } @Override diff --git a/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java index f7eeab7..e7d5d11 100644 --- a/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java +++ b/src/main/java/nl/devpieter/utilize/setting/interfaces/ISetting.java @@ -19,7 +19,7 @@ public interface ISetting { void setValue(T value); default void reset() { - this.setValue(this.getDefault()); + setValue(getDefault()); } default boolean isDefaultValueSet() { @@ -33,6 +33,6 @@ default boolean isDefaultValueSet() { } default KeyedSetting asKeyedSetting() { - return new KeyedSetting<>(this.getIdentifier(), this.getValue()); + return new KeyedSetting<>(getIdentifier(), getValue()); } } From 8656d0115d6be98af7800f7ba4da4c936d67be32 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 22 Jan 2026 14:22:21 +0100 Subject: [PATCH 41/41] Remove 1.21.6 versions folder --- versions/1.21.6/gradle.properties | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 versions/1.21.6/gradle.properties diff --git a/versions/1.21.6/gradle.properties b/versions/1.21.6/gradle.properties deleted file mode 100644 index ee93499..0000000 --- a/versions/1.21.6/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# check this on https://modmuss50.me/fabric.html -minecraft_version=1.21.6 -max_minecraft_version=1.21.8 - -yarn_mappings=1.21.8+build.1 -fabric_version=0.128.2+1.21.6 \ No newline at end of file