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/Utilize.java b/src/main/java/nl/devpieter/utilize/Utilize.java index aee3ef0..05344f8 100644 --- a/src/main/java/nl/devpieter/utilize/Utilize.java +++ b/src/main/java/nl/devpieter/utilize/Utilize.java @@ -1,16 +1,20 @@ 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.utils.ClientUtils; +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; @@ -19,42 +23,57 @@ 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 static boolean BLOCK_SWING_HAND_ONCE = false; - private static final List BLOCK_SCREEN_IDS = new ArrayList<>(); + private final Logger logger = LoggerFactory.getLogger("Utilize"); + private final ModContainer modContainer = FabricLoader.getInstance().getModContainer("utilize").orElseThrow(); + + private final List blockScreenIds = 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(); + SettingManager.shutdown(); + AsyncRequest.shutdown(); + }); + + this.logger.info("Utilize initialized successfully! Version: {}", this.getUtilizeVersion()); } - public static boolean shouldBlockSwingHandOnce() { - return BLOCK_SWING_HAND_ONCE; + public static Utilize getInstance() { + if (INSTANCE == null) throw new IllegalStateException("Utilize has not been initialized yet!"); + return INSTANCE; } - 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 static boolean shouldBlockScreenId(int screenId) { - return BLOCK_SCREEN_IDS.contains(screenId); + public String getUserAgent() { + return String.format("Utilize/%s (%s;)", this.getUtilizeVersion(), this.getMinecraftVersion()); } - public static void blockScreenId(int screenId) { - if (BLOCK_SCREEN_IDS.contains(screenId)) return; - BLOCK_SCREEN_IDS.add(screenId); + 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(); @@ -68,15 +87,7 @@ 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(); + public void blockedScreenId(int screenId) { + this.blockScreenIds.removeIf(id -> id == screenId); } } 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 deleted file mode 100644 index 78a19d0..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/AttackEntityEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -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; - -/** - * Event fired when an entity is attacked by the player. - *

- * This event is cancelable. - */ -public class AttackEntityEvent extends CancelableEventBase { - - /** - * 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 deleted file mode 100644 index 130c73d..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractEntityEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -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; - -public class InteractEntityEvent extends CancelableEventBase { - - 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; - } - - public Hand hand() { - return hand; - } -} 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 8e9c571..0000000 --- a/src/main/java/nl/devpieter/utilize/events/interaction/InteractItemEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -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; - -public class InteractItemEvent extends CancelableEventBase { - - 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/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/entity/InteractEntityEvent.java b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityEvent.java new file mode 100644 index 0000000..dbe3b83 --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/events/interaction/entity/InteractEntityEvent.java @@ -0,0 +1,28 @@ +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.hand = hand; + this.target = target; + } + + public Entity target() { + return this.target; + } + + public Hand 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/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/http/AsyncRequest.java b/src/main/java/nl/devpieter/utilize/http/AsyncRequest.java index 580e501..6ea8538 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 { @@ -16,37 +13,34 @@ 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); } - /** - * Shuts down the executor service used for asynchronous requests. - */ public static void shutdown() { EXECUTOR_SERVICE.shutdown(); - } - protected abstract @Nullable T requestAsync() throws Exception; + try { + if (EXECUTOR_SERVICE.awaitTermination(5, TimeUnit.SECONDS)) return; + EXECUTOR_SERVICE.shutdownNow(); + } catch (InterruptedException e) { + EXECUTOR_SERVICE.shutdownNow(); + Thread.currentThread().interrupt(); + } + } - /** - * 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 +56,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/listeners/packet/EntityTrackerUpdatePacketListener.java b/src/main/java/nl/devpieter/utilize/listeners/packet/EntityTrackerUpdatePacketListener.java index 2d5dfc3..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; @@ -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..4d8d77b 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/OpenScreenPacketListener.java @@ -19,9 +19,9 @@ 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()); + 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 99c49ef..af6ec22 100644 --- a/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java +++ b/src/main/java/nl/devpieter/utilize/listeners/packet/SetTradeOffersPacketListener.java @@ -19,9 +19,9 @@ 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()); + Utilize.getInstance().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/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/managers/TotemManager.java b/src/main/java/nl/devpieter/utilize/managers/TotemManager.java index 76d035e..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 { @@ -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/ClientConnectionMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientConnectionMixin.java index e17899b..edde4dd 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; @@ -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(); } } diff --git a/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java b/src/main/java/nl/devpieter/utilize/mixins/ClientPlayerEntityMixin.java index b01970d..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; @@ -43,22 +43,27 @@ 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) - 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 8d1b4a2..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,15 @@ 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.*; +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.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; @@ -38,64 +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.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; + @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; this.cancelBlockBreaking(); cir.setReturnValue(false); - cir.cancel(); } - @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; + @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 = "breakBlock", cancellable = true) + private void onBreakBlock(BlockPos pos, CallbackInfoReturnable cir) { + 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 = "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(); + } + + @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) { - 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(); + } + + @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.call(new InteractEntityEvent(target, hand))) return; + 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) 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 +168,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/setting/SettingManager.java b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java index df8f60b..bb9c874 100644 --- a/src/main/java/nl/devpieter/utilize/setting/SettingManager.java +++ b/src/main/java/nl/devpieter/utilize/setting/SettingManager.java @@ -3,9 +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; @@ -19,6 +21,7 @@ public class SettingManager { private static SettingManager INSTANCE; private final Gson gson = new Gson(); + private final Logger logger = LoggerFactory.getLogger("Utilize - SettingManager"); private final Duration saveInterval = Duration.ofSeconds(15); private final HashMap>> saveQueue = new HashMap<>(); @@ -34,6 +37,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; @@ -45,13 +55,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; @@ -60,7 +70,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 +82,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; @@ -87,31 +97,30 @@ 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(); } - 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,18 +129,18 @@ 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()); 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; } - private boolean saveBatchToFile(File file, List> settings) { + private boolean saveBatchToFile(@NotNull File file, @NotNull List> settings) { List> currentSettings = this.readBatchFromFile(file); if (currentSettings == null) currentSettings = new ArrayList<>(); @@ -150,17 +159,17 @@ private boolean saveBatchToFile(File file, List> settings) { this.gson.toJson(currentSettings, writer); return true; } catch (IOException e) { - Utilize.LOGGER.error("Failed to save settings batch to file: {}", file.getAbsolutePath(), e); + this.logger.error("Failed to save settings batch to file: {}", file.getAbsolutePath(), e); return false; } } - 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()); } 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/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/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; + } +} diff --git a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java deleted file mode 100644 index 64ec74c..0000000 --- a/src/main/java/nl/devpieter/utilize/utils/WorldUtils.java +++ /dev/null @@ -1,83 +0,0 @@ -package nl.devpieter.utilize.utils; - -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.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class WorldUtils { - - public static @Nullable BlockState getStateAt(Vec3d vec3d) { - return getStateAt(MathUtils.from(vec3d)); - } - - public static @Nullable BlockState getStateAt(Vec3i vec3i) { - return getStateAt(new BlockPos(vec3i)); - } - - public static @Nullable BlockState getStateAt(BlockPos pos) { - if (!ClientUtils.hasWorld()) return null; - return ClientUtils.getWorld().getBlockState(pos); - } - - public static @Nullable Block getBlockAt(Vec3d vec3d) { - return getBlockAt(MathUtils.from(vec3d)); - } - - public static @Nullable Block getBlockAt(Vec3i vec3i) { - return getBlockAt(new BlockPos(vec3i)); - } - - public static @Nullable Block getBlockAt(BlockPos pos) { - BlockState state = getStateAt(pos); - if (state == null) return null; - - return state.getBlock(); - } - - public static @Nullable Entity getEntity(int id) { - if (!ClientUtils.hasWorld()) return null; - return ClientUtils.getWorld().getEntityById(id); - } - - 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(); - } - - public static boolean arePlayersNearby(float distance) { - return !getNearbyPlayers(distance).isEmpty(); - } - - 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); - } - - 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; + } + } +} 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 78% rename from src/main/java/nl/devpieter/utilize/utils/ClientUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/ClientUtils.java index c7660bd..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; @@ -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/EnchantmentUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java similarity index 79% rename from src/main/java/nl/devpieter/utilize/utils/EnchantmentUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/EnchantmentUtils.java index b506751..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; @@ -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/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 83% rename from src/main/java/nl/devpieter/utilize/utils/InventoryUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/InventoryUtils.java index ba2cde7..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; @@ -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/minecraft/NetworkUtils.java similarity index 67% rename from src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java index 5314008..9df6a62 100644 --- a/src/main/java/nl/devpieter/utilize/utils/NetworkUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/NetworkUtils.java @@ -1,22 +1,23 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; 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/minecraft/PlayerUtils.java similarity index 72% rename from src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java rename to src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java index 73f1d97..02efbcf 100644 --- a/src/main/java/nl/devpieter/utilize/utils/PlayerUtils.java +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/PlayerUtils.java @@ -1,19 +1,29 @@ -package nl.devpieter.utilize.utils; +package nl.devpieter.utilize.utils.minecraft; import net.minecraft.block.Block; import net.minecraft.block.BlockState; 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); } + 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/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/minecraft/WorldUtils.java b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java new file mode 100644 index 0000000..373befb --- /dev/null +++ b/src/main/java/nl/devpieter/utilize/utils/minecraft/WorldUtils.java @@ -0,0 +1,47 @@ +package nl.devpieter.utilize.utils.minecraft; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +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; + +public class WorldUtils { + + public static @Nullable BlockState getStateAt(@NotNull Vec3d vec3d) { + return getStateAt(MathUtils.from(vec3d)); + } + + public static @Nullable BlockState getStateAt(@NotNull Vec3i vec3i) { + return getStateAt(new BlockPos(vec3i)); + } + + public static @Nullable BlockState getStateAt(@NotNull BlockPos pos) { + if (!ClientUtils.hasWorld()) return null; + return ClientUtils.getWorld().getBlockState(pos); + } + + public static @Nullable Block getBlockAt(@NotNull Vec3d vec3d) { + return getBlockAt(MathUtils.from(vec3d)); + } + + public static @Nullable Block getBlockAt(@NotNull Vec3i vec3i) { + return getBlockAt(new BlockPos(vec3i)); + } + + public static @Nullable Block getBlockAt(@NotNull BlockPos pos) { + BlockState state = getStateAt(pos); + if (state == null) return null; + + return state.getBlock(); + } + + public static @Nullable Entity getEntity(int id) { + if (!ClientUtils.hasWorld()) return null; + return ClientUtils.getWorld().getEntityById(id); + } +} 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": {