From 441a5d5be03fef9a51ea31357a3ec78bf07be068 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 21 Jan 2026 13:10:15 +0100 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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());