From 37f5b66a9322725c56800de79d3e987b433b324a Mon Sep 17 00:00:00 2001 From: HAV0X underscore <73144620+HAV0X1014@users.noreply.github.com> Date: Fri, 10 May 2024 13:11:36 -0400 Subject: [PATCH] re upload --- .github/workflows/build.yml | 42 ++ .github/workflows/todo-issue.yml | 33 + .gitignore | 40 + LICENSE | 121 ++++ README.md | 4 + build.gradle | 135 ++++ gradle.properties | 26 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 244 +++++++ gradlew.bat | 92 +++ libraries/lwjgl-nanovg.jar | Bin 0 -> 386304 bytes settings.gradle | 10 + .../paragon/mixin/duck/IClientConnection.java | 11 + .../duck/IClientPlayerInteractionManager.java | 12 + .../com/paragon/mixin/duck/IGameRenderer.java | 13 + .../com/paragon/mixin/duck/ILivingEntity.java | 12 + .../paragon/mixin/duck/IMinecraftClient.java | 16 + .../java/com/paragon/mixin/duck/IMouse.java | 11 + .../duck/IPlayerInteractEntityC2SPacket.java | 14 + .../mixin/duck/IRenderTickCounter.java | 12 + .../java/com/paragon/mixin/duck/IVec3d.java | 16 + .../mixin/mixins/MinecraftClientMixin.java | 94 +++ .../MixinSplashTextResourceSupplier.java | 16 + .../entity/MixinClientPlayerEntity.java | 165 +++++ .../mixins/entity/MixinLivingEntity.java | 70 ++ .../MixinClientPlayerInteractionManager.java | 67 ++ .../mixins/input/MixinItemUsageContext.java | 21 + .../mixin/mixins/input/io/KeyboardMixin.java | 24 + .../mixin/mixins/input/io/MouseMixin.java | 32 + .../mixin/mixins/item/TridentItemMixin.java | 26 + .../paragon/mixin/mixins/math/MixinVec3d.java | 53 ++ .../mixins/net/MixinClientConnection.java | 50 ++ .../net/packet/c2s/IPlayerMoveC2SPacket.java | 19 + .../MixinPlayerInteractEntityC2SPacket.java | 29 + .../s2c/IEntityVelocityUpdateS2CPacket.java | 28 + .../net/packet/s2c/IExplosionS2CPacket.java | 29 + .../mixins/render/GameRendererMixin.java | 81 +++ .../mixin/mixins/render/MixinCamera.java | 26 + .../render/MixinLightmapTextureManager.java | 24 + .../mixins/render/MixinRenderTickCounter.java | 30 + .../mixin/mixins/render/WindowMixin.java | 31 + .../entity/MixinLivingEntityRenderer.java | 74 ++ .../entity/MixinPlayerEntityRenderer.java | 29 + .../mixins/render/gui/MixinInGameHud.java | 53 ++ .../mixins/render/gui/TitleScreenMixin.java | 67 ++ .../world/block/MixinAbstractBlockState.java | 26 + .../mixin/mixins/world/block/MixinBlock.java | 30 + src/main/kotlin/com/paragon/Paragon.kt | 98 +++ .../kotlin/com/paragon/backend/Feature.kt | 13 + .../com/paragon/backend/ToggleFeature.kt | 25 + .../kotlin/com/paragon/backend/alt/Alt.kt | 32 + .../kotlin/com/paragon/backend/bind/Bind.kt | 306 ++++++++ .../com/paragon/backend/bind/BindInhibitor.kt | 11 + .../com/paragon/backend/bind/DeviceType.kt | 11 + .../com/paragon/backend/command/Command.kt | 18 + .../command/argument/EnumArgumentType.kt | 41 ++ .../command/argument/ModuleArgumentType.kt | 36 + .../com/paragon/backend/config/Config.kt | 29 + .../com/paragon/backend/event/EventEra.kt | 10 + .../paragon/backend/event/EventProcessor.kt | 31 + .../event/events/entity/EntityTickEvent.kt | 17 + .../event/events/entity/EntityTraceEvent.kt | 14 + .../event/events/entity/RaycastEvent.kt | 13 + .../events/input/control/AttackBlockEvent.kt | 15 + .../events/input/control/ItemSlowdownEvent.kt | 11 + .../input/control/SneakSlowdownEvent.kt | 11 + .../backend/event/events/input/io/KeyEvent.kt | 14 + .../event/events/input/io/MouseEvent.kt | 14 + .../backend/event/events/mc/ShutdownEvent.kt | 15 + .../backend/event/events/mc/TickEvent.kt | 13 + .../backend/event/events/mc/TitleEvent.kt | 681 ++++++++++++++++++ .../backend/event/events/move/MoveEvent.kt | 41 ++ .../event/events/move/MoveUpdateEvent.kt | 22 + .../event/events/move/TridentVelocityEvent.kt | 15 + .../backend/event/events/net/PacketEvent.kt | 19 + .../events/paragon/SettingUpdateEvent.kt | 14 + .../render/BlockAmbientLightLevelEvent.kt | 14 + .../event/events/render/ClipToSpaceEvent.kt | 13 + .../events/render/DrawSideOfBlockEvent.kt | 16 + .../event/events/render/FPSLimitEvent.kt | 17 + .../event/events/render/GameRenderEvent.kt | 15 + .../event/events/render/GammaModifyEvent.kt | 10 + .../event/events/render/PreGameRenderEvent.kt | 15 + .../event/events/render/RenderHUDEvent.kt | 15 + .../events/render/RenderNameplateEvent.kt | 16 + .../event/events/render/SetScreenEvent.kt | 16 + .../framebuffer/MultiSampledFramebuffer.kt | 152 ++++ .../paragon/backend/managers/AltManager.kt | 164 +++++ .../backend/managers/BaritoneManager.kt | 71 ++ .../backend/managers/CommandManager.kt | 102 +++ .../paragon/backend/managers/ConfigManager.kt | 46 ++ .../backend/managers/InventoryManager.kt | 89 +++ .../backend/managers/KeyboardManager.kt | 143 ++++ .../paragon/backend/managers/ModuleManager.kt | 171 +++++ .../backend/managers/RotationManager.kt | 120 +++ .../paragon/backend/managers/ToastManager.kt | 74 ++ .../managers/placement/PlacementData.kt | 30 + .../managers/placement/PlacementManager.kt | 69 ++ .../backend/managers/placement/Swing.kt | 28 + .../com/paragon/backend/module/Category.kt | 32 + .../com/paragon/backend/module/Module.kt | 50 ++ .../com/paragon/backend/setting/Colour.kt | 19 + .../backend/setting/RegistrySetting.kt | 75 ++ .../com/paragon/backend/setting/Setting.kt | 144 ++++ .../backend/setting/SettingContainer.kt | 121 ++++ .../paragon/client/command/Configuration.kt | 90 +++ .../com/paragon/client/command/Drawn.kt | 25 + .../com/paragon/client/command/Prefix.kt | 28 + .../com/paragon/client/command/Toggle.kt | 26 + .../com/paragon/client/modules/combat/Aura.kt | 128 ++++ .../client/modules/combat/AutoTotem.kt | 162 +++++ .../paragon/client/modules/combat/Burrow.kt | 185 +++++ .../client/modules/combat/Criticals.kt | 96 +++ .../paragon/client/modules/combat/Velocity.kt | 50 ++ .../client/modules/exploit/Disabler.kt | 36 + .../client/modules/exploit/FastProjectile.kt | 32 + .../client/modules/exploit/PingSpoof.kt | 63 ++ .../client/modules/exploit/ThunderLocator.kt | 33 + .../client/modules/movement/AntiVoid.kt | 38 + .../client/modules/movement/AutoJump.kt | 31 + .../client/modules/movement/ElytraFlight.kt | 297 ++++++++ .../paragon/client/modules/movement/Flight.kt | 70 ++ .../client/modules/movement/InventoryMove.kt | 62 ++ .../client/modules/movement/LongJump.kt | 80 ++ .../paragon/client/modules/movement/NoFall.kt | 43 ++ .../client/modules/movement/NoSlowDown.kt | 49 ++ .../paragon/client/modules/movement/Speed.kt | 154 ++++ .../paragon/client/modules/movement/Sprint.kt | 49 ++ .../paragon/client/modules/movement/Step.kt | 44 ++ .../client/modules/movement/TridentBoost.kt | 23 + .../paragon/client/modules/player/AirPlace.kt | 87 +++ .../client/modules/player/AutoElytra.kt | 53 ++ .../client/modules/player/AutoRespawn.kt | 23 + .../paragon/client/modules/player/AutoTool.kt | 65 ++ .../paragon/client/modules/player/BlockFly.kt | 150 ++++ .../client/modules/player/FakePlayer.kt | 102 +++ .../client/modules/player/FastPlace.kt | 51 ++ .../client/modules/player/GameSpeed.kt | 38 + .../client/modules/player/InventoryManager.kt | 4 + .../client/modules/player/LiquidPlace.kt | 19 + .../paragon/client/modules/player/NoTrace.kt | 32 + .../client/modules/player/PacketMine.kt | 232 ++++++ .../client/modules/player/Replenish.kt | 104 +++ .../client/modules/player/RotationLock.kt | 39 + .../paragon/client/modules/player/Stealer.kt | 45 ++ .../paragon/client/modules/visual/ChinaHat.kt | 35 + .../paragon/client/modules/visual/ClickGUI.kt | 48 ++ .../com/paragon/client/modules/visual/ESP.kt | 62 ++ .../client/modules/visual/FullBright.kt | 59 ++ .../com/paragon/client/modules/visual/HUD.kt | 108 +++ .../paragon/client/modules/visual/HoleESP.kt | 128 ++++ .../com/paragon/client/modules/visual/Tags.kt | 193 +++++ .../paragon/client/modules/visual/Toasts.kt | 20 + .../paragon/client/modules/visual/Tracers.kt | 59 ++ .../client/modules/visual/Trajectories.kt | 161 +++++ .../client/modules/visual/UnfocusedCPU.kt | 33 + .../paragon/client/modules/visual/ViewClip.kt | 22 + .../com/paragon/client/modules/visual/Xray.kt | 77 ++ .../kotlin/com/paragon/client/toasts/Toast.kt | 57 ++ .../com/paragon/client/toasts/ToastType.kt | 12 + .../aesthetical/AestheticalUI.kt | 77 ++ .../elements/ModuleCategoryPanel.kt | 68 ++ .../aesthetical/elements/ModuleElement.kt | 133 ++++ .../aesthetical/elements/SettingElement.kt | 11 + .../elements/setting/BindSettingElement.kt | 71 ++ .../elements/setting/BooleanSettingElement.kt | 43 ++ .../elements/setting/EnumSettingElement.kt | 47 ++ .../elements/setting/NumberSettingElement.kt | 80 ++ .../client/ui/configuration/surge/SurgeUI.kt | 93 +++ .../surge/module/ModuleElement.kt | 115 +++ .../ui/configuration/surge/panel/Panel.kt | 108 +++ .../surge/setting/BindSettingElement.kt | 66 ++ .../surge/setting/BooleanSettingElement.kt | 31 + .../surge/setting/EnumSettingElement.kt | 39 + .../surge/setting/NumberSettingElement.kt | 74 ++ .../surge/setting/SettingElement.kt | 23 + .../surge/setting/registry/RegistryElement.kt | 37 + .../surge/setting/registry/RegistryScreen.kt | 118 +++ .../registry/RegistrySettingElement.kt | 33 + .../paragon/client/ui/title/MainMenuHook.kt | 208 ++++++ .../client/ui/widgets/ButtonElement.kt | 35 + .../client/ui/widgets/ElementContainer.kt | 61 ++ .../client/ui/widgets/TextFieldElement.kt | 58 ++ src/main/kotlin/com/paragon/util/Misc.kt | 222 ++++++ .../paragon/util/calculations/MathsUtil.kt | 23 + .../com/paragon/util/calculations/MoveUtil.kt | 123 ++++ .../com/paragon/util/calculations/Timer.kt | 34 + .../calculations/rotation/RotationUtil.kt | 91 +++ .../util/calculations/rotation/Target.kt | 12 + .../paragon/util/inventory/InventoryUtil.kt | 78 ++ .../kotlin/com/paragon/util/io/FileUtil.kt | 66 ++ .../com/paragon/util/player/PlayerUtil.kt | 16 + .../com/paragon/util/rendering/ColorUtil.kt | 27 + .../com/paragon/util/rendering/NVGWrapper.kt | 204 ++++++ .../com/paragon/util/rendering/Renderer.kt | 251 +++++++ .../com/paragon/util/rendering/ui/Element.kt | 50 ++ .../assets/paragon/font/axiforma.ttf | Bin 0 -> 128116 bytes .../resources/assets/paragon/font/inter.ttf | Bin 0 -> 309828 bytes .../assets/paragon/textures/icon.png | Bin 0 -> 4315 bytes src/main/resources/fabric.mod.json | 37 + src/main/resources/paragon.accesswidener | 6 + src/main/resources/paragon.mixins.json | 36 + 203 files changed, 12418 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/todo-issue.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libraries/lwjgl-nanovg.jar create mode 100644 settings.gradle create mode 100644 src/main/java/com/paragon/mixin/duck/IClientConnection.java create mode 100644 src/main/java/com/paragon/mixin/duck/IClientPlayerInteractionManager.java create mode 100644 src/main/java/com/paragon/mixin/duck/IGameRenderer.java create mode 100644 src/main/java/com/paragon/mixin/duck/ILivingEntity.java create mode 100644 src/main/java/com/paragon/mixin/duck/IMinecraftClient.java create mode 100644 src/main/java/com/paragon/mixin/duck/IMouse.java create mode 100644 src/main/java/com/paragon/mixin/duck/IPlayerInteractEntityC2SPacket.java create mode 100644 src/main/java/com/paragon/mixin/duck/IRenderTickCounter.java create mode 100644 src/main/java/com/paragon/mixin/duck/IVec3d.java create mode 100644 src/main/java/com/paragon/mixin/mixins/MinecraftClientMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/MixinSplashTextResourceSupplier.java create mode 100644 src/main/java/com/paragon/mixin/mixins/entity/MixinClientPlayerEntity.java create mode 100644 src/main/java/com/paragon/mixin/mixins/entity/MixinLivingEntity.java create mode 100644 src/main/java/com/paragon/mixin/mixins/input/MixinClientPlayerInteractionManager.java create mode 100644 src/main/java/com/paragon/mixin/mixins/input/MixinItemUsageContext.java create mode 100644 src/main/java/com/paragon/mixin/mixins/input/io/KeyboardMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/input/io/MouseMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/item/TridentItemMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/math/MixinVec3d.java create mode 100644 src/main/java/com/paragon/mixin/mixins/net/MixinClientConnection.java create mode 100644 src/main/java/com/paragon/mixin/mixins/net/packet/c2s/IPlayerMoveC2SPacket.java create mode 100644 src/main/java/com/paragon/mixin/mixins/net/packet/c2s/MixinPlayerInteractEntityC2SPacket.java create mode 100644 src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IEntityVelocityUpdateS2CPacket.java create mode 100644 src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IExplosionS2CPacket.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/GameRendererMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/MixinCamera.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/MixinLightmapTextureManager.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/MixinRenderTickCounter.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/WindowMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/entity/MixinLivingEntityRenderer.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/entity/MixinPlayerEntityRenderer.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/gui/MixinInGameHud.java create mode 100644 src/main/java/com/paragon/mixin/mixins/render/gui/TitleScreenMixin.java create mode 100644 src/main/java/com/paragon/mixin/mixins/world/block/MixinAbstractBlockState.java create mode 100644 src/main/java/com/paragon/mixin/mixins/world/block/MixinBlock.java create mode 100644 src/main/kotlin/com/paragon/Paragon.kt create mode 100644 src/main/kotlin/com/paragon/backend/Feature.kt create mode 100644 src/main/kotlin/com/paragon/backend/ToggleFeature.kt create mode 100644 src/main/kotlin/com/paragon/backend/alt/Alt.kt create mode 100644 src/main/kotlin/com/paragon/backend/bind/Bind.kt create mode 100644 src/main/kotlin/com/paragon/backend/bind/BindInhibitor.kt create mode 100644 src/main/kotlin/com/paragon/backend/bind/DeviceType.kt create mode 100644 src/main/kotlin/com/paragon/backend/command/Command.kt create mode 100644 src/main/kotlin/com/paragon/backend/command/argument/EnumArgumentType.kt create mode 100644 src/main/kotlin/com/paragon/backend/command/argument/ModuleArgumentType.kt create mode 100644 src/main/kotlin/com/paragon/backend/config/Config.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/EventEra.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/EventProcessor.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/entity/EntityTickEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/entity/EntityTraceEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/entity/RaycastEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/input/control/AttackBlockEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/input/control/ItemSlowdownEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/input/control/SneakSlowdownEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/input/io/KeyEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/input/io/MouseEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/mc/ShutdownEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/mc/TickEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/mc/TitleEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/move/MoveEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/move/MoveUpdateEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/move/TridentVelocityEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/net/PacketEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/paragon/SettingUpdateEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/BlockAmbientLightLevelEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/ClipToSpaceEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/DrawSideOfBlockEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/FPSLimitEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/GameRenderEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/GammaModifyEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/PreGameRenderEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/RenderHUDEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/RenderNameplateEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/event/events/render/SetScreenEvent.kt create mode 100644 src/main/kotlin/com/paragon/backend/framebuffer/MultiSampledFramebuffer.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/AltManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/BaritoneManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/CommandManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/ConfigManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/InventoryManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/KeyboardManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/ModuleManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/RotationManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/ToastManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/placement/PlacementData.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/placement/PlacementManager.kt create mode 100644 src/main/kotlin/com/paragon/backend/managers/placement/Swing.kt create mode 100644 src/main/kotlin/com/paragon/backend/module/Category.kt create mode 100644 src/main/kotlin/com/paragon/backend/module/Module.kt create mode 100644 src/main/kotlin/com/paragon/backend/setting/Colour.kt create mode 100644 src/main/kotlin/com/paragon/backend/setting/RegistrySetting.kt create mode 100644 src/main/kotlin/com/paragon/backend/setting/Setting.kt create mode 100644 src/main/kotlin/com/paragon/backend/setting/SettingContainer.kt create mode 100644 src/main/kotlin/com/paragon/client/command/Configuration.kt create mode 100644 src/main/kotlin/com/paragon/client/command/Drawn.kt create mode 100644 src/main/kotlin/com/paragon/client/command/Prefix.kt create mode 100644 src/main/kotlin/com/paragon/client/command/Toggle.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/combat/Aura.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/combat/AutoTotem.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/combat/Burrow.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/combat/Criticals.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/combat/Velocity.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/exploit/Disabler.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/exploit/FastProjectile.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/exploit/PingSpoof.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/exploit/ThunderLocator.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/AntiVoid.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/AutoJump.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/ElytraFlight.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/Flight.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/InventoryMove.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/LongJump.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/NoFall.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/NoSlowDown.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/Speed.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/Sprint.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/Step.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/movement/TridentBoost.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/AirPlace.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/AutoElytra.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/AutoRespawn.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/AutoTool.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/BlockFly.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/FakePlayer.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/FastPlace.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/GameSpeed.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/InventoryManager.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/LiquidPlace.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/NoTrace.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/PacketMine.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/Replenish.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/RotationLock.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/player/Stealer.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/ChinaHat.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/ClickGUI.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/ESP.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/FullBright.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/HUD.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/HoleESP.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/Tags.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/Toasts.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/Tracers.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/Trajectories.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/UnfocusedCPU.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/ViewClip.kt create mode 100644 src/main/kotlin/com/paragon/client/modules/visual/Xray.kt create mode 100644 src/main/kotlin/com/paragon/client/toasts/Toast.kt create mode 100644 src/main/kotlin/com/paragon/client/toasts/ToastType.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/AestheticalUI.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleCategoryPanel.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/SettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BindSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BooleanSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/EnumSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/NumberSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/SurgeUI.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/module/ModuleElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/panel/Panel.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BindSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BooleanSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/EnumSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/NumberSettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/SettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryScreen.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistrySettingElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/title/MainMenuHook.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/widgets/ButtonElement.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/widgets/ElementContainer.kt create mode 100644 src/main/kotlin/com/paragon/client/ui/widgets/TextFieldElement.kt create mode 100644 src/main/kotlin/com/paragon/util/Misc.kt create mode 100644 src/main/kotlin/com/paragon/util/calculations/MathsUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/calculations/MoveUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/calculations/Timer.kt create mode 100644 src/main/kotlin/com/paragon/util/calculations/rotation/RotationUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/calculations/rotation/Target.kt create mode 100644 src/main/kotlin/com/paragon/util/inventory/InventoryUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/io/FileUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/player/PlayerUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/rendering/ColorUtil.kt create mode 100644 src/main/kotlin/com/paragon/util/rendering/NVGWrapper.kt create mode 100644 src/main/kotlin/com/paragon/util/rendering/Renderer.kt create mode 100644 src/main/kotlin/com/paragon/util/rendering/ui/Element.kt create mode 100644 src/main/resources/assets/paragon/font/axiforma.ttf create mode 100644 src/main/resources/assets/paragon/font/inter.ttf create mode 100644 src/main/resources/assets/paragon/textures/icon.png create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/paragon.accesswidener create mode 100644 src/main/resources/paragon.mixins.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a03fe74 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,42 @@ +# Automatically build the project and run any configured tests for every push +# and submitted pull request. This can help catch issues that only occur on +# certain platforms or Java versions, and provides a first line of defence +# against bad commits. + +name: build +on: [pull_request, push] + +jobs: + build: + strategy: + matrix: + # Use these Java versions + java: [ + 17, # Current Java LTS & minimum supported by Minecraft + ] + # and run on both Linux and Windows + os: [ubuntu-22.04, windows-2022] + runs-on: ${{ matrix.os }} + steps: + - name: checkout repository + uses: actions/checkout@v3 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: setup jdk ${{ matrix.java }} + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: 'microsoft' + - name: make gradle wrapper executable + if: ${{ runner.os != 'Windows' }} + run: chmod +x ./gradlew + - name: generate build config + run: ./gradlew generateBuildConfig + - name: build + run: ./gradlew build + - name: capture build artifacts + if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS + uses: actions/upload-artifact@v3 + with: + name: Artifacts + path: build/libs/ diff --git a/.github/workflows/todo-issue.yml b/.github/workflows/todo-issue.yml new file mode 100644 index 0000000..8dfeafd --- /dev/null +++ b/.github/workflows/todo-issue.yml @@ -0,0 +1,33 @@ +name: Create issues from TODOs + +on: + workflow_dispatch: + inputs: + importAll: + default: 'false' + required: false + type: boolean + description: Enable, if you want to import all TODOs. Runs on checked out branch! Only use if you're sure what you are doing. + push: + branches: # do not set multiple branches, todos might be added and then get referenced by themselves in case of a merge + - main + - master + +permissions: + issues: write + repository-projects: read + contents: read + +jobs: + todos: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Run Issue Bot + uses: derjuulsn/todo-issue@main + with: + excludePattern: '^(node_modules/)' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c476faf --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ + +# java + +hs_err_*.log +replay_*.log +*.hprof +*.jfr diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md new file mode 100644 index 0000000..812647a --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# paragon updated +paragon for the latest version of minecraft + +uses fabric, needs fabric api \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..249bf30 --- /dev/null +++ b/build.gradle @@ -0,0 +1,135 @@ +/** + * To anyone reading this, if you wonder why the class "BuildConfig" is not found, sync + * your gradle and open the gradle tab, other -> generateBuildConfig + * + * from yours truly, aesthetical + */ + +plugins { + id 'fabric-loom' version '1.1-SNAPSHOT' + id 'de.fuerstenau.buildconfig' version '1.1.4' + id 'org.jetbrains.kotlin.jvm' version '1.8.10' +} + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +archivesBaseName = project.archives_base_name +version = project.mod_version +group = project.maven_group + +configurations { + library + noRuntimeLibrary + + // https://github.com/mfuerstenau/gradle-buildconfig-plugin/issues/30#issuecomment-910241307 + create("compile") +} + +buildConfig { + buildConfigField "String", "HASH", "${execute("git rev-parse --short HEAD")}" + buildConfigField "String", "BRANCH", "${execute("git branch").replace("* ", "")}" + buildConfigField "String", "VERSION", "${project.version}" + + packageName "com.paragon.util.BuildConfig" +} + +sourceSets.main.java.srcDirs += "build/gen/buildconfig/src/main" + +loom { + accessWidenerPath = file("src/main/resources/paragon.accesswidener") +} + +repositories { + mavenCentral() + maven { url "https://jitpack.io" } + maven { + name = "meteor-maven-snapshots" + url = "https://maven.meteordev.org/snapshots" + } +} + +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + modImplementation "net.fabricmc:fabric-language-kotlin:${project.kotlin_language_fabric}" + + // i love meteor + modImplementation "baritone:fabric:${project.baritone}" + noRuntimeLibrary "baritone:fabric:${project.baritone}" + + library platform("org.lwjgl:lwjgl-bom:3.3.1") + library "org.lwjgl:lwjgl-nanovg" + + // lets just include ALL the natives! who cares about file sizes, right? + library "org.lwjgl:lwjgl-nanovg::natives-windows" + library "org.lwjgl:lwjgl-nanovg::natives-macos" + library "org.lwjgl:lwjgl-nanovg::natives-linux" + library "org.lwjgl:lwjgl-nanovg::natives-macos-arm64" + library "org.lwjgl:lwjgl-nanovg::natives-linux-arm64" + library "org.lwjgl:lwjgl-nanovg::natives-linux-arm32" + + library "com.github.therealbush:eventbus:${project.eventbus}" + library "com.github.wolfsurge:javaanimationsystem:${project.animation_system}" + library "com.github.Litarvan:OpenAuth:${project.open_auth}" + library "org.json:json:${project.json}" + + // kotlin shit + library "org.jetbrains.kotlin:${project.kotlin}" + library "org.jetbrains.kotlinx:kotlinx-coroutines-core:${project.kotlin_coroutines}" + + implementation configurations.library +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } + + // https://github.com/mfuerstenau/gradle-buildconfig-plugin/issues/30#issuecomment-910241307 + duplicatesStrategy = DuplicatesStrategy.WARN + + from(configurations.library.collect { if (it.isDirectory()) it else zipTree(it) }) +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +compileKotlin { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } +} + +compileTestKotlin { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } +} + +// functions + +def execute(String cmd) { + try { + def stdout = new ByteArrayOutputStream() + + exec { + commandLine cmd.split(" ") + standardOutput = stdout + } + + return stdout.toString().trim() + } catch (ignored) { + return null + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..380d350 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,26 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties + # check these on https://fabricmc.net/develop + minecraft_version=1.19.3 + yarn_mappings=1.19.3+build.1 + loader_version=0.14.11 + kotlin_language_fabric=1.9.1+kotlin.1.8.10 + +# Mod Properties + mod_version = 1.0.0 + maven_group = com.example + archives_base_name = Paragon-Updated + +# Dependencies + fabric_version=0.68.1+1.19.3 + baritone=1.19.3-SNAPSHOT + eventbus=1.0.2 + animation_system=1.11 + open_auth=1.1.4 + json=20220924 + + kotlin=kotlin-stdlib-jdk8 + kotlin_coroutines=1.6.4 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..943f0cbfa754578e88a3dae77fce6e3dea56edbf GIT binary patch literal 61574 zcmb6AV{~QRwml9f72CFLyJFk6ZKq;e729@pY}>YNR8p1vbMJH7ubt# zZR`2@zJD1Ad^Oa6Hk1{VlN1wGR-u;_dyt)+kddaNpM#U8qn@6eX;fldWZ6BspQIa= zoRXcQk)#ENJ`XiXJuK3q0$`Ap92QXrW00Yv7NOrc-8ljOOOIcj{J&cR{W`aIGXJ-` z`ez%Mf7qBi8JgIb{-35Oe>Zh^GIVe-b^5nULQhxRDZa)^4+98@`hUJe{J%R>|LYHA z4K3~Hjcp8_owGF{d~lZVKJ;kc48^OQ+`_2migWY?JqgW&))70RgSB6KY9+&wm<*8 z_{<;(c;5H|u}3{Y>y_<0Z59a)MIGK7wRMX0Nvo>feeJs+U?bt-++E8bu7 zh#_cwz0(4#RaT@xy14c7d<92q-Dd}Dt<*RS+$r0a^=LGCM{ny?rMFjhgxIG4>Hc~r zC$L?-FW0FZ((8@dsowXlQq}ja%DM{z&0kia*w7B*PQ`gLvPGS7M}$T&EPl8mew3In z0U$u}+bk?Vei{E$6dAYI8Tsze6A5wah?d(+fyP_5t4ytRXNktK&*JB!hRl07G62m_ zAt1nj(37{1p~L|m(Bsz3vE*usD`78QTgYIk zQ6BF14KLzsJTCqx&E!h>XP4)bya|{*G7&T$^hR0(bOWjUs2p0uw7xEjbz1FNSBCDb@^NIA z$qaq^0it^(#pFEmuGVS4&-r4(7HLmtT%_~Xhr-k8yp0`$N|y>#$Ao#zibzGi*UKzi zhaV#@e1{2@1Vn2iq}4J{1-ox;7K(-;Sk{3G2_EtV-D<)^Pk-G<6-vP{W}Yd>GLL zuOVrmN@KlD4f5sVMTs7c{ATcIGrv4@2umVI$r!xI8a?GN(R;?32n0NS(g@B8S00-=zzLn z%^Agl9eV(q&8UrK^~&$}{S(6-nEXnI8%|hoQ47P?I0Kd=woZ-pH==;jEg+QOfMSq~ zOu>&DkHsc{?o&M5`jyJBWbfoPBv9Y#70qvoHbZXOj*qRM(CQV=uX5KN+b>SQf-~a8 ziZg}@&XHHXkAUqr)Q{y`jNd7`1F8nm6}n}+_She>KO`VNlnu(&??!(i#$mKOpWpi1 z#WfWxi3L)bNRodhPM~~?!5{TrrBY_+nD?CIUupkwAPGz-P;QYc-DcUoCe`w(7)}|S zRvN)9ru8b)MoullmASwsgKQo1U6nsVAvo8iKnbaWydto4y?#-|kP^%e6m@L`88KyDrLH`=EDx*6>?r5~7Iv~I zr__%SximG(izLKSnbTlXa-ksH@R6rvBrBavt4)>o3$dgztLt4W=!3=O(*w7I+pHY2(P0QbTma+g#dXoD7N#?FaXNQ^I0*;jzvjM}%=+km`YtC%O#Alm| zqgORKSqk!#^~6whtLQASqiJ7*nq?38OJ3$u=Tp%Y`x^eYJtOqTzVkJ60b2t>TzdQ{I}!lEBxm}JSy7sy8DpDb zIqdT%PKf&Zy--T^c-;%mbDCxLrMWTVLW}c=DP2>Td74)-mLl|70)8hU??(2)I@Zyo z2i`q5oyA!!(2xV~gahuKl&L(@_3SP012#x(7P!1}6vNFFK5f*A1xF({JwxSFwA|TM z&1z}!*mZKcUA-v4QzLz&5wS$7=5{M@RAlx@RkJaA4nWVqsuuaW(eDh^LNPPkmM~Al zwxCe@*-^4!ky#iNv2NIIU$CS+UW%ziW0q@6HN3{eCYOUe;2P)C*M`Bt{~-mC%T3%# zEaf)lATO1;uF33x>Hr~YD0Ju*Syi!Jz+x3myVvU^-O>C*lFCKS&=Tuz@>&o?68aF& zBv<^ziPywPu#;WSlTkzdZ9`GWe7D8h<1-v0M*R@oYgS5jlPbgHcx)n2*+!+VcGlYh?;9Ngkg% z=MPD+`pXryN1T|%I7c?ZPLb3bqWr7 zU4bfG1y+?!bw)5Iq#8IqWN@G=Ru%Thxf)#=yL>^wZXSCC8we@>$hu=yrU;2=7>h;5 zvj_pYgKg2lKvNggl1ALnsz2IlcvL;q79buN5T3IhXuJvy@^crqWpB-5NOm{7UVfxmPJ>`?;Tn@qHzF+W!5W{8Z&ZAnDOquw6r4$bv*jM#5lc%3v|c~^ zdqo4LuxzkKhK4Q+JTK8tR_|i6O(x#N2N0Fy5)!_trK&cn9odQu#Vlh1K~7q|rE z61#!ZPZ+G&Y7hqmY;`{XeDbQexC2@oFWY)Nzg@lL3GeEVRxWQlx@0?Zt`PcP0iq@6 zLgc)p&s$;*K_;q0L(mQ8mKqOJSrq$aQYO-Hbssf3P=wC6CvTVHudzJH-Jgm&foBSy zx0=qu$w477lIHk);XhaUR!R-tQOZ;tjLXFH6;%0)8^IAc*MO>Q;J={We(0OHaogG0 zE_C@bXic&m?F7slFAB~x|n#>a^@u8lu;=!sqE*?vq zu4`(x!Jb4F#&3+jQ|ygldPjyYn#uCjNWR)%M3(L!?3C`miKT;~iv_)dll>Q6b+I&c zrlB04k&>mSYLR7-k{Od+lARt~3}Bv!LWY4>igJl!L5@;V21H6dNHIGr+qV551e@yL z`*SdKGPE^yF?FJ|`#L)RQ?LJ;8+={+|Cl<$*ZF@j^?$H%V;jqVqt#2B0yVr}Nry5R z5D?S9n+qB_yEqvdy9nFc+8WxK$XME$3ftSceLb+L(_id5MMc*hSrC;E1SaZYow%jh zPgo#1PKjE+1QB`Of|aNmX?}3TP;y6~0iN}TKi3b+yvGk;)X&i3mTnf9M zuv3qvhErosfZ%Pb-Q>|BEm5(j-RV6Zf^$icM=sC-5^6MnAvcE9xzH@FwnDeG0YU{J zi~Fq?=bi0;Ir=hfOJu8PxC)qjYW~cv^+74Hs#GmU%Cw6?3LUUHh|Yab`spoqh8F@_ zm4bCyiXPx-Cp4!JpI~w!ShPfJOXsy>f*|$@P8L8(oeh#~w z-2a4IOeckn6}_TQ+rgl_gLArS3|Ml(i<`*Lqv6rWh$(Z5ycTYD#Z*&-5mpa}a_zHt z6E`Ty-^L9RK-M*mN5AasoBhc|XWZ7=YRQSvG)3$v zgr&U_X`Ny0)IOZtX}e$wNUzTpD%iF7Rgf?nWoG2J@PsS-qK4OD!kJ?UfO+1|F*|Bo z1KU`qDA^;$0*4mUJ#{EPOm7)t#EdX=Yx1R2T&xlzzThfRC7eq@pX&%MO&2AZVO%zw zS;A{HtJiL=rfXDigS=NcWL-s>Rbv|=)7eDoOVnVI>DI_8x>{E>msC$kXsS}z?R6*x zi(yO`$WN)_F1$=18cbA^5|f`pZA+9DG_Zu8uW?rA9IxUXx^QCAp3Gk1MSdq zBZv;_$W>*-zLL)F>Vn`}ti1k!%6{Q=g!g1J*`KONL#)M{ZC*%QzsNRaL|uJcGB7jD zTbUe%T(_x`UtlM!Ntp&-qu!v|mPZGcJw$mdnanY3Uo>5{oiFOjDr!ZznKz}iWT#x& z?*#;H$`M0VC|a~1u_<(}WD>ogx(EvF6A6S8l0%9U<( zH||OBbh8Tnzz*#bV8&$d#AZNF$xF9F2{_B`^(zWNC}af(V~J+EZAbeC2%hjKz3V1C zj#%d%Gf(uyQ@0Y6CcP^CWkq`n+YR^W0`_qkDw333O<0FoO9()vP^!tZ{`0zsNQx~E zb&BcBU>GTP2svE2Tmd;~73mj!_*V8uL?ZLbx}{^l9+yvR5fas+w&0EpA?_g?i9@A$j*?LnmctPDQG|zJ`=EF}Vx8aMD^LrtMvpNIR*|RHA`ctK*sbG= zjN7Q)(|dGpC}$+nt~bupuKSyaiU}Ws{?Tha@$q}cJ;tvH>+MuPih+B4d$Zbq9$Y*U z)iA(-dK?Ov@uCDq48Zm%%t5uw1GrnxDm7*ITGCEF!2UjA`BqPRiUR`yNq^zz|A3wU zG(8DAnY-GW+PR2&7@In{Sla(XnMz5Rk^*5u4UvCiDQs@hvZXoiziv{6*i?fihVI|( zPrY8SOcOIh9-AzyJ*wF4hq%ojB&Abrf;4kX@^-p$mmhr}xxn#fVU?ydmD=21&S)s*v*^3E96(K1}J$6bi8pyUr-IU)p zcwa$&EAF$0Aj?4OYPcOwb-#qB=kCEDIV8%^0oa567_u6`9+XRhKaBup z2gwj*m#(}=5m24fBB#9cC?A$4CCBj7kanaYM&v754(b%Vl!gg&N)ZN_gO0mv(jM0# z>FC|FHi=FGlEt6Hk6H3!Yc|7+q{&t%(>3n#>#yx@*aS+bw)(2!WK#M0AUD~wID>yG z?&{p66jLvP1;!T7^^*_9F322wJB*O%TY2oek=sA%AUQT75VQ_iY9`H;ZNKFQELpZd z$~M`wm^Y>lZ8+F0_WCJ0T2td`bM+b`)h3YOV%&@o{C#|t&7haQfq#uJJP;81|2e+$ z|K#e~YTE87s+e0zCE2X$df`o$`8tQhmO?nqO?lOuTJ%GDv&-m_kP9X<5GCo1=?+LY z?!O^AUrRb~3F!k=H7Aae5W0V1{KlgH379eAPTwq=2+MlNcJ6NM+4ztXFTwI)g+)&Q7G4H%KH_(}1rq%+eIJ*3$?WwnZxPZ;EC=@`QS@|-I zyl+NYh&G>k%}GL}1;ap8buvF>x^yfR*d+4Vkg7S!aQ++_oNx6hLz6kKWi>pjWGO5k zlUZ45MbA=v(xf>Oeqhg8ctl56y{;uDG?A9Ga5aEzZB80BW6vo2Bz&O-}WAq>(PaV;*SX0=xXgI_SJ< zYR&5HyeY%IW}I>yKu^?W2$~S!pw?)wd4(#6;V|dVoa}13Oiz5Hs6zA zgICc;aoUt$>AjDmr0nCzeCReTuvdD1{NzD1wr*q@QqVW*Wi1zn;Yw1dSwLvTUwg#7 zpp~Czra7U~nSZZTjieZxiu~=}!xgV68(!UmQz@#w9#$0Vf@y%!{uN~w^~U_d_Aa&r zt2l>)H8-+gA;3xBk?ZV2Cq!L71;-tb%7A0FWziYwMT|#s_Ze_B>orZQWqDOZuT{|@ zX04D%y&8u@>bur&*<2??1KnaA7M%%gXV@C3YjipS4|cQH68OSYxC`P#ncvtB%gnEI z%fxRuH=d{L70?vHMi>~_lhJ@MC^u#H66=tx?8{HG;G2j$9@}ZDYUuTetwpvuqy}vW)kDmj^a|A%z(xs7yY2mU0#X2$un&MCirr|7 z%m?8+9aekm0x5hvBQ2J+>XeAdel$cy>J<6R3}*O^j{ObSk_Ucv$8a3_WPTd5I4HRT z(PKP5!{l*{lk_19@&{5C>TRV8_D~v*StN~Pm*(qRP+`1N12y{#w_fsXrtSt={0hJw zQ(PyWgA;;tBBDql#^2J(pnuv;fPn(H>^d<6BlI%00ylJZ?Evkh%=j2n+|VqTM~EUh zTx|IY)W;3{%x(O{X|$PS&x0?z#S2q-kW&G}7#D?p7!Q4V&NtA_DbF~v?cz6_l+t8e zoh1`dk;P-%$m(Ud?wnoZn0R=Ka$`tnZ|yQ-FN!?!9Wmb^b(R!s#b)oj9hs3$p%XX9DgQcZJE7B_dz0OEF6C zx|%jlqj0WG5K4`cVw!19doNY+(;SrR_txAlXxf#C`uz5H6#0D>SzG*t9!Fn|^8Z8; z1w$uiQzufUzvPCHXhGma>+O327SitsB1?Rn6|^F198AOx}! zfXg22Lm0x%=gRvXXx%WU2&R!p_{_1H^R`+fRO2LT%;He@yiekCz3%coJ=8+Xbc$mN zJ;J7*ED|yKWDK3CrD?v#VFj|l-cTgtn&lL`@;sMYaM1;d)VUHa1KSB5(I54sBErYp z>~4Jz41?Vt{`o7T`j=Se{-kgJBJG^MTJ}hT00H%U)pY-dy!M|6$v+-d(CkZH5wmo1 zc2RaU`p3_IJ^hf{g&c|^;)k3zXC0kF1>rUljSxd}Af$!@@R1fJWa4g5vF?S?8rg=Z z4_I!$dap>3l+o|fyYy(sX}f@Br4~%&&#Z~bEca!nMKV zgQSCVC!zw^j<61!7#T!RxC6KdoMNONcM5^Q;<#~K!Q?-#6SE16F*dZ;qv=`5 z(kF|n!QIVd*6BqRR8b8H>d~N@ab+1+{3dDVPVAo>{mAB#m&jX{usKkCg^a9Fef`tR z?M79j7hH*;iC$XM)#IVm&tUoDv!(#f=XsTA$)(ZE37!iu3Gkih5~^Vlx#<(M25gr@ zOkSw4{l}6xI(b0Gy#ywglot$GnF)P<FQt~9ge1>qp8Q^k;_Dm1X@Tc^{CwYb4v_ld}k5I$&u}avIDQ-D(_EP zhgdc{)5r_iTFiZ;Q)5Uq=U73lW%uYN=JLo#OS;B0B=;j>APk?|!t{f3grv0nv}Z%` zM%XJk^#R69iNm&*^0SV0s9&>cl1BroIw*t3R0()^ldAsq)kWcI=>~4!6fM#0!K%TS ziZH=H%7-f=#-2G_XmF$~Wl~Um%^9%AeNSk)*`RDl##y+s)$V`oDlnK@{y+#LNUJp1^(e89sed@BB z^W)sHm;A^9*RgQ;f(~MHK~bJRvzezWGr#@jYAlXIrCk_iiUfC_FBWyvKj2mBF=FI;9|?0_~=E<)qnjLg9k*Qd!_ zl}VuSJB%#M>`iZm*1U^SP1}rkkI};91IRpZw%Hb$tKmr6&H5~m?A7?+uFOSnf)j14 zJCYLOYdaRu>zO%5d+VeXa-Ai7{7Z}iTn%yyz7hsmo7E|{ z@+g9cBcI-MT~2f@WrY0dpaC=v{*lDPBDX}OXtJ|niu$xyit;tyX5N&3pgmCxq>7TP zcOb9%(TyvOSxtw%Y2+O&jg39&YuOtgzn`uk{INC}^Na_-V;63b#+*@NOBnU{lG5TS zbC+N-qt)u26lggGPcdrTn@m+m>bcrh?sG4b(BrtdIKq3W<%?WuQtEW0Z)#?c_Lzqj*DlZ zVUpEV3~mG#DN$I#JJp3xc8`9ex)1%Il7xKwrpJt)qtpq}DXqI=5~~N}N?0g*YwETZ z(NKJO5kzh?Os`BQ7HYaTl>sXVr!b8>(Wd&PU*3ivSn{;q`|@n*J~-3tbm;4WK>j3&}AEZ*`_!gJ3F4w~4{{PyLZklDqWo|X}D zbZU_{2E6^VTCg#+6yJt{QUhu}uMITs@sRwH0z5OqM>taO^(_+w1c ztQ?gvVPj<_F_=(ISaB~qML59HT;#c9x(;0vkCi2#Zp`;_r@+8QOV1Ey2RWm6{*J&9 zG(Dt$zF^7qYpo9Ne}ce5re^j|rvDo*DQ&1Be#Fvo#?m4mfFrNZb1#D4f`Lf(t_Fib zwxL3lx(Zp(XVRjo_ocElY#yS$LHb6yl;9;Ycm1|5y_praEcGUZxLhS%7?b&es2skI z9l!O)b%D=cXBa@v9;64f^Q9IV$xOkl;%cG6WLQ`_a7I`woHbEX&?6NJ9Yn&z+#^#! zc8;5=jt~Unn7!cQa$=a7xSp}zuz#Lc#Q3-e7*i`Xk5tx_+^M~!DlyBOwVEq3c(?`@ zZ_3qlTN{eHOwvNTCLOHjwg0%niFYm({LEfAieI+k;U2&uTD4J;Zg#s`k?lxyJN<$mK6>j?J4eOM@T*o?&l@LFG$Gs5f4R*p*V1RkTdCfv9KUfa< z{k;#JfA3XA5NQJziGd%DchDR*Dkld&t;6i9e2t7{hQPIG_uDXN1q0T;IFCmCcua-e z`o#=uS2_en206(TuB4g-!#=rziBTs%(-b1N%(Bl}ea#xKK9zzZGCo@<*i1ZoETjeC zJ)ll{$mpX7Eldxnjb1&cB6S=7v@EDCsmIOBWc$p^W*;C0i^Hc{q(_iaWtE{0qbLjxWlqBe%Y|A z>I|4)(5mx3VtwRBrano|P))JWybOHUyOY67zRst259tx;l(hbY@%Z`v8Pz^0Sw$?= zwSd^HLyL+$l&R+TDnbV_u+h{Z>n$)PMf*YGQ}1Df@Nr{#Gr+@|gKlnv?`s1rm^$1+ zic`WeKSH?{+E}0^#T<&@P;dFf;P5zCbuCOijADb}n^{k=>mBehDD6PtCrn5ZBhh2L zjF$TbzvnwT#AzGEG_Rg>W1NS{PxmL9Mf69*?YDeB*pK!&2PQ7!u6eJEHk5e(H~cnG zZQ?X_rtws!;Tod88j=aMaylLNJbgDoyzlBv0g{2VYRXObL=pn!n8+s1s2uTwtZc

YH!Z*ZaR%>WTVy8-(^h5J^1%NZ$@&_ZQ)3AeHlhL~=X9=fKPzFbZ;~cS**=W-LF1 z5F82SZ zG8QZAet|10U*jK*GVOA(iULStsUDMjhT$g5MRIc4b8)5q_a?ma-G+@xyNDk{pR*YH zjCXynm-fV`*;}%3=+zMj**wlCo6a{}*?;`*j%fU`t+3Korws%dsCXAANKkmVby*eJ z6`2%GB{+&`g2;snG`LM9S~>#^G|nZ|JMnWLgSmJ4!kB->uAEF0sVn6km@s=#_=d)y zzld%;gJY>ypQuE z!wgqqTSPxaUPoG%FQ()1hz(VHN@5sfnE68of>9BgGsQP|9$7j zGqN{nxZx4CD6ICwmXSv6&RD<-etQmbyTHIXn!Q+0{18=!p))>To8df$nCjycnW07Q zsma_}$tY#Xc&?#OK}-N`wPm)+2|&)9=9>YOXQYfaCI*cV1=TUl5({a@1wn#V?y0Yn z(3;3-@(QF|0PA}|w4hBWQbTItc$(^snj$36kz{pOx*f`l7V8`rZK}82pPRuy zxwE=~MlCwOLRC`y%q8SMh>3BUCjxLa;v{pFSdAc7m*7!}dtH`MuMLB)QC4B^Uh2_? zApl6z_VHU}=MAA9*g4v-P=7~3?Lu#ig)cRe90>@B?>})@X*+v&yT6FvUsO=p#n8p{ zFA6xNarPy0qJDO1BPBYk4~~LP0ykPV ztoz$i+QC%Ch%t}|i^(Rb9?$(@ijUc@w=3F1AM}OgFo1b89KzF6qJO~W52U_;R_MsB zfAC29BNUXpl!w&!dT^Zq<__Hr#w6q%qS1CJ#5Wrb*)2P1%h*DmZ?br)*)~$^TExX1 zL&{>xnM*sh=@IY)i?u5@;;k6+MLjx%m(qwDF3?K3p>-4c2fe(cIpKq#Lc~;#I#Wwz zywZ!^&|9#G7PM6tpgwA@3ev@Ev_w`ZZRs#VS4}<^>tfP*(uqLL65uSi9H!Gqd59C&=LSDo{;#@Isg3caF1X+4T}sL2B+Q zK*kO0?4F7%8mx3di$B~b&*t7y|{x%2BUg4kLFXt`FK;Vi(FIJ+!H zW;mjBrfZdNT>&dDfc4m$^f@k)mum{DioeYYJ|XKQynXl-IDs~1c(`w{*ih0-y_=t$ zaMDwAz>^CC;p*Iw+Hm}%6$GN49<(rembdFvb!ZyayLoqR*KBLc^OIA*t8CXur+_e0 z3`|y|!T>7+jdny7x@JHtV0CP1jI^)9){!s#{C>BcNc5#*hioZ>OfDv)&PAM!PTjS+ zy1gRZirf>YoGpgprd?M1k<;=SShCMn406J>>iRVnw9QxsR|_j5U{Ixr;X5n$ih+-=X0fo(Oga zB=uer9jc=mYY=tV-tAe@_d-{aj`oYS%CP@V3m6Y{)mZ5}b1wV<9{~$`qR9 zEzXo|ok?1fS?zneLA@_C(BAjE_Bv7Dl2s?=_?E9zO5R^TBg8Be~fpG?$9I; zDWLH9R9##?>ISN8s2^wj3B?qJxrSSlC6YB}Yee{D3Ex8@QFLZ&zPx-?0>;Cafcb-! zlGLr)wisd=C(F#4-0@~P-C&s%C}GvBhb^tTiL4Y_dsv@O;S56@?@t<)AXpqHx9V;3 zgB!NXwp`=%h9!L9dBn6R0M<~;(g*nvI`A@&K!B`CU3^FpRWvRi@Iom>LK!hEh8VjX z_dSw5nh-f#zIUDkKMq|BL+IO}HYJjMo=#_srx8cRAbu9bvr&WxggWvxbS_Ix|B}DE zk!*;&k#1BcinaD-w#E+PR_k8I_YOYNkoxw5!g&3WKx4{_Y6T&EV>NrnN9W*@OH+niSC0nd z#x*dm=f2Zm?6qhY3}Kurxl@}d(~ z<}?Mw+>%y3T{!i3d1%ig*`oIYK|Vi@8Z~*vxY%Od-N0+xqtJ*KGrqo*9GQ14WluUn z+%c+og=f0s6Mcf%r1Be#e}&>1n!!ZxnWZ`7@F9ymfVkuFL;m6M5t%6OrnK#*lofS{ z=2;WPobvGCu{(gy8|Mn(9}NV99Feps6r*6s&bg(5aNw$eE ztbYsrm0yS`UIJ?Kv-EpZT#76g76*hVNg)L#Hr7Q@L4sqHI;+q5P&H{GBo1$PYkr@z zFeVdcS?N1klRoBt4>fMnygNrDL!3e)k3`TXoa3#F#0SFP(Xx^cc)#e2+&z9F=6{qk z%33-*f6=+W@baq){!d_;ouVthV1PREX^ykCjD|%WUMnNA2GbA#329aEihLk~0!!}k z)SIEXz(;0lemIO{|JdO{6d|-9LePs~$}6vZ>`xYCD(ODG;OuwOe3jeN;|G$~ml%r* z%{@<9qDf8Vsw581v9y+)I4&te!6ZDJMYrQ*g4_xj!~pUu#er`@_bJ34Ioez)^055M$)LfC|i*2*3E zLB<`5*H#&~R*VLYlNMCXl~=9%o0IYJ$bY+|m-0OJ-}6c@3m<~C;;S~#@j-p?DBdr<><3Y92rW-kc2C$zhqwyq09;dc5;BAR#PPpZxqo-@e_s9*O`?w5 zMnLUs(2c-zw9Pl!2c#+9lFpmTR>P;SA#Id;+fo|g{*n&gLi}7`K)(=tcK|?qR4qNT z%aEsSCL0j9DN$j8g(a+{Z-qPMG&O)H0Y9!c*d?aN0tC&GqC+`%(IFY$ll~!_%<2pX zuD`w_l)*LTG%Qq3ZSDE)#dt-xp<+n=3&lPPzo}r2u~>f8)mbcdN6*r)_AaTYq%Scv zEdwzZw&6Ls8S~RTvMEfX{t@L4PtDi{o;|LyG>rc~Um3;x)rOOGL^Bmp0$TbvPgnwE zJEmZ>ktIfiJzdW5i{OSWZuQWd13tz#czek~&*?iZkVlLkgxyiy^M~|JH(?IB-*o6% zZT8+svJzcVjcE0UEkL_5$kNmdrkOl3-`eO#TwpTnj?xB}AlV2`ks_Ua9(sJ+ok|%b z=2n2rgF}hvVRHJLA@9TK4h#pLzw?A8u31&qbr~KA9;CS7aRf$^f1BZ5fsH2W8z}FU zC}Yq76IR%%g|4aNF9BLx6!^RMhv|JYtoZW&!7uOskGSGL+}_>L$@Jg2Vzugq-NJW7 zzD$7QK7cftU1z*Fxd@}wcK$n6mje}=C|W)tm?*V<<{;?8V9hdoi2NRm#~v^#bhwlc z5J5{cSRAUztxc6NH>Nwm4yR{(T>0x9%%VeU&<&n6^vFvZ{>V3RYJ_kC9zN(M(` zp?1PHN>f!-aLgvsbIp*oTZv4yWsXM2Q=C}>t7V(iX*N8{aoWphUJ^(n3k`pncUt&` ze+sYjo)>>=I?>X}1B*ZrxYu`|WD0J&RIb~ zPA_~u)?&`}JPwc1tu=OlKlJ3f!9HXa)KMb|2%^~;)fL>ZtycHQg`j1Vd^nu^XexYkcae@su zOhxk8ws&Eid_KAm_<}65zbgGNzwshR#yv&rQ8Ae<9;S^S}Dsk zubzo?l{0koX8~q*{uA%)wqy*Vqh4>_Os7PPh-maB1|eT-4 zK>*v3q}TBk1QlOF!113XOn(Kzzb5o4Dz@?q3aEb9%X5m{xV6yT{;*rnLCoI~BO&SM zXf=CHLI>kaSsRP2B{z_MgbD;R_yLnd>^1g`l;uXBw7|)+Q_<_rO!!VaU-O+j`u%zO z1>-N8OlHDJlAqi2#z@2yM|Dsc$(nc>%ZpuR&>}r(i^+qO+sKfg(Ggj9vL%hB6 zJ$8an-DbmKBK6u6oG7&-c0&QD#?JuDYKvL5pWXG{ztpq3BWF)e|7aF-(91xvKt047 zvR{G@KVKz$0qPNXK*gt*%qL-boz-*E;7LJXSyj3f$7;%5wj)2p8gvX}9o_u}A*Q|7 z)hjs?k`8EOxv1zahjg2PQDz5pYF3*Cr{%iUW3J+JU3P+l?n%CwV;`noa#3l@vd#6N zc#KD2J;5(Wd1BP)`!IM;L|(d9m*L8QP|M7W#S7SUF3O$GFnWvSZOwC_Aq~5!=1X+s z6;_M++j0F|x;HU6kufX-Ciy|du;T%2@hASD9(Z)OSVMsJg+=7SNTAjV<8MYN-zX5U zVp~|N&{|#Z)c6p?BEBBexg4Q((kcFwE`_U>ZQotiVrS-BAHKQLr87lpmwMCF_Co1M z`tQI{{7xotiN%Q~q{=Mj5*$!{aE4vi6aE$cyHJC@VvmemE4l_v1`b{)H4v7=l5+lm^ ztGs>1gnN(Vl+%VuwB+|4{bvdhCBRxGj3ady^ zLxL@AIA>h@eP|H41@b}u4R`s4yf9a2K!wGcGkzUe?!21Dk)%N6l+#MP&}B0%1Ar*~ zE^88}(mff~iKMPaF+UEp5xn(gavK(^9pvsUQT8V;v!iJt|7@&w+_va`(s_57#t?i6 zh$p!4?BzS9fZm+ui`276|I307lA-rKW$-y^lK#=>N|<-#?WPPNs86Iugsa&n{x%*2 zzL_%$#TmshCw&Yo$Ol?^|hy{=LYEUb|bMMY`n@#(~oegs-nF){0ppwee|b{ca)OXzS~01a%cg&^ zp;}mI0ir3zapNB)5%nF>Sd~gR1dBI!tDL z&m24z9sE%CEv*SZh1PT6+O`%|SG>x74(!d!2xNOt#C5@I6MnY%ij6rK3Y+%d7tr3&<^4XU-Npx{^`_e z9$-|@$t`}A`UqS&T?cd@-+-#V7n7tiZU!)tD8cFo4Sz=u65?f#7Yj}MDFu#RH_GUQ z{_-pKVEMAQ7ljrJ5Wxg4*0;h~vPUI+Ce(?={CTI&(RyX&GVY4XHs>Asxcp%B+Y9rK z5L$q94t+r3=M*~seA3BO$<0%^iaEb2K=c7((dIW$ggxdvnC$_gq~UWy?wljgA0Dwd`ZsyqOC>)UCn-qU5@~!f znAWKSZeKRaq#L$3W21fDCMXS;$X(C*YgL7zi8E|grQg%Jq8>YTqC#2~ys%Wnxu&;ZG<`uZ1L<53jf2yxYR3f0>a;%=$SYI@zUE*g7f)a{QH^<3F?%({Gg)yx^zsdJ3^J2 z#(!C3qmwx77*3#3asBA(jsL`86|OLB)j?`0hQIh>v;c2A@|$Yg>*f+iMatg8w#SmM z<;Y?!$L--h9vH+DL|Wr3lnfggMk*kyGH^8P48or4m%K^H-v~`cBteWvnN9port02u zF;120HE2WUDi@8?&Oha6$sB20(XPd3LhaT~dRR2_+)INDTPUQ9(-370t6a!rLKHkIA`#d-#WUcqK%pMcTs6iS2nD?hln+F-cQPUtTz2bZ zq+K`wtc1;ex_iz9?S4)>Fkb~bj0^VV?|`qe7W02H)BiibE9=_N8=(5hQK7;(`v7E5Mi3o? z>J_)L`z(m(27_&+89P?DU|6f9J*~Ih#6FWawk`HU1bPWfdF?02aY!YSo_!v$`&W znzH~kY)ll^F07=UNo|h;ZG2aJ<5W~o7?*${(XZ9zP0tTCg5h-dNPIM=*x@KO>a|Bk zO13Cbnbn7+_Kj=EEMJh4{DW<))H!3)vcn?_%WgRy=FpIkVW>NuV`knP`VjT78dqzT z>~ay~f!F?`key$EWbp$+w$8gR1RHR}>wA8|l9rl7jsT+>sQLqs{aITUW{US&p{Y)O zRojdm|7yoA_U+`FkQkS?$4$uf&S52kOuUaJT9lP@LEqjKDM)iqp9aKNlkpMyJ76eb zAa%9G{YUTXa4c|UE>?CCv(x1X3ebjXuL&9Dun1WTlw@Wltn3zTareM)uOKs$5>0tR zDA~&tM~J~-YXA<)&H(ud)JyFm+d<97d8WBr+H?6Jn&^Ib0<{6ov- ze@q`#Y%KpD?(k{if5-M(fO3PpK{Wjqh)7h+ojH ztb=h&vmy0tn$eA8_368TlF^DKg>BeFtU%3|k~3lZAp(C$&Qjo9lR<#rK{nVn$)r*y z#58_+t=UJm7tp|@#7}6M*o;vn7wM?8Srtc z3ZFlKRDYc^HqI!O9Z*OZZ8yo-3ie9i8C%KDYCfE?`rjrf(b&xBXub!54yaZY2hFi2w2asEOiO8;Hru4~KsqQZMrs+OhO8WMX zFN0=EvME`WfQ85bmsnPFp|RU;GP^&Ik#HV(iR1B}8apb9W9)Nv#LwpED~%w67o;r! zVzm@zGjsl)loBy6p>F(G+#*b|7BzZbV#E0Pi`02uAC}D%6d12TzOD19-9bhZZT*GS zqY|zxCTWn+8*JlL3QH&eLZ}incJzgX>>i1dhff}DJ=qL{d?yv@k33UhC!}#hC#31H zOTNv5e*ozksj`4q5H+75O70w4PoA3B5Ea*iGSqA=v)}LifPOuD$ss*^W}=9kq4qqd z6dqHmy_IGzq?j;UzFJ*gI5)6qLqdUL;G&E*;lnAS+ZV1nO%OdoXqw(I+*2-nuWjwM-<|XD541^5&!u2 z1XflFJp(`^D|ZUECbaoqT5$#MJ=c23KYpBjGknPZ7boYRxpuaO`!D6C_Al?T$<47T zFd@QT%860pwLnUwer$BspTO9l1H`fknMR|GC?@1Wn`HscOe4mf{KbVio zahne0&hJd0UL#{Xyz=&h@oc>E4r*T|PHuNtK6D279q!2amh%r#@HjaN_LT4j>{&2I z?07K#*aaZ?lNT6<8o85cjZoT~?=J&Xd35I%JJom{P=jj?HQ5yfvIR8bd~#7P^m%B-szS{v<)7i?#at=WA+}?r zwMlc-iZv$GT};AP4k2nL70=Q-(+L_CYUN{V?dnvG-Av+%)JxfwF4-r^Z$BTwbT!Jh zG0YXK4e8t`3~){5Qf6U(Ha0WKCKl^zlqhqHj~F}DoPV#yHqLu+ZWlv2zH29J6}4amZ3+-WZkR7(m{qEG%%57G!Yf&!Gu~FDeSYmNEkhi5nw@#6=Bt& zOKT!UWVY-FFyq1u2c~BJ4F`39K7Vw!1U;aKZw)2U8hAb&7ho|FyEyP~D<31{_L>RrCU>eEk-0)TBt5sS5?;NwAdRzRj5qRSD?J6 ze9ueq%TA*pgwYflmo`=FnGj2r_u2!HkhE5ZbR_Xf=F2QW@QTLD5n4h(?xrbOwNp5` zXMEtm`m52{0^27@=9VLt&GI;nR9S)p(4e+bAO=e4E;qprIhhclMO&7^ThphY9HEko z#WfDFKKCcf%Bi^umN({q(avHrnTyPH{o=sXBOIltHE?Q65y_At<9DsN*xWP|Q=<|R z{JfV?B5dM9gsXTN%%j;xCp{UuHuYF;5=k|>Q=;q zU<3AEYawUG;=%!Igjp!FIAtJvoo!*J^+!oT%VI4{P=XlbYZl;Dc467Nr*3j zJtyn|g{onj!_vl)yv)Xv#}(r)@25OHW#|eN&q7_S4i2xPA<*uY9vU_R7f};uqRgVb zM%<_N3ys%M;#TU_tQa#6I1<+7Bc+f%mqHQ}A@(y^+Up5Q*W~bvS9(21FGQRCosvIX zhmsjD^OyOpae*TKs=O?(_YFjSkO`=CJIb*yJ)Pts1egl@dX6-YI1qb?AqGtIOir&u zyn>qxbJhhJi9SjK+$knTBy-A)$@EfzOj~@>s$M$|cT5V!#+|X`aLR_gGYmNuLMVH4 z(K_Tn;i+fR28M~qv4XWqRg~+18Xb?!sQ=Dy)oRa)Jkl{?pa?66h$YxD)C{F%EfZt| z^qWFB2S_M=Ryrj$a?D<|>-Qa5Y6RzJ$6Yp`FOy6p2lZSjk%$9guVsv$OOT*6V$%TH zMO}a=JR(1*u`MN8jTn|OD!84_h${A)_eFRoH7WTCCue9X73nbD282V`VzTH$ckVaC zalu%ek#pHxAx=0migDNXwcfbK3TwB7@T7wx2 zGV7rS+2g9eIT9>uWfao+lW2Qi9L^EBu#IZSYl0Q~A^KYbQKwNU(YO4Xa1XH_>ml1v z#qS;P!3Lt%2|U^=++T`A!;V-!I%upi?<#h~h!X`p7eP!{+2{7DM0$yxi9gBfm^W?M zD1c)%I7N>CG6250NW54T%HoCo^ud#`;flZg_4ciWuj4a884oWUYV(#VW`zO1T~m(_ zkayymAJI)NU9_0b6tX)GU+pQ3K9x=pZ-&{?07oeb1R7T4RjYYbfG^>3Y>=?dryJq& zw9VpqkvgVB?&aK}4@m78NQhTqZeF=zUtBkJoz8;6LO<4>wP7{UPEs1tP69;v919I5 zzCqXUhfi~FoK5niVU~hQqAksPsD@_|nwH4avOw67#fb@Z5_OS=$eP%*TrPU%HG<-A z`9)Y3*SAdfiqNTJ2eKj8B;ntdqa@U46)B+odlH)jW;U{A*0sg@z>-?;nN}I=z3nEE@Bf3kh1B zdqT{TWJvb#AT&01hNsBz8v(OwBJSu#9}A6Y!lv|`J#Z3uVK1G`0$J&OH{R?3YVfk% z9P3HGpo<1uy~VRCAe&|c4L!SR{~^0*TbVtqej3ARx(Okl5c>m~|H9ZwKVHc_tCe$hsqA`l&h7qPP5xBgtwu!; zzQyUD<6J!M5fsV-9P?C9P49qnXR+iXt#G_AS2N<6!HZ(eS`|-ndb|y!(0Y({2 z4aF~GO8bHM7s+wnhPz>sa!Z%|!qWk*DGr)azB}j6bLe#FQXV4aO>Eo7{v`0x=%5SY zy&{kY+VLXni6pPJYG_Sa*9hLy-s$79$zAhkF)r?9&?UaNGmY9F$uf>iJ~u@Q;sydU zQaN7B>4B*V;rtl^^pa3nFh$q*c&sx^Um}I)Z)R&oLEoWi3;Yv6za?;7m?fZe>#_mS z-EGInS^#UHdOzCaMRSLh7Mr0}&)WCuw$4&K^lx{;O+?Q1p5PD8znQ~srGrygJ?b~Q5hIPt?Wf2)N?&Dae4%GRcRKL(a-2koctrcvxSslXn-k9cYS|<-KJ#+$Wo>}yKKh*3Q zHsK(4-Jv!9R3*FKmN$Z#^aZcACGrlGjOe^#Z&DfPyS-1bT9OIX~-I-5lN6Y>M}dvivbs2BcbPcaNH%25-xMkT$>*soDJ) z27;};8oCYHSLF0VawZFn8^H;hIN=J457@eoI6s2P87QN6O`q8coa;PN$mRZ>2Vv+! zQj1}Tvp8?>yyd_U>dnhx%q~k*JR`HO=43mB?~xKAW9Z}Vh2b0<(T89%eZ z57kGs@{NUHM>|!+QtqI@vE8hp`IIGc`A9Y{p?c;@a!zJFmdaCJ;JmzOJ8)B1x{yZp zi!U{Wh-h+u6vj`2F+(F6gTv*cRX7MR z9@?>is`MSS1L#?PaW6BWEd#EX4+O1x6WdU~LZaQ^Quow~ybz*aAu{ZMrQ;yQ8g)-qh>x z^}@eFu1u7+3C0|hRMD1{MEn(JOmJ|wYHqGyn*xt-Y~J3j@nY56i)sgNjS4n@Q&p@@^>HQjzNaw#C9=TbwzDtiMr2a^}bX< zZE%HU^|CnS`WYVcs}D)+fP#bW0+Q#l#JC+!`OlhffKUCN8M-*CqS;VQX`If78$as0 z=$@^NFcDpTh~45heE63=x5nmP@4hBaFn(rmTY2Yj{S&k;{4W!0Nu9O5pK30}oxM7{ z>l4cKb~9D?N#u_AleD<~8XD@23sY^rt&fN%Q0L=Ti2bV#px`RhM$}h*Yg-iC4A+rI zV~@yY7!1}-@onsZ)@0tUM23cN-rXrZYWF#!V-&>vds8rP+w0t{?~Q zT^LN*lW==+_ifPb+-yMh9JhfcYiXo_zWa`ObRP9_En3P))Qyu0qPJ3*hiFSu>Vt-j z<*HWbiP2#BK@nt<g|pe3 zfBKS@i;ISkorx@cOIx9}p^d8Gis%$)))%ByVYU^KG#eE+j1p;^(Y1ndHnV&YuQZm~ zj;f+mf>0ru!N`)_p@Ls<& z`t+JDx7}R568Q|8`4A}G@t8Wc?SOXunyW5C-AWoB@P>r}uwFY*=?=!K@J(!t@#xOuPXhFS@FTf6-7|%k;nw2%Z+iHl219Ho1!bv(Ee0|ao!Rs%Jl0@3suGrOsb_@VM;(xzrf^Cbd;CK3b%a|ih-fG)`Rd00O74=sQYW~Ve z#fl!*(fo~SIQ5-Sl?1@o7-E*|SK|hoVEKzxeg!$KmQLSTN=5N`rYeh$AH&x}JMR+5dq|~FUy&Oj%QIy;HNr;V*7cQC+ka>LAwdU)?ubI@W z={eg%A&7D**SIj$cu=CN%vN^(_JeIHMUyejCrO%C3MhOcVL~Niu;8WYoN}YVhb+=- zR}M3p|H0`E2Id99y#03r`8$s0t*iD>`^7EPm1~guC)L~uW#O~>I85Q3Nj8(sG<@T| zL^e~XQt9O0AXQ^zkMdgzk5bdYttP~nf-<831zulL>>ghTFii$lg3^80t8Gb*x1w5| zN{kZuv`^8Fj=t(T*46M=S$6xY@0~AvWaGOYOBTl0?}KTkplmGn-*P(X=o-v^48OY} zi11-+Y}y)fdy_tI;*W(>#qzvgQZ52t!nrGsJEy!c86TKIN(n|!&ucCduG$XaIapI z{(Z9gZANsI={A=5Aorgq2H25Dd}H5@-5=j=s{f`%^>6b5qkm_2|3g>r-^amf=B_xV zXg*>aqxXZ6=VUI4$})ypDMy$IKkgJ;V>077T9o#OhpFhKtHP_4mnjS5QCgGe<;~Xe zt<2ZhL7?JL6Mi|U_w?;?@4OD@=4EB2op_s)N-ehm#7`zSU#7itU$#%^ncqjc`9HCG zfj;O1T+*oTkzRi-6NN`oS3w3$7ZB37L>PcN$C$L^qqHfiYO4_>0_qCw0r@FEMj=>}}%q_`d#pUT;c?=gI zqTGpiY4Z;Q(B~#hXIVBFbi#dO=cOdmOqD0|An?7nMdrm2^C>yw*dQ=#lf8)@DvXK; z$MXp}QZgnE!&L73x0LZX_bCdD4lRY$$^?9dt1RwCng{lIpbb%Ej%yOh{@76yEyb}K zXZy%^656Sk3BLKbalcc>Dt5iDzo^tj2!wnDL(X;urJfpkWrab!frFSC6Q7m zuoqN!(t=L&+Ov&~9mz(yEB`MK%RPXS>26Ww5(F;aZ zR@tPAw~=q2ioOiynxgBqE&3-R-@6yCo0*mE;#I^c!=g~HyyjGA6}|<(0EseKDTM4w z94YnCO^VYIUY@}x8kr;;El-cFHVO<$6;-UdmUB|J8R*Wf$a37gVgYT|w5^KkYe=(i zMkA$%7;^a*$V+}e%S~&*^^O;AX9NLt@cIPc*v!lKZ)(zahAsUj%PJot19ErFU=Uk( z9Hw;Lb`V+BzVpMu;TGB9}y~ff)^mbEmF?g{{7_0SR zPgp*n)l{?>7-Ji;eWG{ln$)Bro+UJAQo6W2-23d@SI=HiFV3hR2OUcAq_9q~ye)o@ zq8WZvhg`H(?1AUZ-NM%_Cuj}eb{4wOCnqs^E1G9U4HKjqaw@4dsXWP#$wx^}XPZ0F zywsJ0aJHA>AHc^q#nhQjD3!KDFT6FaDioJ#HsZU7Wo?8WH19TJ%OMDz$XH5J4Cjdt z@crE;#JNG`&1H8ekB(R4?QiiZ55kztsx}pQti}gG0&8`dP=d(8aCLOExd*Sw^WL`Q zHvZ(u`5A58h?+G&GVsA;pQNNPFI)U@O`#~RjaG(6Y<=gKT2?1 z*pCUGU)f??VlyP64P@uT`qh?L03ZQyLOBn?EKwH+IG{XvTh5|NldaSV_n~DK&F1aa znq~C_lCQHMfW6xib%a2m!h&%J)aXb{%-0!HCcW|kzaoSwPMhJ6$KL|F~Sx(tctbwfkgV;#KZlEmJN5&l5XF9eD;Kqb<| z>os)CqC^qF8$be|v;)LY{Gh@c0?a??k7M7&9CH+-B)t&T$xeSzCs30sf8O-+I#rq} z&kZj5&i>UyK9lDjI<*TLZ3USVwwpiE5x8<|{Db z3`HX3+Tt>1hg?+uY{^wC$|Tb7ud@3*Ub?=2xgztgv6OOz0G z-4VRyIChHfegUak^-)-P;VZY@FT64#xyo=+jG<48n2%wcx`ze6yd51(!NclmN=$*kY=#uu#>=yAU-u4I9Bt0n_6ta?&9jN+tM_5_3RH);I zxTN4n$EhvKH%TmOh5mq|?Cx$m>$Ed?H7hUEiRW^lnW+}ZoN#;}aAuy_n189qe1Juk z6;QeZ!gdMAEx4Na;{O*j$3F3e?FLAYuJ2iuMbWf8Ub6(nDo?zI5VNhN@ib6Yw_4P)GY^0M7TJwat z2S*2AcP}e0tibZ@k&htTD&yxT9QRG0CEq$;obfgV^&6YVX9B9|VJf`1aS_#Xk>DFo zwhk?~)>XlP5(u~UW0hP7dWZuCuN4QM24Td&j^7~)WQ6YeCg)njG*ri}tTcG-NxX}p zNB>kcxd5ipW@tN3=6r@Jgm#rgrK*dXA!gxy6fAvP7$)8)Vc~PPQ|`( zPy|bG1sUz958-!zW^j(8ILV%QC@x`~PDFczboZqWjvSU<9O3!TQ&xYi%?Y0AiVBLV z%R?#1L#G&xw*RZPsrwF?)B5+MSM(b$L;GLnRsSU!_$N;6pD97~H}`c>0F`&E_FCNE z_)Q*EA1%mOp`z>+h&aqlLKUD9*w?D>stDeBRdR*AS9)u;ABm7w1}eE|>YH>YtMyBR z^e%rPeZzBx_hj?zhJVNRM_PX(O9N#^ngmIJ0W@A)PRUV7#2D!#3vyd}ADuLry;jdn zSsTsHfQ@6`lH z^GWQf?ANJS>bBO-_obBL$Apvakhr1e5}l3axEgcNWRN$4S6ByH+viK#CnC1|6Xqj& z*_i7cullAJKy9GBAkIxUIzsmN=M|(4*WfBhePPHp?55xfF}yjeBld7+A7cQPX8PE-|Pe_xqboE;2AJb5ifrEfr86k&F0+y!r`-urW}OXSkfz2;E``UTrGSt^B)7&#RSLTQitk=mmPKUKP`uGQ4)vp_^$^U`2Jjq zeul!ptEpa%aJo0S(504oXPGdWM7dAA9=o9s4-{>z*pP zJ31L#|L?YR;^%+>YRJrLrFC=5vc;0{hcxDKF z!ntmgO>rVDaGmRpMI7-+mv(j~;s_LARvcpkXj|{GHu1c<1 zKI)#7RE~Dizu1lG>p-PcY2jX#)!oJlBA$LHnTUWX=lu``E)vhf9h4tYL-juZ`e|Kb z=F?C;Ou)h^cxB;M-8@$ZSH0jkVD>x-XS$ePV1vlU8&CG))4NgU(=XFH=Jb1IB7dBysS+94}Y>sjS(&YcJwhn zifzA|g$D5rW89vkJSv()I+Th4R&C$g-!CB30xkh%aw4po3$@DK2fW>}enE2YPt&{C~j}`>RYICK{ zYAPfZ&%`R}u6MYo<>d`^O#Q(dM{3>T^%J{Vu;lr#Utg4x9!Z9J%iXs(j+dn&SS1_2 zzxGtMnu^`d%K4Xq4Ms-ErG3_7n?c(3T!?rvyW=G<7_XKDv*ox`zN*^BVwUoqh{D7o zdEiq;Zp6}k_mCIAVTUcMdH|fo%L#qkN19X$%b1#Oko|u4!M*oRqdBa3z98{H#g=d%5X&D#NXhLh`nUjxi8@3oo(AgeItdJ zIrt9ieHI1GiwHiU4Cba-*nK@eHI4uj^LVmVIntU@Gwf^t6i3{;SfLMCs#L;s;P4s5oqd^}8Uil!NssP>?!K z07nAH>819U=^4H6l-Dhy`^Q6DV^}B9^aR0B%4AH=D&+dowt9N}zCK+xHnXb-tsKaV6kjf;Wdp#uIZ_QsI4ralE>MWP@%_5eN=MApv92( z09SSB#%eE|2atm9P~X2W2F-zJD+#{q9@1}L2fF|Lzu@1CAJq*d6gA8*Jjb;<+Asih zctE|7hdr5&b-hRhVe}PN z$0G{~;pz1yhkbwuLkfbvnX=<7?b(1PhxAmefKn$VS6Sv)t-UypwhEs3?*E=(pc%Dlul1V~OdWvdf z{WBX?lhfO_g$$X~hm^Bhl@U0t<|beYgT)2L_C(z@B^-63c9Ak2*Aa)iOMylfl|qyNQdO#yoJ?m2FOkhZ1ou@G%+^m z#!#(gTv8nx^34(HddDp|dcFl@&eh+&FFJc@^FL3fV2?u&9Wt|Yp3&MS)e+ez0g~Ys zY7d0n^)+ z0@K^GJTLN?XAV(0F6e>o>HCGJU5(8WsSFErs0FsO=O1u$=T~xx7HYK{7C>-IGB8U+ z&G^Vy>uY}Bq7HX-X`U^nNh+11GjG-)N1l_tG<^4Tu4+4X9KO9IrdH+eXGk|G6Tc(U zU~g7BoO!{elBk>;uN-`rGQP-7qIf9lQhj-=_~0Qyszu>s$s0FrJatSylv!ol&{29~ z7S4fv&-UBOF&cR@xpuW*{x9$R;c_ALt?{+dI&HoBKG-!EY{yE=>aWhlmNhHlCXc(B zuA-zI*?Z9ohO$i8s*SEIHzVvyEF$65b5m=H*fQ)hi*rX8 zKlPqjD*Ix1tPzfR_Z3bO^n32iQ#vhjWDwj6g@4S?_2GyjiGdZZRs3MLM zTfl0_Dsn=CvL`zRey?yi)&4TpF&skAi|)+`N-wrB_%I_Osi~)9`X+`Z^03whrnP7f z?T`*4Id`J@1x#T~L(h5^5z%Cok~U|&g&GpCF%E4sB#i3xAe>6>24%Kuu=)=HRS;Pu2wghgTFa zHqm#sa{7-~{w_039gH0vrOm&KPMiPmuPRpAQTm5fkPTZVT&9eKuu%Riu%-oMQl2X6 z{Bnx`3ro^Z$}rVzvUZsk9T)pX|4%sY+j0i)If_z-9;a^vr1YN>=D(I7PX){_JTJ&T zPS6~9iDT{TFPn}%H=QS!Tc$I9FPgI<0R7?Mu`{FTP~rRq(0ITmP1yrJdy|m;nWmDelF-V^y7*UEVvbxNv0sHR?Q=PVYRuZinR(;RjVAG zm&qlSYvaiIbVEqBwyDaJ8LVmiCi{6ESF4pO?U&7pk&CASm6vuB;n-RauPFzdr!C%1 z8pjdSUts7EbA4Kg(01zK!ZU<-|d zU&jWswHnSLIg&mTR;!=-=~z(#!UsXt%NJR|^teM8kG@8Qg_0^6Jqfn&(eENtP8D7K zvnll3Y%7yh1Ai~0+l6dAG|lEGe~Oa+3hO>K2}{ulO?Vf*R{o2feaRBolc;SJg)HXHn4qtzomq^EM zb)JygZ=_4@I_T=Xu$_;!Q`pv6l)4E%bV%37)RAba{sa4T*cs%C!zK?T8(cPTqE`bJ zrBWY`04q&+On`qH^KrAQT7SD2j@C>aH7E8=9U*VZPN-(x>2a++w7R$!sHH+wlze2X)<<=zC_JJvTdY7h&Jum?s?VRV)JU`T;vjdi7N-V)_QCBzI zcWqZT{RI4(lYU~W0N}tdOY@dYO8Rx5d7DF1Ba5*U7l$_Er$cO)R4dV zE#ss{Dl`s#!*MdLfGP>?q2@GSNboVP!9ZcHBZhQZ>TJ85(=-_i4jdX5A-|^UT}~W{CO^Lt4r;<1ps@s|K7A z90@6x1583&fobrg9-@p&`Gh+*&61N!$v2He2fi9pk9W2?6|)ng7Y~pJT3=g~DjTcYWjY9gtZ5hk*1Qf!y2$ot@0St$@r8|9^GMWEE>iB~etL zXYxn#Rvc`DV&y93@U$Z91md1qVtGY*M(=uCc}@STDOry@58JNx`bUH}EIb(n6I}i? zSYJOZ2>B6&Payu+@V!gxb;)_zh-{~qtgVwQ-V;vK7e0^Ag_$3+g+{xSVudVOY_p-R z$sXhpFSk7je2lk5)7Y2;Z847E1<;5?;z(I)55YFtgF!J;NT|eVi}q^*2sM}zyM{+s zD0phl+J>k1E7cZEGmP?1-3~RE;R$q(I5}m?MX8xi?6@0f#rD8Cjkpv1GmL5HVbTnM zAQ&4-rbkpdaoLp~?ZoW>^+t0t1t%GO2B;ZD4?{qeP+qsjOm{1%!oy1OfmX?_POQJ4 zGwvChl|uE;{zGoO?9B_m{c8p(-;_yq?b^jA({}iQG35?7H7`1cm`BGyfuq7z1s~T| zm88HpS{z54T{jxC=>kZ=Z#8G@uya3tt0$xST5V$-V<;6MA66VFg}`LLU8L=q3DmkU z)P^X8pg`ndMY*>gr{6~ur^Q@Z8LNQf*6wkP03K<|M*+cDc#XKZ`Z0$1FkI-IDRw#| za52W4MyHlDABs~AQu7Duebjgc}02W;1jgBx&I@TMDXU`LJutQ?@r%1z`W zlB8G-U$q37G1ob>Er8j0$q@OU3IwG#8HsvJM#)j=Y%~#zY`jaG%5;!(kY3*a^t>(qf6>I zpAJpF%;FQ?BhDSsVG27tQEG*CmWhl4)Ngp%}D?U0!nb1=)1M==^B)^$8Li$boCY$S4U;G^A!?24nSYHra{< zSNapX#G+0BTac|xh`w&}K!);$sA3ay%^a2f?+^*9Ev8ONilfwYUaDTMvhqz2Ue2<81uuB71 zAl|VEOy%GQ7zxAJ&;V^h6HOrAzF=q!s4x)Mdlmp{WWI=gZRk(;4)saI0cpWJw$2TJcyc2hWG=|v^1CAkKYp;s_QmU?A;Yj!VQ1m-ugzkaJA(wQ_ zah00eSuJg<5Nd#OWWE?|GrmWr+{-PpE_Dbqs&2`BI=<%ggbwK^8VcGiwC-6x`x|ZY z1&{Vj*XIF2$-2Lx?KC3UNRT z&=j7p1B(akO5G)SjxXOjEzujDS{s?%o*k{Ntu4*X z;2D|UsC@9Wwk5%)wzTrR`qJX!c1zDZXG>-Q<3Z)7@=8Y?HAlj_ZgbvOJ4hPlcH#Iw z!M-f`OSHF~R5U`p(3*JY=kgBZ{Gk;0;bqEu%A;P6uvlZ0;BAry`VUoN(*M9NJ z%CU2_w<0(mSOqG;LS4@`p(3*Z7jC|Khm5-i>FcYr87};_J9)XKlE}(|HSfnA(I3)I zfxNYZhs#E6k5W(z9TI2)qGY&++K@Z?bd;H%B@^!>e2Wi@gLk)wC)T93gTxdRPU7uh z)`$-m(G2I5AuK52aj!fMJR|d^H?0X~+4xSpw zqNRtq5r8hic*{eAwUT<=gI5uXLg)o5mg4XnO^T+Rd+{l)<$Aqp{+RxhNYuX^45W0k z5$t%+7R;dX$`s6CYQYcims>5bNt+k&l_t%C9D-6sYVm%Y8SRC#kgRh*%2kqMg2ewb zp_X*$NFU%#$PuQ@ULP>h9Xw`cJ>J-ma8lU`n*9PcWFpE%x0^}(DvOVe2jz@ z0^2QOi0~t!ov?jI{#bw~`Aj5ymQW@eruRg`ZNJ5IT5_5AHbQ?|C>_7rwREf2e2x&L zlV8xdOkp_*+wdaqE?6bmdrFfaGepcj=0AI<+c=Tg^WB9BhFx?SvwoVdTEm&zPy@Vs zPs2mVPiw1n_h?Xi6!+w)ypsFXXuM>gIY(J+1N6r!sJ{+r1%BzRF20!D;bN>L^?O8n z(5|x2p^Q6X`!pm3!MMFET5`nJXn>tK`fFAj5Eo&t6;F>TU_4G93YGyzvF2_fB& zfE8(dq?R@@&Wh8~%G~rDt1+e)96O5)by_%;G~Zv`TpmZ)vY@BkAan*zEy(s`*{-@U z;$WPjoNx~m?`6Z;^O=K3SBL3LrIxfU{&g)edERkPQZK!mVYU-zHuV0ENDq^e<-?^U zGyRcrPDZZw*wxK(1SPUR$0t0Wc^*u_gb*>qEOP102FX|`^U%n*7z=wM@pOmYa6Z=-)T%!{tAFELY2`dTl3$&w! z7sgKXCTU(h3+8)H#Qov19%85Xo+oQh?C-q0zaM_X2twSCz|j_u!te3J2zLV#Ut_q7 zl+5LGx#{I`(9FzE$0==km|?%m?g~HB#BSz2vHynf1x14mEX^~pej*dhzD|6gMgOJ_ z8F_<>&OIz;`NSqrel?HI-K(|ypxwz}NtX!CF3&T(CkuYOnKS&%lUSU44KsgS`L>!w zl{MoT4`t=+p8>@88)Ea%*hOIkxt#b4RfrwRMr91UF_Ic~kV;|+dRW0a8Vl725+gsvtHr5 z>?3fai&9NmU|3;-nAu8OB|<(-2Kfub4MX&1i}dDd=R~Dk=U-Vr=@&lfEIYU~xtHHO z4TKt=wze`qm=69lD)sOOkZ;$9=0B#*g@X6xPM-%zG*rCXkN%eRDEUp$gAaEd29t&T zRTAg##Sk+TAYaa(LyTD__zL3?Z+45^+1o}(&f<~lQ*-z7`Um^>v@PKqOunTE#OyKFY^q&L^fqZgplhXQ>P3?BMaq6%rO5hfsiln7TppJ z>nG9|2MmL|lShn4-yz0qH>+o;Fe`V!-e*R0M|q~31B=EC$(bQZTW^!PrHCPE4i|>e zyAFK!@P}u>@hqwf%<#uv*jen5xEL|v!VQEK!F`SIz_H8emZfn#Hg}}@SuqPv+gJ@- zf3a`DT_Q#)DnHv+XVXX`H}At zmQwW2K`t@(k%ULJrBe6ln9|W8+3B*pJ#-^9P?21%mOk(W1{t#h?|j0ZrRi_dwGh#*eBd?fy(UBXWqAt5I@L3=@QdaiK`B_NQ$ zLXzm{0#6zh2^M zfu>HFK^d`&v|x&xxa&M|pr))A4)gFw<_X@eN`B1X%C^a{$39fq`(mOG!~22h)DYut z(?MONP1>xp4@dIN^rxtMp&a^yeGc8gmcajyuXhgaB;3}vFCQFa!pTDht9ld9`&ql`2&(dwNl5FZqedD^BP zf5K1`(_&i7x-&rD=^zkFD87idQrk(Y?E;-j^DMCht`A8Qa5J-46@G_*Y3J+&l{$}*QCATEc9zuzaQGHR8B;y*>eWuv)E##?Ba3w= zZ|v(l{EB`XzD#|ncVm#Wy?#Nzm3bS1!FJ70e{DGe$EgNDg7<_ic^mJSh&Xc|aTwCrTv;XkW~UlS&G%KyLklCn}F^i(YP(f z{cqH%5q9ND_S;l$HRP$Q@`D=F*_1$CXIA5X@|V&Vir$NQ$vCx!b&LGCR<-2y)m%HI zxeeyQIjiWcf4uD9+FP+EJ`&$oJ%$R(#w~GjqP|aTQj#d(;l#rq$vcM&Y4ZQ_i{Kpx z?k2BtoKb?+1-EVmG^ne-W%8+y?i#J5N5g8f^qpH5(ZZp7$u+?I9GB+&MREX?TmVV$ zA}Ps=^CkD^sD9N;tNtN!a>@D^&940cTETu*DUZlJO*z7BBy`Rl;$-D@8$6PFq@tz0 z=_2JMmq-JRSvx`;!XM|kO!|DENI-5ke8WR*Zj#vy#Nf1;mW-{6>_sCO8?sVWOKDM| zR(iaZrBrzlRatUzp_Y|2nOXnY2G%WLGXCo9*)th_RnXvXV=q;WNAimI98!A54|$&OCCG%$4m{%E&o?S|Qx<4K~YGmM1CS!vZAzLN%d znbZsw6ql=XkiwSbNofNeA42q8#LH6Rk(u@z172O#6K>Sb{#`t#GUgpd{2;D(9@I_9 zwsY(6Go7RmOThs2rM3|Z#Vbs}CHPLgBK6gE8;XkJQDx~p5wJ?XkE(0<^hwnt6;$~R zXCAzMfK@`myzdkkpv*ZbarVwCi&{-O#rswrb-#x4zRkxfVCq;mJLic|*C92T?0CYv z)FCqY$xA(QZmggPocZqQj0Rc?=Afna`@fpSn)&nSqtI}?;cLphqEF3F9^OZfW9@HDunc^2{_H)1D9(O}4e zJMi_4(&$CD{Jf5&u|7#Iq*F~)l!8pAzNrX^<&wfEu~}Ipslzx=g^ff2?B9SnV=!$ zv&K0`hMN6BVIusHNX-lr`#K?OG1S*S4rCQaI3ea(!gCl7YjxJ3YQ)7-b&N*D8k><*x|47s3; z4f~WTWuk|Qd*d*DICV}Vb0YSzFZp5|%s4}@jvtTfm&`|(jNpajge zD}@CMaUBs+b?Yu6&c#18=TxzMCLE76#Dy=DLiq_a_knQX4Uxk$&@3ORoBFK_&a>`QKaWu^)Hzrqz{5)?h3B_`4AOn{fG9k zEwnjQb>8XRq!k?rmCd6E**1cY#b9yczN4mD%GLCeRk}{TmR1*!dTNzY;(f!B0yVuk zSjRyf;9i@2>bdGSZJ=FNrnxOExb075;gB z*7&YR|4ZraFO#45-4h%8z8U}jdt?83AmU3)Ln#m3GT!@hYdzqqDrkeHW zU#R`Z8RHq996HR=mC}SRGtsz07;-C-!n*ALpwwBe~loM)YqMH)Um$sH0RbTTzxFd)h1=-w5Yl3k|3nQ zZG>=_yZ7Lsn=b8_MZI+LSHLGYSSCc?ht~7cv#39>Moz6AS}5 zus?xge0PGdFd2FpXgIscWOyG}oxATgd$yl0Ugf_&J_vwt`)XWx!p*gE_cWU(tUTnz zQS}!bMxJyi3KWh^W9m zxLcy``V@EfJzYjK@$e7Yk=q!kL8cd3E-zpc*wwvGJ62O!V;N zFG7Y?sJ+^a%H1;rdDZRu2JmGn6<&ERKes=Pwx)GG-nt73&M78+>SOy!^#=gvLB)2H zjv!J0O`-zft|0Jv$3k5wScY)XB+9leZgR5%3~HtZA=bCg7=Dn+F}>2lf;!*1+vBtf z9jhmqlH=t5XW{0MC7Y~O7jaju&2`p!ZDLGlgnd~%+EJ%A#pIByi-+EOmoLVoK&ow8 zTDjB%0hxhiRv+O3c2*y00rMA=)s|3-ev7emcbT43#izku7dvaDXy1IMV0ahjB9yzi z9C9fN+I2Mzt1*{`a6B?+PdWHiJ5fH}rb2t>q)~3RfCxmyK^y5jN7Pn(9DFh61GO%p zuBErj=m|bDn_L8SINU)Z&@K*AgGz+SUYO_RUeJt=E0M+eh&kqK;%Y1psBNU<4-s9# ziHFr7QP6Ew=-2CdfA#Bf|EsctH;<&=Hsd>)Ma8NvHB$cpVY@}TV!UN}3?9o@CS5kw zx%nXo%y|r5`YOWoZi#hE(3+rNKLZ2g5^(%Z99nSVt$2TeU2zD%$Q(=$Y;%@QyT5Rq zRI#b><}zztscQaTiFbsu2+%O~sd`L+oKYy5nkF4Co6p88i0pmJN9In`zg*Q;&u#uK zj#>lsuWWH14-2iG z&4w{6QN8h$(MWPNu84w1m{Qg0I31ra?jdyea*I~Xk(+A5bz{x%7+IL}vFDUI-Rf{! zE^&Dau9QxA2~)M98b42(D6Q}2PUum0%g>B?JS?o~VrP+Go2&c-7hIf7(@o1*7k$zS zy@o5MEe8DoX$Ie(%SZByyf9Xf9n8xkoX}s6RiO1sg*kAV^6EAAz$>*x^OmIy!*?1k zG+UQ|aIWDEl%)#;k{>-(w9UE7oKM#2AvQud}sby=D7$l6{$}SE8O9WgHM_+ zJ?tHeu@Pi93{AuwVF^)N(B~0?#V*6z;zY)wtgqF7Nx7?YQdD^s+f8T0_;mFV9r<+C z4^NloIJIir%}ptEpDk!z`l+B z5h(k$0bO$VV(i$E@(ngVG^YAjdieHWwMrz6DvNGM*ydHGU#ZG{HG5YGTT&SIqub@) z=U)hR_)Q@#!jck+V`$X5itp9&PGiENo(yT5>4erS<|Rh#mbCA^aO2rw+~zR&2N6XP z5qAf^((HYO2QQQu2j9fSF)#rRAwpbp+o=X>au|J5^|S@(vqun`du;1_h-jxJU-%v| z_#Q!izX;$3%BBE8Exh3ojXC?$Rr6>dqXlxIGF?_uY^Z#INySnWam=5dV`v_un`=G*{f$51(G`PfGDBJNJfg1NRT2&6E^sG%z8wZyv|Yuj z%#)h~7jGEI^U&-1KvyxIbHt2%zb|fa(H0~Qwk7ED&KqA~VpFtQETD^AmmBo54RUhi z=^Xv>^3L^O8~HO`J_!mg4l1g?lLNL$*oc}}QDeh!w@;zex zHglJ-w>6cqx3_lvZ_R#`^19smw-*WwsavG~LZUP@suUGz;~@Cj9E@nbfdH{iqCg>! zD7hy1?>dr^ynOw|2(VHK-*e%fvU0AoKxsmReM7Uy{qqUVvrYc5Z#FK&Z*XwMNJ$TJ zW1T**U1Vfvq1411ol1R?nE)y%NpR?4lVjqZL`J}EWT0m7r>U{2BYRVVzAQamN#wiT zu*A`FGaD=fz|{ahqurK^jCapFS^2e>!6hSQTh87V=OjzVZ}ShM3vHX+5IY{f^_uFp zIpKBGq)ildb_?#fzJWy)MLn#ov|SvVOA&2|y;{s;Ym4#as?M^K}L_g zDkd`3GR+CuH0_$s*Lm6j)6@N;L7Vo@R=W3~a<#VxAmM&W33LiEioyyVpsrtMBbON+ zX^#%iKHM;ueExK@|t3fX`R+vO(C zucU#Xf>OjSH0Kd%521=Sz%5Y!O(ug(?gRH@K>IUayFU~ntx`Wdm27dB-2s@)J=jf_ zjI-o;hKnjQ|Lg~GKX!*OHB69xvuDU zuG-H48~inKa)^r539a{F)OS`*4GShX>%BR)LU~a-|6+sx&FYsrS1}_b)xSNOzH|Kv zq>+1-cSc0`99EsUz(XWcoRO)|shn>TqKoQBHE)w8i8K`*Xy6(ls%WN_#d}YC^)NJ; zzl8!Zduz^Gg8*f0tCWnLEzw6k5Fv!QWC1x4)3r}+x~@#O8_)0>lP-@3(kFwLl%%Mz(TpATVnL5Pl2Gahw45QXI~>Hrw))CcEs@PP?}4^zkM$ z@(?H6^`Jl?A=(&Ue;W0`*a8&fR7vde@^q^AzX^H#gd~96`Ay^_A%?;?@q@t7l7iGn zWms#2J|To4;o1?3g3L!K_chdtmbEg~>U>$5{WO@Ip~YE&H($(^X6y_OBuNHkd0wu= z4rXGy#-@vZ?>M<_gpE8+W-{#ZJeAfgE#yIDSS?M?K(oY@A|FaS3P;OjMNOG% zGWyZWS(}LJCPaGi9=5b%sq$i!6x@o(G}wwfpI5|yJe24d_V}cT1{^(Qe$KEMZ;>I@ zuE6ee%FLgem>CKEN8SeY)fpK#>*lGcH~71)T4p|9jWT;vwM@N!gL}nCW=Oi6+_>K2 zl4sWXeM1U}RETA~hp=o3tCk+?Zwl#*QA>Wwd|FlUF0)U;rEGPD1s0Syluo zfW9L(F>q9li8YKwKXZrp*t)N9E;?&Hdbm-AZp2BcDTHO6q=tzVkZsozEIXjIH`tm} zo2-UleNm*Lj7zgvhBph_|1IggkSuW~S(9ueZEfao8BuzqlF(a+pRivTv(Zb zXFaHwcuovdM#d+!rjV7F<^VW&@}=5|xj!OUF)s0zh|8yzC)7!9CZB+TLnycoGBsDF z$u&j={5c(4A$iik;x6_S96Krw8--+9pGY+*oSVTIuq;$z8*)W8B~rMX_(U6uM}!Gc`T;WfEKwI84%)-e7j}>NA(O_)3Vn9 zjXxY1Fnx3Fx%CFpUHVu0xjvxgZv}F9@!vC!lD|05#ew3eJ}@!V&urwRKH`1f{0e^o zWvM1S@NbI6pHdzm33pza_q;#?s%J*$4>10uYi4l%5qi|j5qh+D=oqSJR=7QwkQh>>c$|uJ#Z@lK6PMHs@ zyvnnoOSkGQkYz#g>||xN&1fV)aJb*y--Y`UQV~lt!u8yTUG59ns1l7u>CX2F>9fl; zB)zH3z^XHmSU{F_jlvESvaNL&nj^;j)29~1LcTYw>(6}>bt0hiRooqm0@qTj%A&P9 zKmexPwyXG@Rs1i+8>AJ;=?&7RHC7Mn%nO>@+l?Qj~+lD376O2rp)>tlVHn8MKq zwop1KRLhUjZ|+6ecGIAftSPT*3i94=QzYCi_ay+5J&O(%^IsqZ!$w-^bmd7ds$^!q z;AkC;5mTAU>l0S$6NSyG30Ej?KPq@#T)^x#x?@U~fl2m$Ffk)s6u|iPr!)-j0BlA7p3E*A|My8S#KH;8i-IQq7Q*F4*ZVPe<{^SWz_ zr?!6cS+@|C#-P~d#=W1n7acn8_pg#W-lcyf+41zwR+BU6`jUkP^`*wgX)FxEaXzoi z8)?FE*97Yqz|b@fR1(r{QD363t260rQ(F||dt9^xABi+{C*_HL9Zt5T;fq|#*b}=K zo5yj_cZB(oydMAL&X(W6yKf>ui?!%(HhiHJ83EA|#k0hQ!gpVd( zVSqRR&ado+v4BP9mzamKtSsV<|0U-Fe2HP5{{x&K>NxWLIT+D^7md{%>D1Z-5lwS~ z6Q<1`Hfc+0G{4-84o-6dr@)>5;oTt|P6jt9%a43^wGCslQtONH)7QXJEYa!c~39 zWJpTL@bMYhtem1de>svLvOUa*DL7+Ah0(_~2|ng`!Z!qiN}6xL;F}<%M8qWv&52-Y zG*1A&ZKlp~{UFV%Hb_*Re({93f7W*jJZMV-Yn|<+l3SPN+%GuPl=+tSZxxr%?6SEc zntb0~hcK691wwxlQz_jSY+V_h+0o`X!Vm{;qYK$n?6ib1G{q>a%UejzOfk6q<=8oM z6Izkn2%JA2E)aRZbel(M#gI45(Fo^O=F=W26RA8Qb0X;m(IPD{^Wd|Q;#jgBg}e( z+zY(c!4nxoIWAE4H*_ReTm|0crMv8#RLSDwAv<+|fsaqT)3}g=|0_CJgxKZo7MhUiYc8Dy7B~kohCQ$O6~l#1*#v4iWZ=7AoNuXkkVVrnARx?ZW^4-%1I8 zEdG1%?@|KmyQ}tploH>5@&8Cp{`)CxVQOss&x|Z7@gGL3=tCVNDG!N9`&;N$gu^MDk|`rRm=lhnXAJ5v1T)WTz)qvz|Dw zR?{}W4VB(O6#9%o9Z^kFZZV*PDTAWqkQ8TH!rti8QIcR&>zcg3qG}&A( zwH^K8=`1C1lRfhrX{IvNn9R9!$UMC%k(;;VH%`S0h_on|Gh6qDSH&#}*m-u{;p~WB zF$_I~xx!RxVrxNQdr@3T>{F#^D{@N9OYC9LsV62F_Z1KYQ5yk*C5WQ4&q}Kz(I{9UWWf?LIcCZicB1EO_FUH*a9QKS(4IR%#D5DTi_@M}Q_-4)J4d zz@!vR0}5MPAOK(#uL+$7XOcP$5SS#*EK9Rt6XN%}HB7@`8S^gNRk!HLv(CvCjX4o= z>9scPwWbE!F8T=@x9^;s-OF2!eO(!gL9$-AmzUiDnu&QS4If5ea2T070n1-IyNhck z9$J8b!he3@q5qB-cQ;5ymVIXXn46kK0sqKZV+3s3^mac=3~BrCW})WNrrRs1KtMmg zLzwXYC?@_H#s3W4D$W0rh%WL|G<1$$uYdptPbxy0ke!c%v#x9I=2?S)YVkg1X$W^cB!i>B{e9wXlm8AcCT8|verIZQngj>{%W%~W0J%N`Q($h z^u3}p|HyHk?(ls7?R`a&&-q@R<94fI30;ImG3jARzFz<(!K|o9@lqB@Va+on`X2G) zegCM8$vvJ$kUwXlM8df|r^GQXr~2q*Zepf&Mc%kgWGTf;=Wx%7e{&KId-{G}r22lI zmq%L6Y-M*T$xf8 z#kWOBg2TF1cwcd{<$B)AZmD%h-a6>j z%I=|#ir#iEkj3t4UhHy)cRB$3-K12y!qH^1Z%g*-t;RK z6%Mjb*?GGROZSHSRVY1Ip=U_V%(GNfjnUkhk>q%&h!xjFvh69W8Mzg)7?UM=8VHS* zx|)6Ew!>6-`!L+uS+f0xLQC^brt2b(8Y9|5j=2pxHHlbdSN*J1pz(#O%z*W-5WSf# z6EW5Nh&r<;$<3o1b013?U$#Y!jXY)*QiGFt|M58sO45TBGPiHl4PKqZhJ|VRX=AOO zsFz-=3$~g#t4Ji9c;GFS9L~}~bzgCqnYuJ-60AMDdN7HZt8_$~Of{oXaD3HVn9zkH z`>#xQNe=YpWTq_LcOoy}R`L<_4il7w4)QH4rl?AUk%?fH##I>`1_mnp&=$-%SutYT zs}sSNMWo;(a&D()U$~PG0MvZ#1lmsF&^P4l_oN#_NORD-GSmR{h_NbJ^ZdY#R9#qW zKAC%V*?y~}V1Zh#d|-z1Z8sy5A+}*cOq$xk@Pn&{QffzG-9ReyPeEhqF%~Z3@|r(s z3(wA&)dV~fELW*&*=!~l9M=7wq8xE(<@)BjjN8bUiS8@N9E{wi+Dd!V1AtT;Nl}9> zTz`2ge2Jn#Dlg1kC%oFlOe<>?jYC`Asr^%i4hH;S`*qZTPRan2a9Kjj=0aq{iVi2Z z87PZt$d(LAm_{92kl+2Z%k3KGV;~gsp;C>k?gMYZrVIzaI|0D+fka9G_4v>N96*8T zI(C8bj?A7l%V&U?H_IpSeCvf7@y1e?b>G7cN382GVO0qAMQ93(T*<*9c_;%P1}x2l zi8S$s<=e_8ww%DaBAf4oIQ7}U7_48$eYpo}Fb+F|K|43IAPR1y9xbqPPg6er{I7xj|=>-c%pGBRLn1~=5KbAb1mJAx=z(loN!w{49VkEthF>*OX z)=gqXyZB5%5lIWYPWh~{!5pSt43-)-@L@x=pmiuKP-3Cwq8qSxGNwaTT4->BWEjxk zUjr)z7WrBZB5u3iV>Y_>*i~*!vRYL)iAh5hMqNzVq1eeq=&d9Ye!26jks{f~6Ru&c zg$D;^4ui#kC`rSxx`fP!zZ^6&qSneQzZRq0F*V4QvKYKB<9FC%t#)Tik%Zq*G*IOW z3*`2!4d)!3oH>GxVcXlorJDt+JnH)p{~olYBPq|>_V@8=l#(f*diW=L+%>rfWCcPQ z#H^ksQt15Z5Uc4ODq8_JwD5^H&OGqyH6E@MabJQO>s`?bqgA6}J_QpytW{2jH#eCN z8k7y*TFZ2lj2B|1CB(@QZedFfPhX|IQbKMI;$YK>9Zla0fsU7}an6(kP;sXpBWLR` zJ#z_kk!`JJC7h(1J!+G)gL2WB2&0*~Q!%s??}GH?=`hU@03xOwU} z6s7?tGySLz!%(MwxQRiF)2(vR2wQX`YB}u&I-S+RR)LQcyH407#-{*pWLJJR?X|5 zsAl2k{&0N-?JArn@)9YTo-5+gl}R~XkbZM*5AOjPrcikpE3P?p0oN^?H+5+n)}Qxe z*RQ!-eu0RxPyF8B=}xnseNpQMXFU$d^=(G%kUd&|!BHSm7bXoGR$WA+%yjuA{|S>u z?9N6JDhS+ui~rd?wY_t7`p)|qKIMM>6jz%$jv4hc_YUDjF6-%5muq|SNuoji2)|qK zNY5+oWMe+5vu{I*grk6xlVk;(J)uuy13G`VDbj(~Vz9lA)_;$aj?=-cmd#h~N0mn{ z9EIS_d4C=L3H;Pl^;vcpb&-B+)8vt%#?gn5z>#;G{1L&8u8cXJYADMUsm9>%*%)&F zsi&I{Y=VUsV82+)hdNgDWh^M7^hMs|TA0M269^|RIGfdX1MetV2z`Ycb&_Mn4iRI! zeI6O}O9mOhN6pzfs5IfMz#Gxl`C{(111okA8M4gijgb~5s7QTyh84zUiZZ^sr1^ps z1GO`$eOS@k@XP^OVH|8)n}Wx)fKHoGwL&5;W?qEf5Jdsd!3hf7L`%QNwN0gGBm^2= z@WI+qJMJG1w2AS9d@Dt$sj_P$+S2kh7+M72^SfcdBjQEtWQ5?PT&a~G9hOo6CtS>h zoghqoR;sk{X)`ZK-M|lu{M}0>Mrs^ZW@ngC?c$26_vYKDBK^n7sFiod_xV#XcPL!^ zRPyqD{w^9u{oA3y73IW0 zH;%xop$r(Q=bq=JaLT%myEKD_2&?L@s6TzsUwE#g^OkiU6{lN)(7I?%a;_%r5_^@d zS-Z)Q-2o|~?F~f`sHlhNhiZk;!CW;3Ma6{xPlBjJx8PXc!Oq{uTo$p*tyH~ka`g<` z;3?wLhLg5pfL)2bYZTd)jP%f+N7|vIi?c491#Kv57sE3fQh(ScM?+ucH2M>9Rqj?H zY^d!KezBk6rQ|p{^RNn2dRt(9)VN_j#O!3TV`AGl-@jbbBAW$!3S$LXS0xNMr}S%f z%K9x%MRp(D2uO90(0||EOzFc6DaLm((mCe9Hy2 z-59y8V)5(K^{B0>YZUyNaQD5$3q41j-eX))x+REv|TIckJ+g#DstadNn_l~%*RBSss_jV3XS&>yNBc8H2jo(lwcLz-PuYp< z7>)~}zl$Ts0+RFxnYj7-UMpmFcw_H zYrsXM>8icD)@Iauiu_(Y#~Iyl)|pj@kHkWvg2N$kGG(W>Y)nfNn%z2xvTLwk1O2GQ zb^5KAW?c%5;VM4RWBy}`JVCBFOGQWoA9|+bgn7^fY3tSk1MSZccs9&Fy6{8F>_K@? zK(z=zgmq1R#jGE^eGV`<`>SP9SEBx!_-Ao|VZq6)-rUpd^<2GgVN&uHiM{0zA9kI( z<1^1%*uE$?4mXV@?W8}fvnBOpfwCo^?(a0E402!pZi&Kd5pp$oV%2Ofx<}YC-1mynB3X|BzWC_ufrmaH1F&VrU&Gs+5>uixj*OJ*f=gs9VR8k^7HRR$Ns|DYBc*Slz>hGK5B1}U+}#j0{ohGC zE80>WClD5FP+nUS?1qa}ENOPb2`P4ccI<9j;k?hqEe|^#jE4gguHYz-$_BCovNqIb zMUrsU;Fq%n$Ku_wB{Ny>%(B&x9$pr=Anti@#U%DgKX|HzC^=21<5Fn6EKc#~g!Mcj zJrI(gW+aK+3BWVFPWEF*ntHX5;aabHqRgU-Nr2t++%JRPP7-6$XS|M8o&YSgf3a9A zLW*tSJxoe1?#T4EocApa*+1kUIgy7oA%Ig9n@)AdY%)p_FWgF-Kxx{6vta)2X1O5y z#+%KQlxETmcIz@64y`mrSk2Z17~}k1n{=>d#$AVMbp>_60Jc&$ILCg-DTN~kM8)#o$M#Fk~<10{bQ>_@gU2uZE z*eN~mqqQC*wh{CI(!xvRQ^{jyUcvE~8N)S0bMA^SK@v;b7|xUOi63X~3Qc>2UNSD1) z7moi9K3QN_iW5KmKH>1ijU41PO>BvA6f1;kL)6io%^r>?YQ#+bB;)Rzad5;{XAJGeAT#FnDV0$w2>v|JeFIB zZ>8vmz?WVs78PuCDiHfb@D0Yi;2#%){*#?bY4dpta6dSjquGLcOw?Z{nxg98mN^4* zj&^!WMUQ_zFp+}B|G0vcNsk8(2u9(LAPk5ogKt%zgQ4^1#UCd;`-W#X8v{YyQ_m9g z8`jydw>>@1J{Q*q#5^cHVA~xR9LR3Hl@^bx)`IBKmj+Gmye36;xwL0>sS|mV+$~%b zC;2wEm&Ht3#6P|2Y0XQ+5t-aI)jn{o%&ZHWvjzEtSojFgXxNKO^e(RmM`gsJ4GrR8 zKhBtBoRjnH`mD$kT;-8ttq|iw?*`7iTF_AX<^Qe3=h8L^tqz$w$#Z@Z$`C579Jeeu ztr0z~HEazU&htfG@`HW!201!N(70hCd{%~@Wv)G*uKnJZ8>hFx`9LnYs;T>8p!`5T zx#aXXU?}B{QTV_Ux(EMzDhl-a^y^f5tRU;xnOQoN)pThr4M>-HU)As8nQ34-0*sab&z<2ye-D_3m&Q`KJJ|ZEZbaDrE%j>yQ(LM#N845j zNYrP)@)md;&r5|;JA?<~l^<=F1VRGFM93c=6@MJ`tDO_7E7Ru zW{ShCijJ?yHl63Go)-YlOW2n3W*x%w||iw(Cy>@dBJHdQl){bBVg{wmRt{#oXb9kaWqe{bJPmGE$$ z_0=cmD9dVzh<8&oyM8rK9F^bufW$Bj2cFhw&f*oKKyu$H{PI=Aqe^NL6B=dkMEAk& zE3y&F=x;e|!7kMn%(UX>G!OE$Y$@UyME#d;#d+WLmm@W@y!sboiIox^DZPB|EN<>7 z57xm5YWlFUGyF|{<*;b&Cqm+|DC8{rB9R@2EFHGL^NX*l#AcDpw6}bCmhY7!(Gv{s zm^eYNvzyJLQA#GhmL*oSt^Uulb5&ZYBuGJTC>Vm9yGaZ=Vd--pMUoDRaV_^3hE9b*Pby#Ubl65U!VBm7sV}coY)m zn1Ag^jPPLT93J{wpK%>8TnkNp;=a@;`sA7{Q}JmmS1bEK5=d@hQEWl;k$9M-PYX~S zayGm;P(Wwk23}JR7XM~kNqba`6!Z+Wt2|5K>g_j3ajhR>+;HF?88GBN!P; zr6sQ8YYpn%r^gbi8yYK7qx6U5^Tf<|VfcR$jCo`$VMVh_&(9w@O?|o3eRHq*e*#P z8-==G)D?vB3Zo~b-dkx8lg0^=gn`9FUy?ZzAfWQd>>@cyqF!sHQ_S&@$r&tTB~Lxq zAjAZTK~?J{A|L3)8K>S{`Qf%131B>?<~t=w!D{;olQ>#31R#{go`a9DOy+H*q5t+; z^*Ka!r@#8tk?~tQbylaG-$n#wP2VzIm3vjrZjcmTL zl`{6mhBhMKbSWoGqi;g3z1@G0q!ib`(Zz_o8HG_*vr8U5G|vhZn26h`f~bO&)RY0; zw(CWk*a_{ji_=O9U}66lI` zCm32)SEcAo5)5k>{<8DLI@Zz)*R29BB!^wF;WZRF9sAi39BGObmZzg?$lUn6w1rYPHSB^L4^AN zLObEaUh7TXpt6)hWck#6AZV(2`lze<`urGFre|>LUF+j5;9z%=K@&BPXCM)P$>;Xc z!tRA4j0grcS%E!urO^lsH-Ey*XY4m&9lK(;gJOyKk*#l!y7$BaBC)xHc|3i~e^bpR zz5E-=BX_5n8|<6hLj(W67{mWk@Bfc){NGAX z5-O3SP^38wjh6dCEDLB#0((3`g4rl}@I(&E8V2yDB=wYhSxlxB4&!sRy>NTh#cVvv z=HyRrf9dVK&3lyXel+#=R6^hf`;lF$COPUYG)Bq4`#>p z@u%=$28dn8+?|u94l6)-ay7Z!8l*6?m}*!>#KuZ1rF??R@Zd zrRXSfn3}tyD+Z0WOeFnKEZi^!az>x zDgDtgv>Hk-xS~pZRq`cTQD(f=kMx3Mfm2AVxtR(u^#Ndd6xli@n1(c6QUgznNTseV z_AV-qpfQ0#ZIFIccG-|a+&{gSAgtYJ{5g!ane(6mLAs5z?>ajC?=-`a5p8%b*r*mOk}?)zMfus$+W~k z{Tmz9p5$wsX1@q`aNMukq-jREu;;A6?LA(kpRut+jX?Tt?}4HGQr}7>+8z4miohO2 zU4fQ?Y8ggl%cj&>+M+)TTjn8(?^%`~!oAt#ri8gIbzIig$y#d7o##077fM9sCu%N9 zOIsq4vyox6`itu*j{eOD<$gTZd-$JuyM^cM>{?v<8# zS1yN%R0zRy&>+D*Gv-&S80?JF+Y|c^^IJWDnfy06MI2{NFO-x4JXsb@3Qp;EnL!a{ zJwKwV@mO zYVGvNmeJ!;+ce+@j@oo-+`DaPJX|h@7@4BD`QEdP?NKkYzdIa3KrZt%VUSsR+{b+| zk?dSd#9NnVl?&Y$A{-OtZ>wk%mWVF5)bf`)AA2{EFapIS4jil69Xan>*J^6Juou&`oJx|7-&|@8z?$ z2V#jm!UHstCE*qM{OGtqYY8q+x%SL6&aGY!a>@d=_G~^0;+7dY9P`oJ*)67*9Kx*O zKitC5V3g5;&L-fa37?eN=;V_c^L-ph_uKv5)Q`&!Z!RPlDWA2{J%a2q@_*?-cn@bH zIt)+mA@HaJj2RV+-MNc#y#Vji*N~m!ZyrYyg-7UK4PYK4F7Y$3Y%@Lk6iPp=I96N> z!;ih(KtZMB23*v{`5cJ}^4D*P!k1&OfU&1%borv_q|7jfaV7fL+wwx8Zp*b}B_O>NRSeJeM zpvw3M`=vSYjFYQ11kx1xqOnJ@degPh&SyXnWz-l719EiW17Yo?c~Bh~;R$MOl+jzV zM1yTq-1**x-=AVR;p0;IPi`#=E!G5qIT>EFE`Bn<7o*8!aVd7?(CZT=U9^Gi3rmWUQG z0|GaP9s$^4t_oLCs!fInyCoB(d?=tZ%%Bb2Y+X&7gvQ6~C4kU%e$W_H;-%XSM;&*HYYnLI z>%{5x_RtSUC~PI4C0H^>O%FixKYVubA>#72wexd}Cgwuw5ZYTvcN2ywVP(dO=5975 zCjo)mOa2Bo&ucEsaq8wi1{h*brT(H=XrTOy*P>?0%VV1QDr09X+Je!T)JT`02?gjX zT@B8}h|;4lH35Guq2gKZT?ags-~Ts~S=poPnQ_T1*?U|{$jaur_PjQ6WmF_(XLFG)d#|iiBC=&B zp}1eOQvQ!3UpL?K`=8hAzMkv#a^COr`J8i}d!BPX&*xp-LL#qse~mOtxI-}{yPRNV zJNTL1{7A55F~K>0e&Os%MwQ~?n1>QV=j!8o_`^-&*E|Q-L9DNr%#6sw8kQVE3E|*}$aAoO$@27ei1w=+zU%?AA!;mf#!%IV*w_D=u516!Kz1F0-WnyVB`I6F1Pc3r1=0iT<_(pCyk>@22z1$w$@M>7AIuk6+ zRG&MFVQ_7>5DLoR5HeOa$?2SA(v2u!#8;5I(ss%=x9U#R zU62n~&)22RTTsp${}6C&$+l&0skFVX%ACgc$(iQ#DVRRz!`Y+b>E?;ib(TH#6Wa=} zs(q_;SA|fhyEo7Ix%rAY9j=Ul^Rzd`3ABf+yO@~h@Rh=wo`?;8PdHE1AUo34r7izy znAr`;VavQueSu7bD5r^nXTERcW(P-{2SOSfF1x0cW1Nczvj0}@!!upORN1%_-b2bh zGt#zokJz&SveJRzlUK4DruxR(YuHEAmB%F}buU`*pAzJ7Mbgs4sg;H@&6x*wxvGm6 z>KH@ilsvvdl@CGfm4T+$agodrB=md8ygG!|O=r@FY>S_zX%*)mqf?XBX*chhQ9uPP z-(T(24)})vWD*{bQM5_hy3CD8C>anuNtCXMkG7T?Yew^>=PK!~Hlr0{-0h0cNAJ8> zRMzLFz7aJv)Yh)_s)^L&L*nDV@qfeg>_<`z1z(?s}}3tE4h|7_taB> zPfmmOCFZ8%>`gyf1@|7t3;e~mwBRCDDw(Rrt>@O}obs#1?!W((+9>d$b7t!{&wR!P ziQbn0@j=&sw={`s##Uc@uS^(tbShjtsk=qrU1LW0lu}BplIfzv{fwxNsSaG~b|ryo zTQ}YXfp6o?^sSHW>s~m;l@h6wFbIPw{Z(IqO1u){{hEZgrTdF0o$n;hYIm`h5ejym zWt^w~#8p1J)FtfY6LvGmNQ~#n>4#mN4B^ zjrQk)Zt%k}GBRD>l`<~og6N_{6HYKDtsAtd%y?KbXCQR(sW8O(v_)kwYMz|(OW zsFz6A1^abSklOl`wLC-KYI8x=oMD^qZBs}}JVW@YY|3&k&IZ_n2Ia@5WiK>buV!E- zOsYcS4dFPE7vzj%_?5i2!XY`TiPd*jy>#C`i^XG8h?f35`=)s`0EhQBN!+YrXbpt( z-bwg_Jen`w<+6&B`hldU%rr&Xdgtze>rKuJ61AI12ja-eDZZX-+u1H>Sa|7pCine9 z&MEhmT7nq`P!pPK>l?I8cjuPpN<7(hqH~beChC*YMR+p;;@6#0j2k$=onUM`IXW3> z`dtX8`|@P|Ep-_0>)@&7@aLeg$jOd4G`eIW=^dQQ*^cgKeWAsSHOY?WEOsrtnG|^yeQ3lSd`pKAR}kzgIiEk@OvQb>DS*pGidh`E=BHYepHXbV)SV6pE2dx6 zkND~nK}2qjDVX3Z`H;2~lUvar>zT7u%x8LZa&rp7YH@n@GqQ65Cv+pkxI1OU6(g`b z?>)NcE7>j@p>V0mFk-5Rpi`W}oQ!tUU&Yn8m0OWYFj|~`?aVFOx;e`M)Q!YSokY)3 zV6l-;hK6?j=mp2#1e5cCn7P6n_7)n^+MdRw@5pvkOA>|&B8`QZ32|ynqaf}Kcdro= zzQchCYM0^)7$;m2iZnMbE$!}hwk&AVvN`iX3A9mB&`*BDmLV-m`OMvd`sJ?;%U`p~ zmwow{y6sPbcZNQPZ#GQS0&mzy?s%>_p>ZM|sCXVAUlST;rQ-3#Iu!-bpFSV4g7?-l zGfX>Z#hR+i;9B};^CO@7<<#MGFeY)SC&;a{!` zf;yaQo%{bjSa8KT~@?O$cK z(DGnm7w>cG1hH#*J%X}%Y%~+nLT*{aP08@l&Nu}>!-j|!8lSqt_xUNF+Y}SQmupyb zPua2PI;@1YaIsRF*knA^rJv84Tc=7?J2}!1kMfHSO$d$+PK*u?OI%=P7;`PHxMB0k zau~T0Wk)rPEGJ$NiXW~kfPA#m%Sr|7=$tHelF9A6rFLa$^g{6)8GSW*6}#~Zb^qk% zg=pLwC!SkY+&Gne((9`TCy`i`a#eCS{A2yMi>J>p*NS*!V~aAgK;wnSOHPULqzyj- z-q4BPXqXn))iRnMF*WZj17wUYjC!h43tI7uScHLf1|WJfA7^5O9`%lH>ga`cmpiz( zs|I8nTUD4?d{CQ-vwD!2uwGU_Ts&{1_mvqY`@A{j^b?n&WbPhb418NY1*Otz19`1w zc9rn?0e_*En&8?OWii89x+jaqRVzlL!QUCg^qU&+WERycV&1+fcsJ%ExEPjiQWRTU zCJpu*1dXyvrJJcH`+OKn7;q`X#@Gmy3U?5ZAV~mXjQhBJOCMw>o@2kznF>*?qOW;D z6!GTcM)P-OY-R`Yd>FeX%UyL%dY%~#^Yl!c42;**WqdGtGwTfB9{2mf2h@#M8YyY+!Q(4}X^+V#r zcZXYE$-hJyYzq%>$)k8vSQU` zIpxU*yy~naYp=IocRp5no^PeFROluibl( zmaKkWgSWZHn(`V_&?hM{%xl3TBWCcr59WlX6Q{j45)`A^-kUv4!qM=OdcwpsGB)l} z&-_U+8S8bQ!RDc&Y3~?w5NwLNstoUYqPYs(y+lj!HFqIZ7FA>WsxAE7vB=20K zn_&y{2)Uaw4b^NCFNhJXd&XrhA4E~zD7Ue7X^f98=&5!wn_r=6qAwDkd>g#2+*ahd zaV|_P_8e%jiHh7W;cl(d=&-r-C}_Ov?bts8s^rKUWQ|XkuW!ToSwe}Z{4|kl+q&&W zn%iW48c5*ft#*m)+xSps+j(B5bPh&u0&m6=@WgwBf_QfJJzg2Qdz89HwcV`5kZ#5z zw;W&H8>5R(>KRwvd0gh30wJHA>|2N(im;~wy1HTv_}Ue%qb)>5qL^$hIyPvoT(nk_<`7F;#nS8;q!cqKspvBc<%xMsQj*h|>`Z)F6LDxue@to))OIbs2X+zY2L9#2UNrR^)?c8&PFc?j*&Q-r|C%7a$)ZRQ->#|?rEj&M4spQfNt;J^ntwf(d+q;tt)C`d{*|t)czD4x-qw{Chm0vuKp8axqy5`Yz z1756|;JX1q(lEieR=uT;%havqflgv+`5i!Z`R}(JNV~&`x}I9Lmm;aB7Bnc^UC?>W zu)(J7@fs}pL=Y-4aLq&Z*lO$e^0(bOW z3gWbcvb^gjEfhV=6Lgu2aX{(zjq|NH*fSgm&kBj?6dFqD2MWk5@eHt@_&^ZTX$b?o}S<9BGaCZIm6Hz)Qkruacn!qv*>La|#%j*XFp(*;&v3h4 zcjPbZWzv|cOypb@XDnd}g%(@f7A>w2Nseo|{KdeVQu)mN=W=Q`N?ID%J_SXUr0Rl# z3X;tO*^?41^%c!H;ia@hX``kWS3TR|CJ4_9j-?l6RjC=n?}r&sr>m%58&~?$JJV6{ zDq5h#m4S_BPiibQQaPGg6LIHVCc`9w3^3ZVWP$n>p7 z5dIEH-W9e;$Id8>9?wh%WnWf>4^1U<%vn=<4oNFhVl9zVk+jn;WtQUQ)ZeEjKYy8C z3g#tIb28thR1nZdKrN}(r zJdy-Y3Rvr5D3D|msZbmE;FLePbiM0ZjwTIQQHk)8G+sB$iwmEa2kQv&9Vs9m#$_8j zNKz}(x$Wc(M)a9H-Pn?5(Lk-CmOS(&+EVLOfsiq>e3ru6P?Lp>FOwPt>0o=j8UyF^ zO{(vf#MGx^y~WaOKnt%I78s}60(O#jFx0^47^Ikh$QTar(Dg$c=0KR|rRD|6s zz?tEX0_=(Hm0jWl;QOu!-k)mV?^i(Etl=Lg-{ z0G}CBprLX60zgAUz-fS^&m#o;erEC5TU+mn_Wj(zL$zqMo!e`D>s7X&;E zFz}}}puI+c%xq0uTpWS3RBlIS2jH0)W(9FU1>6PLcj|6O>=y)l`*%P`6K4}U2p}a0 zvInj%$AmqzkNLy%azH|_f7x$lYxSG=-;7BViUN(&0HPUobDixM1RVBzWhv8LokKI2 zjDwvWu=S~8We)+K{oMd-_cuXNO&+{eUaA8Ope3MxME0?PD+0a)99N>WZ66*;sn(N++hjPyz5z0RC{- z$pcSs{|)~a_h?w)y}42A6fg|nRnYUjMaBqg=68&_K%h3eboQ=%i083nfIVZZ04qOp%d*)*hNJA_foPjiW z$1r8ZZiRSvJT3zhK>iR@8_+TTJ!tlNLdL`e0=yjzv3Ie80h#wSfS3$>DB!!@JHxNd z0Mvd0Vqq!zfDy$?goY+|h!e(n3{J2;Ag=b)eLq{F0W*O?j&@|882U5?hUVIw_v3aV8tMn`8jPa5pSxzaZe{z}z|}$zM$o=3-mQ0Zgd?ZtaI> zQVHP1W3v1lbw>|?z@2MO(Ex!5KybKQ@+JRAg1>nzpP-!@3!th3rV=o?eiZ~fQRWy_ zfA!U9^bUL+z_$VJI=ic;{epla<&J@W-QMPZm^kTQ8a^2TX^TDpza*^tOu!WZ=T!PT z+0lJ*HuRnNGobNk0PbPT?i;^h{&0u+-fejISNv#9&j~Ep2;dYspntgzwR6<$@0dTQ z!qLe3Ztc=Ozy!btCcx!G$U7FlBRe}-L(E|RpH%_gt4m_LJllX3!iRYJEPvxcJ>C76 zfBy0_zKaYn{3yG6@;}S&+BeJk5X}$Kchp<Ea-=>VDg&zi*8xM0-ya!{ zcDN@>%H#vMwugU&1KN9pqA6-?Q8N@Dz?VlJ3IDfz#i#_RxgQS*>K+|Q@bek+s7#Qk z(5NZ-4xs&$j)X=@(1(hLn)vPj&pP>Nyu)emQ1MW6)g0hqXa5oJ_slh@(5MMS4xnG= z{0aK#F@_p=e}FdAa3tEl!|+j?h8h`t0CvCmNU%dOwEq<+jmm-=n|r|G^7QX4N4o(v zPU!%%w(Cet)Zev3QA?;TMm_aEK!5(~Nc6pJlp|sQP@z%JI}f0_`u+rc`1Df^j0G&s ScNgau(U?ep-K_E5zy1%ZQTdPn literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f398c33 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..65dcd68 --- /dev/null +++ b/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libraries/lwjgl-nanovg.jar b/libraries/lwjgl-nanovg.jar new file mode 100644 index 0000000000000000000000000000000000000000..78238965250e480d9997cb1247958f4744b608d3 GIT binary patch literal 386304 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ã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 s&i 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%0A)y6)U~uG8_Y<1Fm2 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⁡osUMi%5wBats=2XGC=`{6Hyb^|+z10_-G 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

  • C0dPu^N1GBP`TDrxu!%fPvoXaXX#z9F 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 literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..b02216b --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} diff --git a/src/main/java/com/paragon/mixin/duck/IClientConnection.java b/src/main/java/com/paragon/mixin/duck/IClientConnection.java new file mode 100644 index 0000000..c2e0b6c --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IClientConnection.java @@ -0,0 +1,11 @@ +package com.paragon.mixin.duck; + +import net.minecraft.network.Packet; + +/** + * @author aesthetical + * @since 02/18/23 + */ +public interface IClientConnection { + void sendPacketNoEvent(Packet packet); +} diff --git a/src/main/java/com/paragon/mixin/duck/IClientPlayerInteractionManager.java b/src/main/java/com/paragon/mixin/duck/IClientPlayerInteractionManager.java new file mode 100644 index 0000000..2f26e5f --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IClientPlayerInteractionManager.java @@ -0,0 +1,12 @@ +package com.paragon.mixin.duck; + +import net.minecraft.client.network.SequencedPacketCreator; +import net.minecraft.client.world.ClientWorld; + +/** + * @author aesthetical + * @since 02/18/23 + */ +public interface IClientPlayerInteractionManager { + void hookSendSequencedPacket(ClientWorld world, SequencedPacketCreator packetCreator); +} diff --git a/src/main/java/com/paragon/mixin/duck/IGameRenderer.java b/src/main/java/com/paragon/mixin/duck/IGameRenderer.java new file mode 100644 index 0000000..c8ff042 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IGameRenderer.java @@ -0,0 +1,13 @@ +package com.paragon.mixin.duck; + +import net.minecraft.client.util.math.MatrixStack; + +/** + * @author aesthetical + * @since 02/19/23 + */ +public interface IGameRenderer { + + void hookBobView(MatrixStack matrices, float tickDelta); + +} diff --git a/src/main/java/com/paragon/mixin/duck/ILivingEntity.java b/src/main/java/com/paragon/mixin/duck/ILivingEntity.java new file mode 100644 index 0000000..73c721a --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/ILivingEntity.java @@ -0,0 +1,12 @@ +package com.paragon.mixin.duck; + +/** + * @author aesthetical + * @since 02/19/23 + */ +public interface ILivingEntity { + int getLastAttackedTicks(); + + float[] getRenderRotations(); + float[] getPreviousRenderRotations(); +} diff --git a/src/main/java/com/paragon/mixin/duck/IMinecraftClient.java b/src/main/java/com/paragon/mixin/duck/IMinecraftClient.java new file mode 100644 index 0000000..2efc5e1 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IMinecraftClient.java @@ -0,0 +1,16 @@ +package com.paragon.mixin.duck; + +import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.util.Session; + +/** + * @author aesthetical + * @since 02/17/23 + */ +public interface IMinecraftClient { + RenderTickCounter getRenderTickCounter(); + + void setItemUseCooldown(int itemUseCooldown); + + void setSession(Session session); +} diff --git a/src/main/java/com/paragon/mixin/duck/IMouse.java b/src/main/java/com/paragon/mixin/duck/IMouse.java new file mode 100644 index 0000000..6cd0920 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IMouse.java @@ -0,0 +1,11 @@ +package com.paragon.mixin.duck; + +/** + * @author surge + * @since 24/02/2023 + */ +public interface IMouse { + + double getScrollDelta(); + +} diff --git a/src/main/java/com/paragon/mixin/duck/IPlayerInteractEntityC2SPacket.java b/src/main/java/com/paragon/mixin/duck/IPlayerInteractEntityC2SPacket.java new file mode 100644 index 0000000..4eadeb8 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IPlayerInteractEntityC2SPacket.java @@ -0,0 +1,14 @@ +package com.paragon.mixin.duck; + +import net.minecraft.entity.Entity; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; + +/** + * @author aesthetical + * @since 02/17/23 + */ +public interface IPlayerInteractEntityC2SPacket { + PlayerInteractEntityC2SPacket.InteractType getType(); + + Entity getEntity(); +} diff --git a/src/main/java/com/paragon/mixin/duck/IRenderTickCounter.java b/src/main/java/com/paragon/mixin/duck/IRenderTickCounter.java new file mode 100644 index 0000000..1b89ab6 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IRenderTickCounter.java @@ -0,0 +1,12 @@ +package com.paragon.mixin.duck; + +/** + * @author aesthetical + * @since 02/17/23 + */ +public interface IRenderTickCounter { + + void setTickLength(float tickLength); + float getTickLength(); + +} diff --git a/src/main/java/com/paragon/mixin/duck/IVec3d.java b/src/main/java/com/paragon/mixin/duck/IVec3d.java new file mode 100644 index 0000000..47125d6 --- /dev/null +++ b/src/main/java/com/paragon/mixin/duck/IVec3d.java @@ -0,0 +1,16 @@ +package com.paragon.mixin.duck; + +/** + * @author aesthetical + * @since 02/17/23 + */ +public interface IVec3d { + + void setX(double xIn); + void setY(double yIn); + void setZ(double zIn); + + void set(double xIn, double yIn, double zIn); + void set(double xIn, double zIn); + +} diff --git a/src/main/java/com/paragon/mixin/mixins/MinecraftClientMixin.java b/src/main/java/com/paragon/mixin/mixins/MinecraftClientMixin.java new file mode 100644 index 0000000..d162220 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/MinecraftClientMixin.java @@ -0,0 +1,94 @@ +package com.paragon.mixin.mixins; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.mc.ShutdownEvent; +import com.paragon.backend.event.events.mc.TickEvent; +import com.paragon.backend.event.events.mc.TitleEvent; +import com.paragon.backend.event.events.render.FPSLimitEvent; +import com.paragon.backend.event.events.render.SetScreenEvent; +import com.paragon.mixin.duck.IMinecraftClient; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.util.Session; +import net.minecraft.client.world.ClientWorld; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author surge, aesthetical + * @since 11/02/2023 + */ +@Mixin(MinecraftClient.class) +public class MinecraftClientMixin implements IMinecraftClient { + + @Shadow public ClientWorld world; + @Shadow public ClientPlayerEntity player; + @Shadow public Screen currentScreen; + + @Shadow private int itemUseCooldown; + + @Shadow @Final + private RenderTickCounter renderTickCounter; + + @Shadow @Final @Mutable + private Session session; + + @Inject(method = "tick", at = @At("TAIL")) + public void hookOnTick(CallbackInfo ci) { + if (world != null && player != null) { + Paragon.bus.post(new TickEvent()); + } + } + + @Inject(method = "close", at = @At("HEAD")) + public void hookClose(CallbackInfo ci) { + Paragon.bus.post(new ShutdownEvent()); + } + + @Inject(method = "getWindowTitle", at = @At("RETURN"), cancellable = true) + public void hookGetWindowTitle(CallbackInfoReturnable info) { + TitleEvent event = new TitleEvent(info.getReturnValue()); + Paragon.bus.post(event); + info.setReturnValue(event.title); + } + + @Inject(method = "setScreen", at = @At("HEAD")) + public void hookSetScreen(Screen screen, CallbackInfo info) { + Paragon.bus.post(new SetScreenEvent(currentScreen, screen)); + } + + @Inject(method = "getFramerateLimit", at = @At("HEAD"), cancellable = true) + public void hookGetFramerateLimit(CallbackInfoReturnable cir) { + FPSLimitEvent event = new FPSLimitEvent(); + Paragon.bus.post(event); + + if (event.isCancelled()) { + cir.cancel(); + cir.setReturnValue(event.getLimit()); + } + } + + @Override + public RenderTickCounter getRenderTickCounter() { + return renderTickCounter; + } + + @Override + public void setItemUseCooldown(int itemUseCooldown) { + this.itemUseCooldown = itemUseCooldown; + } + + @Override + public void setSession(Session session) { + this.session = session; + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/MixinSplashTextResourceSupplier.java b/src/main/java/com/paragon/mixin/mixins/MixinSplashTextResourceSupplier.java new file mode 100644 index 0000000..c55e589 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/MixinSplashTextResourceSupplier.java @@ -0,0 +1,16 @@ +package com.paragon.mixin.mixins; + +import net.minecraft.client.resource.SplashTextResourceSupplier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(SplashTextResourceSupplier.class) +public class MixinSplashTextResourceSupplier { + + @Inject(method = "get", at = @At("HEAD"), cancellable = true) + public void hookGet(CallbackInfoReturnable info) { + + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/entity/MixinClientPlayerEntity.java b/src/main/java/com/paragon/mixin/mixins/entity/MixinClientPlayerEntity.java new file mode 100644 index 0000000..3abccd7 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/entity/MixinClientPlayerEntity.java @@ -0,0 +1,165 @@ +package com.paragon.mixin.mixins.entity; + +import com.mojang.authlib.GameProfile; +import com.paragon.Paragon; +import com.paragon.backend.event.EventEra; +import com.paragon.backend.event.events.input.control.ItemSlowdownEvent; +import com.paragon.backend.event.events.input.control.SneakSlowdownEvent; +import com.paragon.backend.event.events.move.MoveEvent; +import com.paragon.backend.event.events.move.MoveUpdateEvent; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.input.Input; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.MovementType; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(ClientPlayerEntity.class) +public abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity { + + @Shadow private double lastX; + @Shadow private double lastBaseY; + @Shadow private double lastZ; + @Shadow private float lastYaw; + @Shadow private float lastPitch; + + @Shadow private boolean lastSneaking; + @Shadow private boolean lastOnGround; + @Shadow private boolean autoJumpEnabled; + + @Shadow @Final protected MinecraftClient client; + @Shadow @Final public ClientPlayNetworkHandler networkHandler; + @Shadow public Input input; + + @Shadow private int ticksSinceLastPositionPacketSent; + + public MixinClientPlayerEntity(ClientWorld world, GameProfile profile) { + super(world, profile); + } + + @Shadow protected abstract boolean isCamera(); + @Shadow protected abstract void sendSprintingPacket(); + + @Shadow public float renderPitch; + + @Inject(method = "sendMovementPackets", at = @At("HEAD"), cancellable = true) + public void hookSendMovementPacketsPre(CallbackInfo info) { + MoveUpdateEvent event = new MoveUpdateEvent(EventEra.PRE, + getX(), getY(), getZ(), getYaw(), getPitch(), isOnGround()); + if (Paragon.bus.post(event)) { + info.cancel(); + handleMovementPackets(event); + } + } + + @Inject(method = "sendMovementPackets", at = @At("TAIL")) + public void hookSendMovementPacketsPost(CallbackInfo info) { + Paragon.bus.post(new MoveUpdateEvent(EventEra.POST, + getX(), getY(), getZ(), getYaw(), getPitch(), isOnGround())); + } + + @Redirect( + method = "tickMovement", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z", + ordinal = 0)) + public boolean hookTickMovement(ClientPlayerEntity instance) { + if (Paragon.bus.post(new ItemSlowdownEvent((ClientPlayerEntity) (Object) this))) { + return false; + } + + return instance.isUsingItem(); + } + + @Inject(method = "shouldSlowDown", at = @At("HEAD"), cancellable = true) + public void hookShouldSlowDown(CallbackInfoReturnable info) { + if (Paragon.bus.post(new SneakSlowdownEvent((ClientPlayerEntity) (Object) this))) { + info.setReturnValue(false); + } + } + + @Redirect( + method = "move", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V")) + public void redirectMove$Move(AbstractClientPlayerEntity instance, MovementType movementType, Vec3d vec3d) { + MoveEvent event = new MoveEvent(vec3d); + Paragon.bus.post(event); + super.move(movementType, event.getMotionVec()); + } + + private void handleMovementPackets(MoveUpdateEvent event) { + + sendSprintingPacket(); + + if (isSneaking() != lastSneaking) { + networkHandler.sendPacket(new ClientCommandC2SPacket(this, isSneaking() + ? ClientCommandC2SPacket.Mode.PRESS_SHIFT_KEY : ClientCommandC2SPacket.Mode.RELEASE_SHIFT_KEY)); + lastSneaking = isSneaking(); + } + + if (isCamera()) { + double d = event.x - lastX; + double e = event.y - lastBaseY; + double f = event.z - lastZ; + double g = event.yaw - lastYaw; + double h = event.pitch - lastPitch; + + ++ticksSinceLastPositionPacketSent; + + boolean moved = MathHelper.squaredMagnitude(d, e, f) > MathHelper.square(2.0E-4) || ticksSinceLastPositionPacketSent >= 20; + boolean rotated = g != 0.0 || h != 0.0; + + if (hasVehicle()) { + Vec3d vec3d = getVelocity(); + networkHandler.sendPacket(new PlayerMoveC2SPacket.Full(vec3d.x, -999.0, vec3d.z, event.yaw, event.pitch, event.onGround)); + moved = false; + } else if (moved && rotated) { + networkHandler.sendPacket(new PlayerMoveC2SPacket.Full(event.x, event.y, event.z, event.yaw, event.pitch, event.onGround)); + } else if (moved) { + networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(event.x, event.y, event.z, event.onGround)); + } else if (rotated) { + networkHandler.sendPacket(new PlayerMoveC2SPacket.LookAndOnGround(event.yaw, event.pitch, event.onGround)); + } else if (lastOnGround != event.onGround) { + networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(event.onGround)); + } + + if (moved) { + lastX = event.x; + lastBaseY = event.y; + lastZ = event.z; + ticksSinceLastPositionPacketSent = 0; + } + + if (rotated) { + lastYaw = event.yaw; + lastPitch = event.pitch; + } + + lastOnGround = onGround; + autoJumpEnabled = client.options.getAutoJump().getValue(); + } + + Paragon.bus.post(new MoveUpdateEvent(EventEra.POST, + event.x, event.y, event.z, event.yaw, event.pitch, event.onGround)); + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/entity/MixinLivingEntity.java b/src/main/java/com/paragon/mixin/mixins/entity/MixinLivingEntity.java new file mode 100644 index 0000000..24622a9 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/entity/MixinLivingEntity.java @@ -0,0 +1,70 @@ +package com.paragon.mixin.mixins.entity; + +import com.paragon.Paragon; +import com.paragon.backend.event.EventEra; +import com.paragon.backend.event.events.entity.EntityTickEvent; +import com.paragon.mixin.duck.ILivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/19/23 + */ +@Mixin(LivingEntity.class) +public abstract class MixinLivingEntity extends Entity implements ILivingEntity { + @Shadow protected int lastAttackedTicks; + + private float[] renderRotations; + private float[] prevRenderRotations; + + public MixinLivingEntity(EntityType type, World world) { + super(type, world); + } + + @Inject(method = "", at = @At("TAIL")) + public void hookInit(CallbackInfo info) { + renderRotations = new float[2]; + prevRenderRotations = new float[2]; + + renderRotations[0] = getYaw(); + renderRotations[1] = getPitch(); + prevRenderRotations[0] = getYaw(); + prevRenderRotations[1] = getPitch(); + } + + @Inject(method = "baseTick", at = @At("HEAD")) + public void hookBaseTickPre(CallbackInfo info) { + Paragon.bus.post(new EntityTickEvent(EventEra.PRE, (LivingEntity) (Object) this)); + } + + @Inject(method = "baseTick", at = @At("TAIL")) + public void hookBaseTickPost(CallbackInfo info) { + Paragon.bus.post(new EntityTickEvent(EventEra.POST, (LivingEntity) (Object) this)); + + prevRenderRotations[0] = renderRotations[0]; + prevRenderRotations[1] = renderRotations[1]; + } + + @Override + public int getLastAttackedTicks() { + return lastAttackedTicks; + } + + @Override + public float[] getRenderRotations() { + return renderRotations; + } + + @Override + public float[] getPreviousRenderRotations() { + return prevRenderRotations; + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/input/MixinClientPlayerInteractionManager.java b/src/main/java/com/paragon/mixin/mixins/input/MixinClientPlayerInteractionManager.java new file mode 100644 index 0000000..50d07a8 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/input/MixinClientPlayerInteractionManager.java @@ -0,0 +1,67 @@ +package com.paragon.mixin.mixins.input; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.input.control.AttackBlockEvent; +import com.paragon.mixin.duck.IClientPlayerInteractionManager; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.client.network.SequencedPacketCreator; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author aesthetical + * @since 02/18/23 + */ +@Mixin(ClientPlayerInteractionManager.class) +public abstract class MixinClientPlayerInteractionManager implements IClientPlayerInteractionManager { + + @Shadow + protected abstract void sendSequencedPacket(ClientWorld world, SequencedPacketCreator packetCreator); + + @Inject(method = "attackBlock", at = @At("HEAD"), cancellable = true) + public void hookAttackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable info) { + if (Paragon.bus.post(new AttackBlockEvent(pos, direction))) { + info.setReturnValue(false); + } + } + + // these below two redirects is for silent swap + + @Redirect( + method = "interactBlockInternal", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/network/ClientPlayerEntity;getStackInHand(Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;")) + private ItemStack hookRedirectInteractBlockInternal$getStackInHand(ClientPlayerEntity instance, Hand hand) { + if (hand.equals(Hand.OFF_HAND)) { + return instance.getStackInHand(hand); + } + + return Paragon.inventoryManager.isDesynced() ? Paragon.inventoryManager.getServerStack() : instance.getStackInHand(Hand.MAIN_HAND); + } + + @Redirect( + method = "interactBlockInternal", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isEmpty()Z", + ordinal = 0)) + private boolean hookRedirectInteractBlockInternal$getMainHandStack(ItemStack instance) { + return Paragon.inventoryManager.isDesynced() ? Paragon.inventoryManager.getServerStack().isEmpty() : instance.isEmpty(); + } + + @Override + public void hookSendSequencedPacket(ClientWorld world, SequencedPacketCreator packetCreator) { + sendSequencedPacket(world, packetCreator); + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/input/MixinItemUsageContext.java b/src/main/java/com/paragon/mixin/mixins/input/MixinItemUsageContext.java new file mode 100644 index 0000000..1e3ff16 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/input/MixinItemUsageContext.java @@ -0,0 +1,21 @@ +package com.paragon.mixin.mixins.input; + +import com.paragon.Paragon; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ItemUsageContext.class) +public class MixinItemUsageContext { + + @Inject(method = "getStack", at = @At("RETURN"), cancellable = true) + public void hookGetStack(CallbackInfoReturnable info) { + if (info.getReturnValue().equals(MinecraftClient.getInstance().player.getMainHandStack()) && Paragon.inventoryManager.isDesynced()) { + info.setReturnValue(Paragon.inventoryManager.getServerStack()); + } + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/input/io/KeyboardMixin.java b/src/main/java/com/paragon/mixin/mixins/input/io/KeyboardMixin.java new file mode 100644 index 0000000..937e8b3 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/input/io/KeyboardMixin.java @@ -0,0 +1,24 @@ +package com.paragon.mixin.mixins.input.io; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.input.io.KeyEvent; +import net.minecraft.client.Keyboard; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author surge + * @since 11/02/2023 + */ +@Mixin(Keyboard.class) +public class KeyboardMixin { + + @Inject(method = "onKey", at = @At("HEAD")) + public void onKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) { + Paragon.bus.post(new KeyEvent(key, action)); + } + +} + diff --git a/src/main/java/com/paragon/mixin/mixins/input/io/MouseMixin.java b/src/main/java/com/paragon/mixin/mixins/input/io/MouseMixin.java new file mode 100644 index 0000000..991f2ad --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/input/io/MouseMixin.java @@ -0,0 +1,32 @@ +package com.paragon.mixin.mixins.input.io; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.input.io.MouseEvent; +import com.paragon.mixin.duck.IMouse; +import net.minecraft.client.Mouse; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(Mouse.class) +public class MouseMixin implements IMouse { + + @Shadow private double eventDeltaWheel; + + @Inject(method = "onMouseButton", at = @At("HEAD")) + public void hookOnMouseButton(long window, int button, int action, int mods, CallbackInfo info) { + Paragon.bus.post(new MouseEvent(button, action)); + } + + @Override + public double getScrollDelta() { + return eventDeltaWheel; + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/item/TridentItemMixin.java b/src/main/java/com/paragon/mixin/mixins/item/TridentItemMixin.java new file mode 100644 index 0000000..bb7c026 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/item/TridentItemMixin.java @@ -0,0 +1,26 @@ +package com.paragon.mixin.mixins.item; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.move.TridentVelocityEvent; +import net.minecraft.item.TridentItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +/** + * @author surge + * @since 24/02/2023 + */ +@Mixin(TridentItem.class) +public class TridentItemMixin { + + @ModifyArgs(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V")) + private void hookOnStoppedUsing(Args args) { + TridentVelocityEvent event = new TridentVelocityEvent(args.get(0), args.get(1), args.get(2)); + Paragon.bus.post(event); + + args.setAll(event.getX(), event.getY(), event.getZ()); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/math/MixinVec3d.java b/src/main/java/com/paragon/mixin/mixins/math/MixinVec3d.java new file mode 100644 index 0000000..d80f3bf --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/math/MixinVec3d.java @@ -0,0 +1,53 @@ +package com.paragon.mixin.mixins.math; + +import com.paragon.mixin.duck.IVec3d; +import net.minecraft.util.math.Vec3d; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(Vec3d.class) +public class MixinVec3d implements IVec3d { + + @Shadow @Final @Mutable + public double x; + + @Shadow @Final @Mutable + public double y; + + @Shadow @Final @Mutable + public double z; + + @Override + public void setX(double xIn) { + x = xIn; + } + + @Override + public void setY(double yIn) { + y = yIn; + } + + @Override + public void setZ(double zIn) { + z = zIn; + } + + @Override + public void set(double xIn, double yIn, double zIn) { + x = xIn; + y = yIn; + z = zIn; + } + + @Override + public void set(double xIn, double zIn) { + x = xIn; + z = zIn; + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/net/MixinClientConnection.java b/src/main/java/com/paragon/mixin/mixins/net/MixinClientConnection.java new file mode 100644 index 0000000..0ce1bab --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/net/MixinClientConnection.java @@ -0,0 +1,50 @@ +package com.paragon.mixin.mixins.net; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.net.PacketEvent; +import com.paragon.backend.event.events.net.PacketEvent.Inbound; +import com.paragon.backend.event.events.net.PacketEvent.Outbound; +import com.paragon.mixin.duck.IClientConnection; +import io.netty.channel.ChannelHandlerContext; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.Packet; +import net.minecraft.network.PacketCallbacks; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(ClientConnection.class) +public abstract class MixinClientConnection implements IClientConnection { + + @Shadow + protected abstract void sendImmediately(Packet packet, @Nullable PacketCallbacks callbacks); + + @Inject(method = "send(Lnet/minecraft/network/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At("HEAD"), cancellable = true) + public void hookSend(Packet packet, PacketCallbacks callbacks, CallbackInfo info) { + PacketEvent.Outbound outbound = new Outbound(packet); + if (Paragon.bus.post(outbound)) { + info.cancel(); + } + } + + @Inject(method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", at = @At("HEAD"), cancellable = true) + public void hookChannelRead0(ChannelHandlerContext channelHandlerContext, Packet packet, CallbackInfo info) { + PacketEvent.Inbound inbound = new Inbound(packet); + if (Paragon.bus.post(inbound)) { + info.cancel(); + } + } + + @Override + public void sendPacketNoEvent(Packet packet) { + sendImmediately(packet, null); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/IPlayerMoveC2SPacket.java b/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/IPlayerMoveC2SPacket.java new file mode 100644 index 0000000..3e3fb37 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/IPlayerMoveC2SPacket.java @@ -0,0 +1,19 @@ +package com.paragon.mixin.mixins.net.packet.c2s; + +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +/** + * @author aesthetical + * @since 02/18/23 + */ +@Mixin(PlayerMoveC2SPacket.class) +public interface IPlayerMoveC2SPacket { + + @Accessor("onGround") @Final @Mutable + void setOnGround(boolean onGround); + +} diff --git a/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/MixinPlayerInteractEntityC2SPacket.java b/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/MixinPlayerInteractEntityC2SPacket.java new file mode 100644 index 0000000..1510eb3 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/net/packet/c2s/MixinPlayerInteractEntityC2SPacket.java @@ -0,0 +1,29 @@ +package com.paragon.mixin.mixins.net.packet.c2s; + +import com.paragon.mixin.duck.IPlayerInteractEntityC2SPacket; +import net.minecraft.entity.Entity; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import static com.paragon.util.MiscKt.getMc; + +@Mixin(PlayerInteractEntityC2SPacket.class) +public class MixinPlayerInteractEntityC2SPacket implements IPlayerInteractEntityC2SPacket { + + @Shadow @Final private int entityId; + + @Shadow @Final private PlayerInteractEntityC2SPacket.InteractTypeHandler type; + + @Override + public PlayerInteractEntityC2SPacket.InteractType getType() { + return type.getType(); + } + + @Override + public Entity getEntity() { + return getMc().world.getEntityById(entityId); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IEntityVelocityUpdateS2CPacket.java b/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IEntityVelocityUpdateS2CPacket.java new file mode 100644 index 0000000..9234ae8 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IEntityVelocityUpdateS2CPacket.java @@ -0,0 +1,28 @@ +package com.paragon.mixin.mixins.net.packet.s2c; + +import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +/** + * @author aesthetical + * @since 02/18/23 + */ +@Mixin(EntityVelocityUpdateS2CPacket.class) +public interface IEntityVelocityUpdateS2CPacket { + + @Accessor("velocityX") + @Final @Mutable + void setVelocityX(int velocityX); + + @Accessor("velocityY") + @Final @Mutable + void setVelocityY(int velocityY); + + @Accessor("velocityZ") + @Final @Mutable + void setVelocityZ(int velocityZ); + +} diff --git a/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IExplosionS2CPacket.java b/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IExplosionS2CPacket.java new file mode 100644 index 0000000..85ebc7c --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/net/packet/s2c/IExplosionS2CPacket.java @@ -0,0 +1,29 @@ +package com.paragon.mixin.mixins.net.packet.s2c; + +import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +/** + * @author aesthetical + * @since 02/18/23 + */ +@Mixin(ExplosionS2CPacket.class) +public interface IExplosionS2CPacket { + + @Accessor("playerVelocityX") + @Final + @Mutable + void setVelocityX(float velocityX); + + @Accessor("playerVelocityY") + @Final @Mutable + void setVelocityY(float velocityY); + + @Accessor("playerVelocityZ") + @Final @Mutable + void setVelocityZ(float velocityZ); + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/GameRendererMixin.java b/src/main/java/com/paragon/mixin/mixins/render/GameRendererMixin.java new file mode 100644 index 0000000..50bfdde --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/GameRendererMixin.java @@ -0,0 +1,81 @@ +package com.paragon.mixin.mixins.render; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.paragon.Paragon; +import com.paragon.backend.event.events.entity.EntityTraceEvent; +import com.paragon.backend.event.events.entity.RaycastEvent; +import com.paragon.backend.event.events.render.GameRenderEvent; +import com.paragon.backend.event.events.render.PreGameRenderEvent; +import com.paragon.backend.framebuffer.MultiSampledFramebuffer; +import com.paragon.mixin.duck.IGameRenderer; +import com.paragon.util.rendering.Renderer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.hit.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +/** + * @author surge + * @since 12/02/2023 + */ +@Mixin(GameRenderer.class) +public abstract class GameRendererMixin implements IGameRenderer { + + @Shadow protected abstract void bobView(MatrixStack matrices, float tickDelta); + + @Shadow public abstract MinecraftClient getClient(); + + @Inject(method = "renderWorld", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z")) + public void hookRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci) { + RenderSystem.backupProjectionMatrix(); + Paragon.bus.post(new GameRenderEvent(matrices, tickDelta)); + MultiSampledFramebuffer.use(Renderer::drawAndClear); + RenderSystem.restoreProjectionMatrix(); + } + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + public void hookRenderHead(float tickDelta, long startTime, boolean tick, CallbackInfo ci) { + PreGameRenderEvent event = new PreGameRenderEvent(); + Paragon.bus.post(event); + + if (event.isCancelled()) { + ci.cancel(); + } + } + + @ModifyArgs(method = "updateTargetedEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;raycast(DFZ)Lnet/minecraft/util/hit/HitResult;")) + public void hookUpdateTargetedEntityRaycast(Args args) { + RaycastEvent event = new RaycastEvent(args.get(0), args.get(1), args.get(2)); + Paragon.bus.post(event); + + args.setAll( + event.getDistance(), + event.getTickDelta(), + event.getIncludeFluids() + ); + } + + @Inject(method = "updateTargetedEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileUtil;raycast(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Box;Ljava/util/function/Predicate;D)Lnet/minecraft/util/hit/EntityHitResult;"), cancellable = true) + public void hookUpdateTargetedEntity(float tickDelta, CallbackInfo ci) { + EntityTraceEvent event = new EntityTraceEvent(getClient().crosshairTarget); + Paragon.bus.post(event); + + if (event.isCancelled()) { + getClient().getProfiler().pop(); + ci.cancel(); + } + } + + @Override + public void hookBobView(MatrixStack matrices, float tickDelta) { + bobView(matrices, tickDelta); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/MixinCamera.java b/src/main/java/com/paragon/mixin/mixins/render/MixinCamera.java new file mode 100644 index 0000000..bab915e --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/MixinCamera.java @@ -0,0 +1,26 @@ +package com.paragon.mixin.mixins.render; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.ClipToSpaceEvent; +import net.minecraft.client.render.Camera; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author aesthetical + * @since 02/19/23 + */ +@Mixin(Camera.class) +public class MixinCamera { + + @Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true) + public void hookClipToSpace(double desiredCameraDistance, CallbackInfoReturnable info) { + ClipToSpaceEvent event = new ClipToSpaceEvent(desiredCameraDistance); + if (Paragon.bus.post(event)) { + info.setReturnValue(event.getDistance()); + } + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/MixinLightmapTextureManager.java b/src/main/java/com/paragon/mixin/mixins/render/MixinLightmapTextureManager.java new file mode 100644 index 0000000..111e0a3 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/MixinLightmapTextureManager.java @@ -0,0 +1,24 @@ +package com.paragon.mixin.mixins.render; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.GammaModifyEvent; +import net.minecraft.client.render.LightmapTextureManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * @author aesthetical + * @since 02/18/23 + */ +@Mixin(LightmapTextureManager.class) +public class MixinLightmapTextureManager { + + // this is the only place getGamma() is used, so this has to be it? + @Redirect(method = "update", at = @At(value = "INVOKE", target = "Ljava/lang/Double;floatValue()F", ordinal = 1)) + public float redirectUpdate$floatValue(Double instance) { + GammaModifyEvent event = new GammaModifyEvent(instance.floatValue()); + return Paragon.bus.post(event) ? event.gamma : instance.floatValue(); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/MixinRenderTickCounter.java b/src/main/java/com/paragon/mixin/mixins/render/MixinRenderTickCounter.java new file mode 100644 index 0000000..9b24335 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/MixinRenderTickCounter.java @@ -0,0 +1,30 @@ +package com.paragon.mixin.mixins.render; + +import com.paragon.mixin.duck.IRenderTickCounter; +import net.minecraft.client.render.RenderTickCounter; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(RenderTickCounter.class) +public class MixinRenderTickCounter implements IRenderTickCounter { + + @Shadow @Final @Mutable + private float tickTime; + + @Override + public void setTickLength(float tickLength) { + tickTime = tickLength; + } + + @Override + public float getTickLength() { + return tickTime; + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/WindowMixin.java b/src/main/java/com/paragon/mixin/mixins/render/WindowMixin.java new file mode 100644 index 0000000..01d98c8 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/WindowMixin.java @@ -0,0 +1,31 @@ +package com.paragon.mixin.mixins.render; + +import com.paragon.Paragon; +import com.paragon.util.calculations.Timer; +import com.paragon.util.rendering.NVGWrapper; +import net.minecraft.client.WindowEventHandler; +import net.minecraft.client.WindowSettings; +import net.minecraft.client.util.MonitorTracker; +import net.minecraft.client.util.Window; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author surge + * @since 11/02/2023 + */ +@Mixin(Window.class) +public class WindowMixin { + + @Inject(method = "", at = @At("TAIL")) + public void hookInit(WindowEventHandler eventHandler, MonitorTracker monitorTracker, WindowSettings settings, String videoMode, String title, CallbackInfo info) { + Paragon.getLogger().info("Initialising NanoVG"); + Timer timer = new Timer(); + timer.reset(); + NVGWrapper.initialise(); + Paragon.getLogger().info("Initialised NanoVG in {}ms", timer.timeMs()); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/entity/MixinLivingEntityRenderer.java b/src/main/java/com/paragon/mixin/mixins/render/entity/MixinLivingEntityRenderer.java new file mode 100644 index 0000000..ab69b99 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/entity/MixinLivingEntityRenderer.java @@ -0,0 +1,74 @@ +package com.paragon.mixin.mixins.render.entity; + +import com.paragon.mixin.duck.ILivingEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory.Context; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/17/23 + */ + +/** + * TODO: Make these smooth (rotations, I assume??) + */ +@Mixin(LivingEntityRenderer.class) +public abstract class MixinLivingEntityRenderer> + extends EntityRenderer + implements FeatureRendererContext { + + private float headYaw, prevHeadYaw; + private float pitch, prevPitch; + private boolean modified = false; + + protected MixinLivingEntityRenderer(Context ctx) { + super(ctx); + } + + @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD")) + public void hookRenderPre(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo info) { + if (livingEntity != null && livingEntity.equals(MinecraftClient.getInstance().player)) { + + modified = true; + + headYaw = livingEntity.headYaw; + prevHeadYaw = livingEntity.prevHeadYaw; + + pitch = livingEntity.getPitch(); + prevPitch = livingEntity.prevPitch; + + float[] rots = ((ILivingEntity) livingEntity).getRenderRotations(); + float[] prevRots = ((ILivingEntity) livingEntity).getPreviousRenderRotations(); + + livingEntity.headYaw = rots[0]; + livingEntity.prevHeadYaw = prevRots[0]; + + livingEntity.setPitch(rots[1]); + livingEntity.prevPitch = prevRots[1]; + } + } + + @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("TAIL")) + public void hookRenderPost(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo info) { + if (livingEntity != null && livingEntity.equals(MinecraftClient.getInstance().player) && modified) { + modified = false; + + livingEntity.headYaw = headYaw; + livingEntity.prevHeadYaw = prevHeadYaw; + + livingEntity.setPitch(pitch); + livingEntity.prevPitch = prevPitch; + } + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/entity/MixinPlayerEntityRenderer.java b/src/main/java/com/paragon/mixin/mixins/render/entity/MixinPlayerEntityRenderer.java new file mode 100644 index 0000000..55e7363 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/entity/MixinPlayerEntityRenderer.java @@ -0,0 +1,29 @@ +package com.paragon.mixin.mixins.render.entity; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.RenderNameplateEvent; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.PlayerEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/19/23 + */ +@Mixin(PlayerEntityRenderer.class) +public class MixinPlayerEntityRenderer { + + @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/network/AbstractClientPlayerEntity;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true) + public void hookRenderLabelIfPresent(AbstractClientPlayerEntity abstractClientPlayerEntity, Text text, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo info) { + if (Paragon.bus.post(new RenderNameplateEvent(abstractClientPlayerEntity))) { + info.cancel(); + } + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/gui/MixinInGameHud.java b/src/main/java/com/paragon/mixin/mixins/render/gui/MixinInGameHud.java new file mode 100644 index 0000000..c1feb29 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/gui/MixinInGameHud.java @@ -0,0 +1,53 @@ +package com.paragon.mixin.mixins.render.gui; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.RenderHUDEvent; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.client.util.Window; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author aesthetical + * @since 02/17/23 + */ +@Mixin(InGameHud.class) +public class MixinInGameHud { + + @Shadow @Final private MinecraftClient client; + @Shadow private int scaledWidth; + + @Inject( + method = "render", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderColor(FFFF)V", + ordinal = 4, + shift = Shift.BEFORE)) + public void hookRender(MatrixStack stack, float deltaTick, CallbackInfo info) { + Window window = client.getWindow(); + Paragon.bus.post(new RenderHUDEvent(stack, deltaTick, window.getWidth(), window.getHeight())); + } + + @ModifyArg( + method = "renderHotbar", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/hud/InGameHud;drawTexture(Lnet/minecraft/client/util/math/MatrixStack;IIIIII)V", + ordinal = 1), + index = 1) + public int hookModifyRenderHotbar$selectedSlot(int selectedSlotIn) { + int slot = Paragon.inventoryManager.isDesynced() ? Paragon.inventoryManager.getSlot() : client.player.getInventory().selectedSlot; + int i = this.scaledWidth / 2; + return i - 91 - 1 + slot * 20; + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/render/gui/TitleScreenMixin.java b/src/main/java/com/paragon/mixin/mixins/render/gui/TitleScreenMixin.java new file mode 100644 index 0000000..ae28c9b --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/render/gui/TitleScreenMixin.java @@ -0,0 +1,67 @@ +package com.paragon.mixin.mixins.render.gui; + +import com.paragon.client.ui.title.MainMenuHook; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static com.paragon.util.MiscKt.getMc; + +@Mixin(TitleScreen.class) +public class TitleScreenMixin extends Screen { + + protected TitleScreenMixin(Text title) { + super(title); + } + + @Inject(method = "init", at = @At(value = "TAIL")) + public void hookInit(CallbackInfo ci) { + MainMenuHook.INSTANCE.init(); + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = At.Shift.AFTER)) + public void hookRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + MainMenuHook.INSTANCE.setHeight(height); + MainMenuHook.INSTANCE.render(matrices, (int) getMc().mouse.getX(), (int) getMc().mouse.getY(), delta); + } + + @Inject(method = "mouseClicked", at = @At(value = "RETURN", shift = At.Shift.BEFORE)) + public void hookMouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + if (MainMenuHook.INSTANCE.mouseClicked((int) getMc().mouse.getX(), (int) getMc().mouse.getY(), button)) { + cir.setReturnValue(true); + } + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + if (MainMenuHook.INSTANCE.mouseScrolled((int) getMc().mouse.getX(), (int) getMc().mouse.getY(), (float) amount)) { + return true; + } + + return super.mouseScrolled(mouseX, mouseY, amount); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (MainMenuHook.INSTANCE.keyPressed(keyCode, scanCode, modifiers)) { + return true; + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean charTyped(char chr, int modifiers) { + MainMenuHook.INSTANCE.charTyped(chr, modifiers); + + return super.charTyped(chr, modifiers); + } + +} diff --git a/src/main/java/com/paragon/mixin/mixins/world/block/MixinAbstractBlockState.java b/src/main/java/com/paragon/mixin/mixins/world/block/MixinAbstractBlockState.java new file mode 100644 index 0000000..10ab6cc --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/world/block/MixinAbstractBlockState.java @@ -0,0 +1,26 @@ +package com.paragon.mixin.mixins.world.block; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.BlockAmbientLightLevelEvent; +import net.minecraft.block.AbstractBlock.AbstractBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author aesthetical + * @since 02/20/23 + */ +@Mixin(AbstractBlockState.class) +public class MixinAbstractBlockState { + @Inject(method = "getAmbientOcclusionLightLevel", at = @At("RETURN"), cancellable = true) + public void hookGetAmbientOcclusionLightLevel(BlockView world, BlockPos pos, CallbackInfoReturnable info) { + BlockAmbientLightLevelEvent event = new BlockAmbientLightLevelEvent(pos, info.getReturnValue()); + if (Paragon.bus.post(event)) { + info.setReturnValue(event.getLightLevel()); + } + } +} diff --git a/src/main/java/com/paragon/mixin/mixins/world/block/MixinBlock.java b/src/main/java/com/paragon/mixin/mixins/world/block/MixinBlock.java new file mode 100644 index 0000000..5e47183 --- /dev/null +++ b/src/main/java/com/paragon/mixin/mixins/world/block/MixinBlock.java @@ -0,0 +1,30 @@ +package com.paragon.mixin.mixins.world.block; + +import com.paragon.Paragon; +import com.paragon.backend.event.events.render.DrawSideOfBlockEvent; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * @author aesthetical + * @since 02/20/23 + */ +@Mixin(Block.class) +public class MixinBlock { + + @Inject(method = "shouldDrawSide", at = @At("RETURN"), cancellable = true) + private static void shouldDrawSide(BlockState state, BlockView world, BlockPos pos, Direction side, BlockPos otherPos, CallbackInfoReturnable info) { + DrawSideOfBlockEvent event = new DrawSideOfBlockEvent(state.getBlock(), pos, state, info.getReturnValue()); + if (Paragon.bus.post(event)) { + info.setReturnValue(event.getDrawSide()); + } + } + +} diff --git a/src/main/kotlin/com/paragon/Paragon.kt b/src/main/kotlin/com/paragon/Paragon.kt new file mode 100644 index 0000000..3e811a2 --- /dev/null +++ b/src/main/kotlin/com/paragon/Paragon.kt @@ -0,0 +1,98 @@ +package com.paragon + +import com.paragon.backend.Feature +import com.paragon.backend.event.EventProcessor +import com.paragon.backend.managers.* +import com.paragon.backend.managers.placement.PlacementManager +import com.paragon.backend.module.Module +import com.paragon.client.modules.visual.ClickGUI +import com.paragon.client.ui.configuration.aesthetical.AestheticalUI +import com.paragon.client.ui.configuration.surge.SurgeUI +import com.paragon.util.BuildConfig.BuildConfig +import com.paragon.util.io.FileUtil +import me.bush.eventbus.bus.EventBus +import net.fabricmc.api.ClientModInitializer +import org.slf4j.LoggerFactory +import kotlin.math.log + +/** + * @author surge + * @since 19/02/2023 + */ +class Paragon : ClientModInitializer { + + override fun onInitializeClient() { + logger.info("Initialising Paragon") + + if (!FileUtil.PARAGON_PATH.exists()) { + logger.info("Created ${FileUtil.PARAGON_PATH} ${if (FileUtil.PARAGON_PATH.mkdir()) "successfully" else "unsuccessfully"}") + } + + logger.info("Initialising event bus") + bus = EventBus() + processor = EventProcessor() + + logger.info("Initialising config manager") + configManager = ConfigManager() + + logger.info("Initialising keyboard manager") + keyboardManager = KeyboardManager() + + logger.info("Initialising toast manager") + toastManager = ToastManager() + + logger.info("Initialising baritone manager") + baritoneManager = BaritoneManager() + + logger.info("Initialising module manager") + moduleManager = ModuleManager() + + logger.info("Initialising command manager") + commandManager = CommandManager() + + logger.info("Initialising rotation manager") + rotationManager = RotationManager() + + logger.info("Initialising inventory manager") + inventoryManager = InventoryManager() + + logger.info("Initialising alt manager") + altManager = AltManager() + + logger.info("Initialising placement manager") + placementManager = PlacementManager() + + logger.info("Loading configurations & data") + moduleManager.load("current") + configManager.loadAll() + + logger.info("Running post load methods") + moduleManager.modules.forEach(Feature::postLoad) + + logger.info("Initialising uis") + ClickGUI.surgeUi = SurgeUI() + ClickGUI.aestheticalUI = AestheticalUI() + + logger.info("Initialised Paragon $version") + } + + companion object { + @JvmStatic val version: String = BuildConfig.VERSION + @JvmStatic var logger = LoggerFactory.getLogger("paragon") + + @JvmStatic lateinit var bus: EventBus + @JvmStatic lateinit var processor: EventProcessor + + @JvmStatic lateinit var keyboardManager: KeyboardManager + @JvmStatic lateinit var moduleManager: ModuleManager + @JvmStatic lateinit var commandManager: CommandManager + @JvmStatic lateinit var rotationManager: RotationManager + @JvmStatic lateinit var inventoryManager: InventoryManager + @JvmStatic lateinit var toastManager: ToastManager + @JvmStatic lateinit var configManager: ConfigManager + @JvmStatic lateinit var altManager: AltManager + @JvmStatic lateinit var baritoneManager: BaritoneManager + @JvmStatic lateinit var placementManager: PlacementManager + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/Feature.kt b/src/main/kotlin/com/paragon/backend/Feature.kt new file mode 100644 index 0000000..e4bfa02 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/Feature.kt @@ -0,0 +1,13 @@ +package com.paragon.backend + +import com.paragon.backend.setting.SettingContainer + +/** + * @author surge + * @since 11/02/2023 + */ +open class Feature(val name: String, val description: String) : SettingContainer() { + + open fun postLoad() {} + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/ToggleFeature.kt b/src/main/kotlin/com/paragon/backend/ToggleFeature.kt new file mode 100644 index 0000000..33cf5a7 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/ToggleFeature.kt @@ -0,0 +1,25 @@ +package com.paragon.backend + +/** + * @author aesthetical + * @since 02/17/23 + */ +open class ToggleFeature(name: String, description: String) : Feature(name, description) { + + var isEnabled = false + protected set + + open fun enable() {} + open fun disable() {} + + open fun setState(state: Boolean) { + isEnabled = state + + if (state) { + enable() + } else { + disable() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/alt/Alt.kt b/src/main/kotlin/com/paragon/backend/alt/Alt.kt new file mode 100644 index 0000000..8ebf2bc --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/alt/Alt.kt @@ -0,0 +1,32 @@ +package com.paragon.backend.alt + +import net.minecraft.client.util.Session +import net.minecraft.client.util.Session.AccountType + +/** + * @author surge + * @since 02/22/23 + */ +data class Alt(val email: String, val password: String?) { + + var accountType: AccountType = AccountType.MSA + + init { + if (password.isNullOrEmpty()) { + accountType = AccountType.LEGACY + } + } + + var refreshToken: String? = null + set(value) { + if (accountType != AccountType.MSA) { + throw IllegalStateException("Cannot set refresh token for a non MSA account") + } + + field = value + } + + var session: Session? = null + var cachedUsername = email + +} diff --git a/src/main/kotlin/com/paragon/backend/bind/Bind.kt b/src/main/kotlin/com/paragon/backend/bind/Bind.kt new file mode 100644 index 0000000..a7a83a6 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/bind/Bind.kt @@ -0,0 +1,306 @@ +package com.paragon.backend.bind + +import com.paragon.backend.ToggleFeature +import org.lwjgl.glfw.GLFW +import java.util.* + +/** + * @author surge, aesthetical + * @since 11/02/2023 + */ +class Bind(val feature: ToggleFeature, var type: DeviceType = DeviceType.KEYBOARD, var code: Int = GLFW.GLFW_KEY_UNKNOWN) { + + private var inhibitor: BindInhibitor? = null + + var state = false + set(state) { + field = state + + if (inhibitor != null) { + inhibitor!!.act(feature, this) + } + } + + var isPersistent = true + + fun setInhibitor(inhibitor: BindInhibitor) { + this.inhibitor = inhibitor + } + + override fun toString(): String { + return when (type) { + DeviceType.MOUSE -> getMouseName(code) + DeviceType.KEYBOARD -> getKeyName(code) + else -> "?" + } + } + + companion object { + /** + * Completely and utterly YOINKED from meteor + */ + fun getKeyName(key: Int): String { + return when (key) { + GLFW.GLFW_KEY_UNKNOWN -> { + "None" + } + + GLFW.GLFW_KEY_ESCAPE -> { + "Esc" + } + + GLFW.GLFW_KEY_GRAVE_ACCENT -> { + "Grave Accent" + } + + GLFW.GLFW_KEY_WORLD_1 -> { + "World 1" + } + + GLFW.GLFW_KEY_WORLD_2 -> { + "World 2" + } + + GLFW.GLFW_KEY_PRINT_SCREEN -> { + "Print Screen" + } + + GLFW.GLFW_KEY_PAUSE -> { + "Pause" + } + + GLFW.GLFW_KEY_INSERT -> { + "Insert" + } + + GLFW.GLFW_KEY_DELETE -> { + "Delete" + } + + GLFW.GLFW_KEY_HOME -> { + "Home" + } + + GLFW.GLFW_KEY_PAGE_UP -> { + "Page Up" + } + + GLFW.GLFW_KEY_PAGE_DOWN -> { + "Page Down" + } + + GLFW.GLFW_KEY_END -> { + "End" + } + + GLFW.GLFW_KEY_TAB -> { + "Tab" + } + + GLFW.GLFW_KEY_LEFT_CONTROL -> { + "Left Control" + } + + GLFW.GLFW_KEY_RIGHT_CONTROL -> { + "Right Control" + } + + GLFW.GLFW_KEY_LEFT_ALT -> { + "Left Alt" + } + + GLFW.GLFW_KEY_RIGHT_ALT -> { + "Right Alt" + } + + GLFW.GLFW_KEY_LEFT_SHIFT -> { + "Left Shift" + } + + GLFW.GLFW_KEY_RIGHT_SHIFT -> { + "Right Shift" + } + + GLFW.GLFW_KEY_UP -> { + "Arrow Up" + } + + GLFW.GLFW_KEY_DOWN -> { + "Arrow Down" + } + + GLFW.GLFW_KEY_LEFT -> { + "Arrow Left" + } + + GLFW.GLFW_KEY_RIGHT -> { + "Arrow Right" + } + + GLFW.GLFW_KEY_APOSTROPHE -> { + "Apostrophe" + } + + GLFW.GLFW_KEY_BACKSPACE -> { + "Backspace" + } + + GLFW.GLFW_KEY_CAPS_LOCK -> { + "Caps Lock" + } + + GLFW.GLFW_KEY_MENU -> { + "Menu" + } + + GLFW.GLFW_KEY_LEFT_SUPER -> { + "Left Super" + } + + GLFW.GLFW_KEY_RIGHT_SUPER -> { + "Right Super" + } + + GLFW.GLFW_KEY_ENTER -> { + "Enter" + } + + GLFW.GLFW_KEY_KP_ENTER -> { + "Numpad Enter" + } + + GLFW.GLFW_KEY_NUM_LOCK -> { + "Num Lock" + } + + GLFW.GLFW_KEY_SPACE -> { + "Space" + } + + GLFW.GLFW_KEY_F1 -> { + "F1" + } + + GLFW.GLFW_KEY_F2 -> { + "F2" + } + + GLFW.GLFW_KEY_F3 -> { + "F3" + } + + GLFW.GLFW_KEY_F4 -> { + "F4" + } + + GLFW.GLFW_KEY_F5 -> { + "F5" + } + + GLFW.GLFW_KEY_F6 -> { + "F6" + } + + GLFW.GLFW_KEY_F7 -> { + "F7" + } + + GLFW.GLFW_KEY_F8 -> { + "F8" + } + + GLFW.GLFW_KEY_F9 -> { + "F9" + } + + GLFW.GLFW_KEY_F10 -> { + "F10" + } + + GLFW.GLFW_KEY_F11 -> { + "F11" + } + + GLFW.GLFW_KEY_F12 -> { + "F12" + } + + GLFW.GLFW_KEY_F13 -> { + "F13" + } + + GLFW.GLFW_KEY_F14 -> { + "F14" + } + + GLFW.GLFW_KEY_F15 -> { + "F15" + } + + GLFW.GLFW_KEY_F16 -> { + "F16" + } + + GLFW.GLFW_KEY_F17 -> { + "F17" + } + + GLFW.GLFW_KEY_F18 -> { + "F18" + } + + GLFW.GLFW_KEY_F19 -> { + "F19" + } + + GLFW.GLFW_KEY_F20 -> { + "F20" + } + + GLFW.GLFW_KEY_F21 -> { + "F21" + } + + GLFW.GLFW_KEY_F22 -> { + "F22" + } + + GLFW.GLFW_KEY_F23 -> { + "F23" + } + + GLFW.GLFW_KEY_F24 -> { + "F24" + } + + GLFW.GLFW_KEY_F25 -> { + "F25" + } + + else -> { + val keyName = GLFW.glfwGetKeyName(key, 0) ?: return "None" + keyName.uppercase(Locale.getDefault()) + } + } + } + + fun getMouseName(button: Int): String { + return if (button == GLFW.GLFW_KEY_UNKNOWN) { + "None" + } else when (button) { + 0 -> "Left Click" + 1 -> "Right Click" + 2 -> "Middle Click" + else -> "MButton " + (button + 1) + } + + // ima need some whiskey glasses... + // cause ion wanna see the truth + // shes prolly making out on the couch right now + // with someone newwwwwwwwww + + // TODO: Add more mouse names + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/bind/BindInhibitor.kt b/src/main/kotlin/com/paragon/backend/bind/BindInhibitor.kt new file mode 100644 index 0000000..957e30e --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/bind/BindInhibitor.kt @@ -0,0 +1,11 @@ +package com.paragon.backend.bind + +import com.paragon.backend.Feature + +/** + * @author aesthetical + * @since 02/17/23 + */ +fun interface BindInhibitor { + fun act(feature: Feature, bind: Bind) +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/bind/DeviceType.kt b/src/main/kotlin/com/paragon/backend/bind/DeviceType.kt new file mode 100644 index 0000000..4d8a732 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/bind/DeviceType.kt @@ -0,0 +1,11 @@ +package com.paragon.backend.bind + +/** + * @author aesthetical + * @since 02/17/23 + */ +enum class DeviceType { + KEYBOARD, + MOUSE, + UNKNOWN +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/command/Command.kt b/src/main/kotlin/com/paragon/backend/command/Command.kt new file mode 100644 index 0000000..9646fe7 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/command/Command.kt @@ -0,0 +1,18 @@ +package com.paragon.backend.command + +import com.mojang.brigadier.Command.SINGLE_SUCCESS +import com.mojang.brigadier.builder.LiteralArgumentBuilder + +/** + * @author aesthetical + * @since 02/24/23 + */ +abstract class Command(val aliases: Array, val description: String = "No command description provided", val usage: String = "") { + + abstract fun run(ctx: LiteralArgumentBuilder) + + companion object { + const val SUCCESS = SINGLE_SUCCESS + const val INVALID_USAGE = SINGLE_SUCCESS + 1 + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/command/argument/EnumArgumentType.kt b/src/main/kotlin/com/paragon/backend/command/argument/EnumArgumentType.kt new file mode 100644 index 0000000..f9d1daa --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/command/argument/EnumArgumentType.kt @@ -0,0 +1,41 @@ +package com.paragon.backend.command.argument + +import com.mojang.brigadier.StringReader +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.context.CommandContext +import com.mojang.brigadier.exceptions.CommandExceptionType +import com.mojang.brigadier.exceptions.CommandSyntaxException + +/** + * @author aesthetical + * @since 02/26/23 + */ +class EnumArgumentType>(private val enum: Class) : ArgumentType>, CommandExceptionType { + override fun parse(reader: StringReader): T { + val input = reader.readString() + if (input.isNullOrEmpty()) { + throw CommandSyntaxException(this) { "Cannot be null or empty" } + } + + for (constant in enum.enumConstants) { + if (input.equals(constant.toString(), ignoreCase = true)) { + return constant + } + } + + throw CommandSyntaxException(this) { "\"$input\" is not a valid enum type" } + } + + companion object { + + @JvmStatic + inline fun > enum(ctx: CommandContext, name: String): T { + return ctx.getArgument(name, Enum::class.java) as T + } + + @JvmStatic + inline fun > enum(enum: Class): EnumArgumentType { + return EnumArgumentType(enum) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/command/argument/ModuleArgumentType.kt b/src/main/kotlin/com/paragon/backend/command/argument/ModuleArgumentType.kt new file mode 100644 index 0000000..f5ef5a9 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/command/argument/ModuleArgumentType.kt @@ -0,0 +1,36 @@ +package com.paragon.backend.command.argument + +import com.mojang.brigadier.StringReader +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.context.CommandContext +import com.mojang.brigadier.exceptions.CommandExceptionType +import com.mojang.brigadier.exceptions.CommandSyntaxException +import com.paragon.Paragon +import com.paragon.backend.module.Module + +/** + * @author aesthetical + * @since 02/24/23 + */ +class ModuleArgumentType : ArgumentType, CommandExceptionType { + override fun parse(reader: StringReader): Module { + val s = reader.readString() + val parsed = s.lowercase().replace(" ", "") + return Paragon.moduleManager.getModules { + it.name.lowercase().replace(" ", "").equals(parsed, ignoreCase = true) + }.firstOrNull() ?: throw CommandSyntaxException(this) { "\"$s\" is a non-existent (null) module." } + } + + companion object { + + @JvmStatic + fun module(ctx: CommandContext, name: String): Module { + return ctx.getArgument(name, Module::class.java) + } + + @JvmStatic + fun module(): ModuleArgumentType { + return ModuleArgumentType() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/config/Config.kt b/src/main/kotlin/com/paragon/backend/config/Config.kt new file mode 100644 index 0000000..5a46941 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/config/Config.kt @@ -0,0 +1,29 @@ +package com.paragon.backend.config + +import com.paragon.Paragon +import com.paragon.util.io.FileUtil + +/** + * @author aesthetical + * @since 02/20/23 + */ +abstract class Config(path: String, create: Boolean = true) { + + val file = FileUtil.PARAGON_PATH.resolve(path) + + init { + if (create && !file.exists()) { + if (path.endsWith("/")) { + file.mkdirs() + } else { + file.createNewFile() + } + } + + Paragon.configManager.add(this) + } + + abstract fun save() + abstract fun load() + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/EventEra.kt b/src/main/kotlin/com/paragon/backend/event/EventEra.kt new file mode 100644 index 0000000..2afdf69 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/EventEra.kt @@ -0,0 +1,10 @@ +package com.paragon.backend.event + +/** + * @author surge + * @since 19/02/2023 + */ +enum class EventEra { + PRE, + POST +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/EventProcessor.kt b/src/main/kotlin/com/paragon/backend/event/EventProcessor.kt new file mode 100644 index 0000000..a417ca7 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/EventProcessor.kt @@ -0,0 +1,31 @@ +package com.paragon.backend.event + +import com.paragon.Paragon +import com.paragon.Paragon.Companion.version +import com.paragon.backend.event.events.mc.ShutdownEvent +import com.paragon.backend.event.events.mc.TitleEvent +import com.paragon.util.rendering.NVGWrapper +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 19/02/2023 + */ +class EventProcessor { + + init { + Paragon.bus.subscribe(this) + } + + @EventListener + fun onTitle(event: TitleEvent) { + event.title = "Paragon v" + version + " | " + String(TitleEvent.funnyArrays[(Math.random() * TitleEvent.funnyArrays.size).toInt()]) + } + + @EventListener + fun onShutdown(event: ShutdownEvent) { + NVGWrapper.terminate() + Paragon.moduleManager.save("current") + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTickEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTickEvent.kt new file mode 100644 index 0000000..5e8181f --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTickEvent.kt @@ -0,0 +1,17 @@ +package com.paragon.backend.event.events.entity + +import com.paragon.backend.event.EventEra +import me.bush.eventbus.event.Event +import net.minecraft.entity.LivingEntity + +/** + * @author aesthetical + * @since 02/19/23 + */ +class EntityTickEvent(val era: EventEra, val entity: LivingEntity) : Event() { + + override fun isCancellable(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTraceEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTraceEvent.kt new file mode 100644 index 0000000..57aa2bc --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/entity/EntityTraceEvent.kt @@ -0,0 +1,14 @@ +package com.paragon.backend.event.events.entity + +import me.bush.eventbus.event.Event +import net.minecraft.util.hit.HitResult + +/** + * @author surge + * @since 28/02/2023 + */ +class EntityTraceEvent(val result: HitResult?) : Event() { + + override fun isCancellable() = true + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/entity/RaycastEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/entity/RaycastEvent.kt new file mode 100644 index 0000000..886bd17 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/entity/RaycastEvent.kt @@ -0,0 +1,13 @@ +package com.paragon.backend.event.events.entity + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 13/03/2023 + */ +class RaycastEvent(var distance: Double, var tickDelta: Float, var includeFluids: Boolean) : Event() { + + override fun isCancellable() = false + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/input/control/AttackBlockEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/input/control/AttackBlockEvent.kt new file mode 100644 index 0000000..667e61f --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/input/control/AttackBlockEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.input.control + +import me.bush.eventbus.event.Event +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction + +/** + * @author aesthetical + * @since 02/20/23 + */ +class AttackBlockEvent(val blockPos: BlockPos, val direction: Direction) : Event() { + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/input/control/ItemSlowdownEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/input/control/ItemSlowdownEvent.kt new file mode 100644 index 0000000..93f68ad --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/input/control/ItemSlowdownEvent.kt @@ -0,0 +1,11 @@ +package com.paragon.backend.event.events.input.control + +import me.bush.eventbus.event.Event +import net.minecraft.client.network.ClientPlayerEntity + +class ItemSlowdownEvent(@JvmField val entity: ClientPlayerEntity) : Event() { + + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/input/control/SneakSlowdownEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/input/control/SneakSlowdownEvent.kt new file mode 100644 index 0000000..47ba58e --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/input/control/SneakSlowdownEvent.kt @@ -0,0 +1,11 @@ +package com.paragon.backend.event.events.input.control + +import me.bush.eventbus.event.Event +import net.minecraft.client.network.ClientPlayerEntity + +class SneakSlowdownEvent(@JvmField val entity: ClientPlayerEntity) : Event() { + + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/input/io/KeyEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/input/io/KeyEvent.kt new file mode 100644 index 0000000..bf9b31b --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/input/io/KeyEvent.kt @@ -0,0 +1,14 @@ +package com.paragon.backend.event.events.input.io + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 11/02/2023 + */ +class KeyEvent(@JvmField val code: Int, @JvmField val action: Int) : Event() { + + override fun isCancellable(): Boolean { + return false + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/input/io/MouseEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/input/io/MouseEvent.kt new file mode 100644 index 0000000..0d3654e --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/input/io/MouseEvent.kt @@ -0,0 +1,14 @@ +package com.paragon.backend.event.events.input.io + +import me.bush.eventbus.event.Event + +/** + * @author aesthetical + * @since 02/17/23 + */ +class MouseEvent(@JvmField val button: Int, @JvmField val action: Int) : Event() { + + override fun isCancellable(): Boolean { + return false + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/mc/ShutdownEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/mc/ShutdownEvent.kt new file mode 100644 index 0000000..22068ed --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/mc/ShutdownEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.mc + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 20/02/2023 + */ +class ShutdownEvent : Event() { + + override fun isCancellable(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/mc/TickEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/mc/TickEvent.kt new file mode 100644 index 0000000..e91d3b1 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/mc/TickEvent.kt @@ -0,0 +1,13 @@ +package com.paragon.backend.event.events.mc + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 11/02/2023 + */ +class TickEvent : Event() { + + override fun isCancellable() = false + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/mc/TitleEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/mc/TitleEvent.kt new file mode 100644 index 0000000..f2c2190 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/mc/TitleEvent.kt @@ -0,0 +1,681 @@ +package com.paragon.backend.event.events.mc + +import me.bush.eventbus.event.Event +import java.util.* + +class TitleEvent(@JvmField var title: String) : Event() { + + override fun isCancellable(): Boolean { + return false + } + + companion object { + val funnyArrays: List = ArrayList( + listOf( + byteArrayOf(115, 117, 114, 103, 101, 32, 108, 105, 107, 101, 115, 32, 100, 105, 99, 107), + byteArrayOf(106, 101, 115, 115, 32, 105, 115, 32, 116, 97, 108, 108), + byteArrayOf( + 118, + 101, + 114, + 117, + 115, + 32, + 97, + 105, + 114, + 108, + 105, + 110, + 101, + 115, + 32, + 115, + 105, + 110, + 99, + 101, + 32, + 50, + 48, + 49, + 57 + ), + byteArrayOf( + 112, + 97, + 114, + 97, + 103, + 111, + 110, + 32, + 115, + 116, + 97, + 121, + 32, + 119, + 105, + 110, + 110, + 105, + 110, + 103 + ), + byteArrayOf( + 112, + 97, + 115, + 116, + 105, + 110, + 103, + 32, + 102, + 117, + 116, + 117, + 114, + 101, + 32, + 99, + 108, + 105, + 101, + 110, + 116 + ), + byteArrayOf( + 100, + 117, + 109, + 112, + 105, + 110, + 103, + 32, + 107, + 111, + 110, + 97, + 115, + 32, + 40, + 99, + 108, + 97, + 115, + 115, + 32, + 56, + 56, + 56, + 53, + 47, + 49, + 50, + 53, + 56, + 53, + 41 + ), + byteArrayOf(99, 104, 105, 99, 107, 32, 119, 105, 116, 104, 32, 97, 32, 100, 105, 99, 107), + byteArrayOf(112, 97, 115, 116, 105, 110, 103, 32, 115, 105, 110, 99, 101, 32, 50, 48, 49, 52), + byteArrayOf( + 112, + 97, + 99, + 107, + 101, + 116, + 102, + 108, + 121, + 105, + 110, + 103, + 32, + 119, + 105, + 116, + 104, + 32, + 115, + 107, + 105, + 100, + 100, + 101, + 100, + 32, + 107, + 111, + 110, + 97, + 115, + 32, + 112, + 97, + 99, + 107, + 101, + 116, + 102, + 108, + 121 + ), + byteArrayOf( + 115, + 101, + 110, + 100, + 105, + 110, + 103, + 32, + 114, + 101, + 113, + 117, + 101, + 115, + 116, + 32, + 116, + 111, + 32, + 99, + 104, + 101, + 99, + 107, + 105, + 112, + 46, + 97, + 109, + 97, + 122, + 111, + 110, + 97, + 119, + 115, + 46, + 99, + 111, + 109, + 46, + 46, + 46 + ), + byteArrayOf( + 115, + 110, + 111, + 114, + 116, + 105, + 110, + 103, + 32, + 99, + 111, + 107, + 101, + 32, + 111, + 102, + 102, + 32, + 97, + 32, + 115, + 116, + 114, + 105, + 112, + 112, + 101, + 114, + 32, + 97, + 115, + 115 + ), + byteArrayOf( + 102, + 101, + 101, + 100, + 105, + 110, + 103, + 32, + 104, + 97, + 117, + 115, + 101, + 109, + 97, + 115, + 116, + 101, + 114, + 115, + 32, + 99, + 111, + 107, + 101, + 32, + 97, + 100, + 100, + 105, + 99, + 116, + 105, + 111, + 110 + ), + byteArrayOf( + 99, + 114, + 121, + 105, + 110, + 103, + 32, + 111, + 118, + 101, + 114, + 32, + 97, + 32, + 103, + 114, + 105, + 101, + 102, + 101, + 100, + 32, + 98, + 108, + 111, + 99, + 107, + 32, + 103, + 97, + 109, + 101, + 32, + 98, + 97, + 115, + 101 + ), + byteArrayOf( + 77, + 89, + 32, + 69, + 78, + 68, + 75, + 82, + 73, + 83, + 84, + 65, + 76, + 46, + 77, + 69, + 32, + 66, + 65, + 83, + 69, + 32, + 73, + 83, + 32, + 66, + 69, + 84, + 84, + 69, + 82, + 33, + 33, + 33, + 33 + ), + byteArrayOf(98, 114, 111, 32, 49, 118, 49, 32, 111, 110, 32, 99, 99, 32, 114, 110), + byteArrayOf( + 114, + 101, + 118, + 101, + 114, + 116, + 105, + 110, + 103, + 32, + 65, + 108, + 112, + 104, + 97, + 115, + 32, + 83, + 116, + 97, + 99, + 107, + 101, + 100, + 32, + 51, + 50, + 107, + 115 + ), + byteArrayOf( + 109, + 97, + 107, + 105, + 110, + 103, + 32, + 74, + 101, + 115, + 115, + 32, + 98, + 108, + 111, + 99, + 107, + 32, + 109, + 101 + ), + byteArrayOf( + 99, + 97, + 117, + 115, + 105, + 110, + 103, + 32, + 109, + 105, + 110, + 111, + 114, + 32, + 105, + 110, + 99, + 111, + 110, + 118, + 101, + 110, + 105, + 101, + 110, + 99, + 101, + 115 + ), + byteArrayOf( + 98, + 97, + 105, + 116, + 105, + 110, + 103, + 32, + 107, + 105, + 100, + 115, + 32, + 111, + 110, + 32, + 50, + 98, + 50, + 116, + 112, + 118, + 112, + 46, + 110, + 101, + 116 + ), + byteArrayOf( + 99, + 114, + 121, + 105, + 110, + 103, + 32, + 111, + 118, + 101, + 114, + 32, + 99, + 104, + 105, + 110, + 97, + 119, + 97, + 114, + 101, + 46, + 99, + 99, + 32, + 108, + 101, + 97, + 107 + ), + byteArrayOf( + 110, + 111, + 33, + 33, + 33, + 32, + 105, + 32, + 100, + 105, + 100, + 110, + 116, + 32, + 112, + 97, + 115, + 116, + 101, + 32, + 102, + 114, + 111, + 109, + 32, + 112, + 104, + 111, + 98, + 111, + 115, + 33, + 33, + 33, + 32, + 105, + 32, + 99, + 104, + 97, + 110, + 103, + 101, + 100, + 32, + 116, + 104, + 101, + 32, + 118, + 97, + 114, + 105, + 97, + 98, + 108, + 101, + 32, + 110, + 97, + 109, + 101, + 115, + 33, + 33, + 33, + 33 + ), + byteArrayOf( + 105, + 110, + 115, + 117, + 108, + 116, + 105, + 110, + 103, + 32, + 119, + 101, + 108, + 115, + 104, + 32, + 112, + 101, + 111, + 112, + 108, + 101 + ), + byteArrayOf( + 109, + 97, + 107, + 105, + 110, + 103, + 32, + 102, + 117, + 110, + 32, + 111, + 102, + 32, + 102, + 114, + 101, + 101, + 100, + 111, + 109, + 32, + 117, + 110, + 105, + 116, + 115 + ), + byteArrayOf( + 115, + 101, + 110, + 100, + 105, + 110, + 103, + 32, + 100, + 111, + 117, + 98, + 108, + 101, + 32, + 116, + 104, + 101, + 32, + 112, + 97, + 99, + 107, + 101, + 116, + 115, + 32, + 116, + 111, + 32, + 100, + 111, + 32, + 100, + 111, + 117, + 98, + 108, + 101, + 32, + 116, + 104, + 101, + 32, + 100, + 97, + 109, + 97, + 103, + 101 + ) + ) + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/move/MoveEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/move/MoveEvent.kt new file mode 100644 index 0000000..8d37d6d --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/move/MoveEvent.kt @@ -0,0 +1,41 @@ +package com.paragon.backend.event.events.move + +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.MoveUtil.strafe +import me.bush.eventbus.event.Event +import net.minecraft.util.math.Vec3d + +/** + * @author aesthetical + * @since 02/18/23 + */ +class MoveEvent(val motionVec: Vec3d) : Event() { + + fun setX(x: Double) { + (motionVec as IVec3d).setX(x) + } + + fun setY(y: Double) { + (motionVec as IVec3d).setY(y) + } + + fun setZ(z: Double) { + (motionVec as IVec3d).setZ(z) + } + + fun nullOutVelocity() { + setX(0.0) + setZ(0.0) + } + + fun setSpeed(speed: Double) { + val strafe = strafe(speed) + setX(strafe[0]) + setZ(strafe[1]) + } + + override fun isCancellable(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/move/MoveUpdateEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/move/MoveUpdateEvent.kt new file mode 100644 index 0000000..ae54019 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/move/MoveUpdateEvent.kt @@ -0,0 +1,22 @@ +package com.paragon.backend.event.events.move + +import com.paragon.backend.event.EventEra +import me.bush.eventbus.event.Event + +/** + * @author aesthetical + * @since 02/17/23 + */ +class MoveUpdateEvent( + @JvmField val era: EventEra, + @JvmField var x: Double, + @JvmField var y: Double, + @JvmField var z: Double, + @JvmField var yaw: Float, + @JvmField var pitch: Float, + @JvmField var onGround: Boolean +) : Event() { + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/move/TridentVelocityEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/move/TridentVelocityEvent.kt new file mode 100644 index 0000000..a40ca3d --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/move/TridentVelocityEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.move + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 24/02/2023 + */ +class TridentVelocityEvent(var x: Double, var y: Double, var z: Double) : Event() { + + override fun isCancellable(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/net/PacketEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/net/PacketEvent.kt new file mode 100644 index 0000000..cc4c495 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/net/PacketEvent.kt @@ -0,0 +1,19 @@ +package com.paragon.backend.event.events.net + +import me.bush.eventbus.event.Event +import net.minecraft.network.Packet + +/** + * @author aesthetical + * @since 02/17/23 + */ +open class PacketEvent(val packet: Packet<*>) : Event() { + + override fun isCancellable(): Boolean { + return true + } + + class Inbound(packet: Packet<*>) : PacketEvent(packet) + class Outbound(packet: Packet<*>) : PacketEvent(packet) + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/paragon/SettingUpdateEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/paragon/SettingUpdateEvent.kt new file mode 100644 index 0000000..18350cd --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/paragon/SettingUpdateEvent.kt @@ -0,0 +1,14 @@ +package com.paragon.backend.event.events.paragon + +import com.paragon.backend.setting.Setting +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 11/02/2023 + */ +class SettingUpdateEvent(val setting: Setting<*>) : Event() { + + override fun isCancellable() = true + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/BlockAmbientLightLevelEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/BlockAmbientLightLevelEvent.kt new file mode 100644 index 0000000..67c0ebf --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/BlockAmbientLightLevelEvent.kt @@ -0,0 +1,14 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.util.math.BlockPos + +/** + * @author aesthetical + * @since 02/20/23 + */ +class BlockAmbientLightLevelEvent(val pos: BlockPos, var lightLevel: Float) : Event() { + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/ClipToSpaceEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/ClipToSpaceEvent.kt new file mode 100644 index 0000000..fa1ae92 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/ClipToSpaceEvent.kt @@ -0,0 +1,13 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event + +/** + * @author aesthetical + * @since 02/19/23 + */ +class ClipToSpaceEvent(var distance: Double) : Event() { + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/DrawSideOfBlockEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/DrawSideOfBlockEvent.kt new file mode 100644 index 0000000..f26f90a --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/DrawSideOfBlockEvent.kt @@ -0,0 +1,16 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.block.Block +import net.minecraft.block.BlockState +import net.minecraft.util.math.BlockPos + +/** + * @author aesthetical + * @since 02/20/23 + */ +class DrawSideOfBlockEvent(val block: Block, val pos: BlockPos, val state: BlockState, var drawSide: Boolean) : Event() { + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/FPSLimitEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/FPSLimitEvent.kt new file mode 100644 index 0000000..5ca17a1 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/FPSLimitEvent.kt @@ -0,0 +1,17 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 24/02/2023 + */ +class FPSLimitEvent : Event() { + + var limit: Int = 0 + + override fun isCancellable(): Boolean { + return true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/GameRenderEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/GameRenderEvent.kt new file mode 100644 index 0000000..5e0bb5a --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/GameRenderEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.client.util.math.MatrixStack + +/** + * @author surge, aesthetical + * @since 12/02/2023 + */ +class GameRenderEvent(@JvmField val matrices: MatrixStack, @JvmField val tickDelta: Float) : Event() { + + override fun isCancellable(): Boolean { + return false + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/GammaModifyEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/GammaModifyEvent.kt new file mode 100644 index 0000000..6c4df22 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/GammaModifyEvent.kt @@ -0,0 +1,10 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event + +class GammaModifyEvent(@JvmField var gamma: Float) : Event() { + + override fun isCancellable(): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/PreGameRenderEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/PreGameRenderEvent.kt new file mode 100644 index 0000000..8ee5339 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/PreGameRenderEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event + +/** + * @author surge + * @since 24/02/2023 + */ +class PreGameRenderEvent : Event() { + + override fun isCancellable(): Boolean { + return true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/RenderHUDEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/RenderHUDEvent.kt new file mode 100644 index 0000000..c7cf713 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/RenderHUDEvent.kt @@ -0,0 +1,15 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.client.util.math.MatrixStack + +/** + * @author aesthetical + * @since 02/17/23 + */ +class RenderHUDEvent(val stack: MatrixStack, val partialTicks: Float, @JvmField val width: Float, val height: Float) : Event() { + + override fun isCancellable(): Boolean { + return false + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/RenderNameplateEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/RenderNameplateEvent.kt new file mode 100644 index 0000000..8ddb777 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/RenderNameplateEvent.kt @@ -0,0 +1,16 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.client.network.AbstractClientPlayerEntity + +/** + * @author aesthetical + * @since 02/19/23 + */ +class RenderNameplateEvent(val entity: AbstractClientPlayerEntity) : Event() { + + override fun isCancellable(): Boolean { + return true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/event/events/render/SetScreenEvent.kt b/src/main/kotlin/com/paragon/backend/event/events/render/SetScreenEvent.kt new file mode 100644 index 0000000..3d97783 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/event/events/render/SetScreenEvent.kt @@ -0,0 +1,16 @@ +package com.paragon.backend.event.events.render + +import me.bush.eventbus.event.Event +import net.minecraft.client.gui.screen.Screen + +/** + * @author aesthetical + * @since 02/18/23 + */ +class SetScreenEvent(val current: Screen?, val input: Screen?) : Event() { + + override fun isCancellable(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/framebuffer/MultiSampledFramebuffer.kt b/src/main/kotlin/com/paragon/backend/framebuffer/MultiSampledFramebuffer.kt new file mode 100644 index 0000000..c4e72f4 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/framebuffer/MultiSampledFramebuffer.kt @@ -0,0 +1,152 @@ +package com.paragon.backend.framebuffer + +import com.mojang.blaze3d.platform.GlStateManager +import com.mojang.blaze3d.platform.GlStateManager.* +import com.mojang.blaze3d.systems.RenderSystem +import com.paragon.util.mc +import net.minecraft.client.gl.Framebuffer +import org.lwjgl.opengl.GL11 +import org.lwjgl.opengl.GL30 +import org.lwjgl.opengl.GL30.* + +/** + * Coffee Client's MSAA framebuffer used for reference because I have no fucking clue what I'm doing + * @author surge + * @since 17/02/2023 + */ +class MultiSampledFramebuffer(private val samples: Int) : Framebuffer(true) { + + private var rboColour = 0 + private var rboDepth = 0 + private var using = false + + init { + setClearColor(1f, 1f, 1f, 0f) + } + + override fun resize(width: Int, height: Int, getError: Boolean) { + if (textureWidth != width || textureHeight != height) { + super.resize(width, height, getError) + } + } + + override fun initFbo(width: Int, height: Int, getError: Boolean) { + RenderSystem.assertOnRenderThreadOrInit() + val maxSize = RenderSystem.maxSupportedTextureSize() + + require(!(width <= 0 || width > maxSize || height <= 0 || height > maxSize)) { "Window " + width + "x" + height + " size out of bounds (max. size: " + maxSize + ")" } + + viewportWidth = width + viewportHeight = height + textureWidth = width + textureHeight = height + + fbo = GL30.glGenFramebuffers() + + _glBindFramebuffer(GL_FRAMEBUFFER, fbo) + + rboColour = GL30.glGenRenderbuffers() + + _glBindRenderbuffer(GL_RENDERBUFFER, rboColour) + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL11.GL_RGBA8, width, height) + _glBindRenderbuffer(GL_RENDERBUFFER, 0) + + rboDepth = GL30.glGenRenderbuffers() + + _glBindRenderbuffer(GL_RENDERBUFFER, rboDepth) + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL11.GL_DEPTH_COMPONENT, width, height) + _glBindRenderbuffer(GL_RENDERBUFFER, 0) + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboColour) + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth) + + colorAttachment = mc.framebuffer.colorAttachment + depthAttachment = mc.framebuffer.depthAttachment + + checkFramebufferStatus() + this.clear(getError) + endRead() + } + + override fun delete() { + RenderSystem.assertOnRenderThreadOrInit() + endRead() + endWrite() + + if (fbo > -1) { + _glBindFramebuffer(GL_FRAMEBUFFER, 0) + GlStateManager._glDeleteFramebuffers(fbo) + fbo = -1 + } + + if (rboColour > -1) { + GlStateManager._glDeleteRenderbuffers(rboColour) + + rboColour = -1 + } + if (rboDepth > -1) { + GlStateManager._glDeleteRenderbuffers(rboDepth) + rboDepth = -1 + } + + colorAttachment = -1 + depthAttachment = -1 + textureWidth = -1 + textureHeight = -1 + } + + override fun beginWrite(setViewport: Boolean) { + super.beginWrite(setViewport) + + if (!using) { + ACTIVE.add(this) + using = true + } + } + + override fun endWrite() { + super.endWrite() + + if (using) { + ACTIVE.remove(this) + using = false + } + } + + companion object { + private const val MINIMUM = 2 + private val INSTANCES: MutableMap = HashMap() + private val ACTIVE: MutableList = ArrayList() + + fun getInstance(samples: Int): MultiSampledFramebuffer { + return INSTANCES.computeIfAbsent(samples) { x: Int? -> MultiSampledFramebuffer(samples) } + } + + @JvmStatic + fun use(block: Runnable) { + use(32.coerceAtMost(MINIMUM), mc.framebuffer, block) + } + + private fun use(samples: Int, main: Framebuffer, block: Runnable) { + RenderSystem.assertOnRenderThread() + + val framebuffer = getInstance(samples) + framebuffer.resize(main.textureWidth, main.textureHeight, true) + + _glBindFramebuffer(GL_READ_FRAMEBUFFER, main.fbo) + _glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer.fbo) + _glBlitFrameBuffer(0, 0, framebuffer.textureWidth, framebuffer.textureHeight, 0, 0, framebuffer.textureWidth, framebuffer.textureHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR) + + framebuffer.beginWrite(true) + block.run() + framebuffer.endWrite() + + _glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.fbo) + _glBindFramebuffer(GL_DRAW_FRAMEBUFFER, main.fbo) + _glBlitFrameBuffer(0, 0, framebuffer.textureWidth, framebuffer.textureHeight, 0, 0, framebuffer.textureWidth, framebuffer.textureHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR) + + framebuffer.clear(true) + main.beginWrite(false) + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/AltManager.kt b/src/main/kotlin/com/paragon/backend/managers/AltManager.kt new file mode 100644 index 0000000..1220bbd --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/AltManager.kt @@ -0,0 +1,164 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.alt.Alt +import com.paragon.backend.config.Config +import com.paragon.mixin.duck.IMinecraftClient +import com.paragon.util.backgroundThread +import com.paragon.util.io.FileUtil +import com.paragon.util.mc +import fr.litarvan.openauth.microsoft.MicrosoftAuthenticationException +import fr.litarvan.openauth.microsoft.MicrosoftAuthenticator +import net.minecraft.client.util.Session +import org.json.JSONObject +import java.util.* + +/** + * @author surge + * @since 22/02/2023 + */ +class AltManager { + + private val microshitAuth = MicrosoftAuthenticator() + val alts = mutableListOf() + + var status = "Logged in as ${mc.session.username}" + + init { + + object : Config("alts.json") { + override fun save() { + val json = JSONObject() + + alts.forEach { + val altJson = JSONObject() + altJson.put("password", it.password) + altJson.put("cachedUsername", it.cachedUsername) + + if (it.accountType == Session.AccountType.MSA && !it.refreshToken.isNullOrEmpty()) { + // TODO: don't store in plaintext + altJson.put("refreshToken", it.refreshToken) + } + + json.put(it.email, altJson) + } + + if (!file.exists()) { + file.createNewFile() + } + + FileUtil.write(file, json.toString(4)) + } + + override fun load() { + if (!file.exists()) { + return + } + + val content = FileUtil.read(file) + if (content.isNullOrEmpty()) { + return + } + + try { + val json = JSONObject(content) + + json.keySet().forEach { + val altJson = json.getJSONObject(it) + + val alt = Alt(it, altJson.getString("password")) + if (altJson.has("cachedUsername")) { + alt.cachedUsername = altJson.getString("cachedUsername") + } + + if (altJson.has("refreshToken") && alt.accountType == Session.AccountType.MSA) { + alt.refreshToken = altJson.getString("refreshToken") + } + + alts.add(alt) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + } + } + + fun login(alt: Alt) { + + // run in a different thread to not freeze up the main thread + backgroundThread { + when (alt.accountType) { + Session.AccountType.MSA -> { + if (alt.session == null) { + Paragon.logger.info("Logging in with ${alt.email}") + status = "Logging in with ${alt.cachedUsername}" + + if (alt.refreshToken.isNullOrEmpty()) { + try { + val result = microshitAuth.loginWithCredentials(alt.email, alt.password) // Get auth result + + // Set alt session + alt.refreshToken = result.refreshToken + alt.session = Session(result.profile.name, result.profile.id, result.accessToken, Optional.empty(), Optional.empty(), Session.AccountType.MSA) + + status = "Logged in as ${alt.cachedUsername}" + } catch (e: MicrosoftAuthenticationException) { + status = "Couldn't log in as ${alt.cachedUsername}" + e.printStackTrace() + return@backgroundThread + } + } else { + if (!loginWithRefreshToken(alt)) { + // re-login + Paragon.logger.info("Failed to use refresh token. Re-logging in") + alt.refreshToken = null + login(alt) + + return@backgroundThread + } + } + + } + } + + Session.AccountType.LEGACY -> { + alt.session = Session(alt.email, UUID.randomUUID().toString(), "", Optional.empty(), Optional.empty(), Session.AccountType.LEGACY) + status = "Logged in as ${alt.cachedUsername}" + return@backgroundThread + } + + else -> { + Paragon.logger.warn("Unknown state with alt ${alt.email}") + status = "Unknown state with ${alt.cachedUsername}" + return@backgroundThread + } + } + }.invokeOnCompletion { + alt.cachedUsername = alt.session!!.username + (mc as IMinecraftClient).setSession(alt.session) + } + } + + private fun loginWithRefreshToken(alt: Alt): Boolean { + if (alt.accountType != Session.AccountType.MSA || alt.refreshToken.isNullOrEmpty()) { + login(alt) + return false + } + + return try { + val result = microshitAuth.loginWithRefreshToken(alt.refreshToken) + + // Set alt session + alt.session = Session(result.profile.name, result.profile.id, result.accessToken, Optional.empty(), Optional.empty(), Session.AccountType.MSA) + status = "Logged in as ${alt.cachedUsername}" + + true + } catch (e: MicrosoftAuthenticationException) { + status = "Failed to log in as ${alt.cachedUsername}" + e.printStackTrace() + false + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/BaritoneManager.kt b/src/main/kotlin/com/paragon/backend/managers/BaritoneManager.kt new file mode 100644 index 0000000..b8c2cb7 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/BaritoneManager.kt @@ -0,0 +1,71 @@ +package com.paragon.backend.managers + +import baritone.api.BaritoneAPI +import baritone.api.Settings.Setting +import com.paragon.Paragon + +/** + * @author aesthetical + * @since 02/23/23 + */ +class BaritoneManager { + + private val saveStates = mutableMapOf() + + // TODO: Add ease of use methods here + + fun set(name: String, value: Any) { + val settingsProvider = BaritoneAPI.getSettings() + + try { + val field = settingsProvider.javaClass.getField(name) + val settingObject = field.get(settingsProvider) as Setting<*> + + if (saveStates.containsKey(name) && saveStates[name] == value) { + saveStates -= name + } else { + saveStates[name] = settingObject.value + } + + // fuck kotlin this piece of shit language oh my god + settingObject.javaClass.getField("value").set(settingObject, value) + } catch (e: Exception) { + Paragon.logger.warn("Tried to access baritone setting name $name while it does not exist") + } + } + + inline fun get(name: String): T? { + val settingsProvider = BaritoneAPI.getSettings() + + return try { + val field = settingsProvider.javaClass.getField(name) + val settingObject = field.get(settingsProvider) as Setting<*> + + settingObject.value as T + } catch (e: Exception) { + Paragon.logger.warn("Tried to access baritone setting name $name while it does not exist") + + null + } + } + + fun restoreValue(name: String) { + if (saveStates.containsKey(name)) { + set(name, saveStates[name]!!) + saveStates -= name + } + } + + fun restoreValues() { + if (saveStates.isNotEmpty()) { + println("Reverting ${saveStates.size} baritone state${if (saveStates.size != 1) "s" else ""} to previous states") + + for ((k, v) in saveStates) { + set(k, v) + } + + saveStates.clear() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/CommandManager.kt b/src/main/kotlin/com/paragon/backend/managers/CommandManager.kt new file mode 100644 index 0000000..9bbed20 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/CommandManager.kt @@ -0,0 +1,102 @@ +package com.paragon.backend.managers + +import com.mojang.brigadier.CommandDispatcher +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.exceptions.CommandSyntaxException +import com.paragon.Paragon +import com.paragon.backend.command.Command +import com.paragon.backend.config.Config +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.client.command.Configuration +import com.paragon.client.command.Drawn +import com.paragon.client.command.Prefix +import com.paragon.client.command.Toggle +import com.paragon.util.io.FileUtil +import com.paragon.util.mc +import com.paragon.util.print +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket + + +/** + * @author aesthetical + * @since 02/24/23 + */ +class CommandManager { + + private val dispatcher = CommandDispatcher() + val commandMap = mutableMapOf() + + var prefix = "." + + init { + Paragon.bus.subscribe(this) + + dispatcher.setConsumer { context, _, result -> + val command = commandMap[context.input.split(" ")[0]] + if (command == null) { + mc.inGameHud.print("Unknown command execution. Run ${prefix}help") + return@setConsumer + } + + when (result) { + Command.INVALID_USAGE -> mc.inGameHud.print("Incorrect usage. Usage: ${command.usage}") + } + } + + object : Config("command_prefix.txt") { + override fun save() { + FileUtil.write(file, prefix) + } + + override fun load() { + val content = FileUtil.read(file) + if (content.isNullOrEmpty()) { + return + } + + prefix = content.trim().replace(" ", "").replace("\n", "") + } + + } + + register(Configuration, Drawn, Prefix, Toggle) + + // TODO: command autocomplete in chat gui + } + + @EventListener + fun onPacketOutbound(event: PacketEvent.Outbound) { + if (event.packet is ChatMessageC2SPacket) { + val packet = event.packet + if (packet.chatMessage.startsWith(prefix)) { + + event.isCancelled = true + + try { + Paragon.logger.info("Dispatching command with input ${packet.chatMessage}") + dispatcher.execute(dispatcher.parse(packet.chatMessage.substring(prefix.length), Command.SUCCESS)) + } catch (e: CommandSyntaxException) { + mc.inGameHud.print(e.rawMessage.string) + } + + } + } + } + + private fun register(vararg commands: Command) { + + commands.forEach { command -> + command.aliases.forEach { + commandMap[it] = command + + val argumentBuilder = LiteralArgumentBuilder.literal(it) + .executes { return@executes Command.INVALID_USAGE } + + command.run(argumentBuilder) + dispatcher.register(argumentBuilder) + } + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/ConfigManager.kt b/src/main/kotlin/com/paragon/backend/managers/ConfigManager.kt new file mode 100644 index 0000000..a92b855 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/ConfigManager.kt @@ -0,0 +1,46 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.config.Config +import com.paragon.util.calculations.Timer + +/** + * @author aesthetical + * @since 02/20/23 + */ +class ConfigManager { + + private val configList = mutableListOf() + + init { + Runtime.getRuntime().addShutdownHook(Thread { + println("Saving ${configList.size} config${if (configList.size != 1) "s" else ""}...") + val timer = Timer() + timer.reset() + + for (config in configList) { + try { + config.save() + } catch (e: Exception) { + Paragon.logger.error("Exception while saving ${config}, stacktrace is below") + e.printStackTrace() + } + } + + val ms = timer.timeMs() + println("Saved data in ${ms}ms.") + + println("Reverting baritone states...") + Paragon.baritoneManager.restoreValues() + }) + } + + fun add(config: Config) { + configList.add(config) + } + + fun loadAll() { + configList.forEach { it.load() } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/InventoryManager.kt b/src/main/kotlin/com/paragon/backend/managers/InventoryManager.kt new file mode 100644 index 0000000..7f0528e --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/InventoryManager.kt @@ -0,0 +1,89 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.event.events.net.PacketEvent.Inbound +import com.paragon.backend.event.events.net.PacketEvent.Outbound +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.ItemStack +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket +import net.minecraft.network.packet.s2c.play.UpdateSelectedSlotS2CPacket + +/** + * @author aesthetical + * @since 02/18/23 + */ +class InventoryManager { + + /** + * The server-side slot. This allows us to keep track of silent swaps + */ + var serverSlot = -1 + private set + + /** + * If the player's inventory is opened + */ + private val openedInventory = false + + init { + Paragon.bus.subscribe(this) + } + + @EventListener + fun onPacketOutbound(event: Outbound) { + if (event.packet is UpdateSelectedSlotC2SPacket) { + serverSlot = event.packet.selectedSlot + } + } + + @EventListener + fun onPacketInbound(event: Inbound) { + // if for whatever reason the server decides to switch ur slot, here we go + if (event.packet is UpdateSelectedSlotS2CPacket) { + serverSlot = event.packet.slot + } + } + + /** + * Swaps to this slot server-side + * @param slot the slot to swap to + */ + fun swap(slot: Int) { + if (serverSlot != slot) { + mc.player!!.networkHandler.sendPacket(UpdateSelectedSlotC2SPacket(slot)) + } + } + + /** + * Syncs the server slot with the client slot + */ + fun sync() { + if (serverSlot != mc.player!!.inventory.selectedSlot) { + mc.player!!.networkHandler.sendPacket(UpdateSelectedSlotC2SPacket(mc.player!!.inventory.selectedSlot)) + } + } + + /** + * Checks if the [serverSlot] is not equal to the client slot + */ + val isDesynced: Boolean + get() { + return serverSlot != mc.player!!.inventory.selectedSlot + } + + val serverStack: ItemStack + get() { + if (serverSlot == -1) { + serverSlot = mc.player!!.inventory.selectedSlot + } + + return mc.player!!.inventory.main[serverSlot] + } + + val slot: Int + get() { + return if (serverSlot == -1) mc.player!!.inventory.selectedSlot else serverSlot + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/KeyboardManager.kt b/src/main/kotlin/com/paragon/backend/managers/KeyboardManager.kt new file mode 100644 index 0000000..30c5cf7 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/KeyboardManager.kt @@ -0,0 +1,143 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.bind.Bind +import com.paragon.backend.bind.DeviceType +import com.paragon.backend.config.Config +import com.paragon.backend.event.events.input.io.KeyEvent +import com.paragon.backend.event.events.input.io.MouseEvent +import com.paragon.backend.module.Module +import com.paragon.util.io.FileUtil +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import org.json.JSONObject +import org.lwjgl.glfw.GLFW +import java.util.concurrent.CopyOnWriteArrayList + +/** + * @author aesthetical + * @since 02/20/2023 + */ +class KeyboardManager { + + private val bindList = CopyOnWriteArrayList() + + init { + Paragon.bus.subscribe(this) + + object : Config("binds.json") { + + override fun save() { + val jsonObject = JSONObject() + + for (bind in bindList) { + val obj = JSONObject() + + if (bind.feature is Module) { + obj.put("featureType", "module") + } + + obj.put("code", bind.code) + obj.put("deviceType", bind.type.name) + obj.put("persistent", bind.isPersistent) + + jsonObject.put(bind.feature.name, obj) + } + + FileUtil.write(file, jsonObject.toString(4)) + } + + override fun load() { + val content = FileUtil.read(file) + + if (content.isNullOrEmpty()) { + return + } + + val jsonObject = JSONObject(content) + + for ((k, v) in jsonObject.toMap()) { + if (v !is HashMap<*, *>) { + continue + } + + if (!v.containsKey("featureType")) { + continue + } + + when (v["featureType"] as String) { + "module" -> { + val module = Paragon.moduleManager.modules.find { it.name.equals(k, ignoreCase = true) } + if (module == null) { + Paragon.logger.warn("Unknown module with name $k") + continue + } + + if (v.containsKey("code")) { + module.key.code = v["code"] as Int + } + + if (v.containsKey("deviceType")) { + module.key.type = DeviceType.valueOf((v["deviceType"] as String).uppercase()) + } + + if (v.containsKey("persistent")) { + module.key.isPersistent = v["persistent"] as Boolean + } + } + + "macro" -> Paragon.logger.warn("Modified binds file! Macros not implemented. Try later... ($k)") + else -> Paragon.logger.warn("Unknown feature type ${v["featureType"] as String}") + } + } + } + } + } + + @EventListener + fun onKey(event: KeyEvent) { + if (event.code == GLFW.GLFW_KEY_UNKNOWN || mc.currentScreen != null || event.action > 1) { + return + } + + bindList.forEach { bind -> + if (bind.code == event.code && bind.type == DeviceType.KEYBOARD) { + if (!bind.isPersistent) { + bind.state = event.action == GLFW.GLFW_PRESS + } else { + if (event.action == GLFW.GLFW_RELEASE) { + bind.state = !bind.state + } + } + } + } + } + + @EventListener + fun onMouse(event: MouseEvent) { + if (event.button == GLFW.GLFW_KEY_UNKNOWN || mc.currentScreen != null || event.action > 1) { + return + } + + bindList.forEach { bind -> + if (bind.code == event.button && bind.type == DeviceType.MOUSE) { + if (!bind.isPersistent) { + bind.state = event.action == GLFW.GLFW_PRESS + } else { + if (event.action == GLFW.GLFW_RELEASE) { + bind.state = !bind.state + } + } + } + } + } + + fun addBind(bind: Bind) { + bindList.add(bind) + + if (bind.type == DeviceType.UNKNOWN) { + Paragon.logger.warn("Bind with code {} signed to unknown device with feature {} linked", bind.code, bind.feature) + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/ModuleManager.kt b/src/main/kotlin/com/paragon/backend/managers/ModuleManager.kt new file mode 100644 index 0000000..afefe27 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/ModuleManager.kt @@ -0,0 +1,171 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.bind.Bind +import com.paragon.backend.module.Module +import com.paragon.client.modules.combat.* +import com.paragon.client.modules.exploit.Disabler +import com.paragon.client.modules.exploit.FastProjectile +import com.paragon.client.modules.exploit.PingSpoof +import com.paragon.client.modules.exploit.ThunderLocator +import com.paragon.client.modules.movement.* +import com.paragon.client.modules.player.* +import com.paragon.client.modules.visual.* +import com.paragon.util.io.FileUtil +import org.json.JSONObject +import java.nio.charset.Charset +import java.util.stream.Collectors + +/** + * @author surge + * @since 11/02/2023 + */ +class ModuleManager { + + val modules: List + + init { + Paragon.bus.subscribe(this) + + modules = listOf( + // Combat + Aura, + AutoTotem, + Burrow, + Criticals, + Velocity, + + // Exploit + Disabler, + FastProjectile, + PingSpoof, + ThunderLocator, + + // Movement + AntiVoid, + AutoJump, + ElytraFlight, + Flight, + InventoryMove, + LongJump, + NoFall, + NoSlowDown, + Speed, + Sprint, + Step, + TridentBoost, + + // Player + AirPlace, + AutoElytra, + AutoRespawn, + AutoTool, + BlockFly, + FakePlayer, + FastPlace, + GameSpeed, + LiquidPlace, + NoTrace, + PacketMine, + Replenish, + RotationLock, + Stealer, + + // Visual + ChinaHat, + ClickGUI, + ESP, + FullBright, + HoleESP, + HUD, + Tags, + Tracers, + Trajectories, + UnfocusedCPU, + ViewClip, + Xray + ) + + if (FileUtil.PARAGON_PATH.resolve("configs").exists()) { + FileUtil.PARAGON_PATH.resolve("configs").mkdir() + } + } + + fun load(name: String): String { + val file = FileUtil.PARAGON_PATH.resolve("configs").resolve("$name.json") + + if (!file.exists()) { + return "'$name.json' wasn't found in paragon/configs." + } + + val json = JSONObject(file.readText(Charset.defaultCharset())) + + val modules = json.getJSONObject("modules") ?: return "'modules' group wasn't found!" + + Paragon.moduleManager.modules.forEach { module -> + try { + val data = modules.getJSONObject(module.name) + + try { + module.setState(data.getBoolean("enabled")) + } catch (exception: Exception) { + Paragon.logger.warn("Failed to load state for ${module.name}") + } + + module.settingMap.forEach { (name, setting) -> + + if (setting.name == "Key" && setting.value is Bind) { + return@forEach + } + + try { + setting.load(data) + } catch (exception: Exception) { + Paragon.logger.warn("Failed to load $name") + } + } + } catch (exception: Exception) { + Paragon.logger.warn("Failed to load ${module.name}") + } + } + + return "Successfully loaded '$name.json'" + } + + fun save(name: String) { + val json = JSONObject() + val modules = JSONObject() + + Paragon.moduleManager.modules.forEach { module -> + val moduleJson = JSONObject() + + moduleJson.put("enabled", module.isEnabled) + + module.settingMap.forEach { (_, setting) -> + if (setting.name == "Key" && setting.value is Bind) { + return@forEach + } + + setting.write(moduleJson) + } + + modules.put(module.name, moduleJson) + } + + json.put("modules", modules) + json.put("version", Paragon.version) + + val file = FileUtil.PARAGON_PATH.resolve("configs").resolve("$name.json") + + if (!file.exists()) { + file.createNewFile() + } + + FileUtil.write(file, json.toString(4)) + } + + fun getModules(predicate: (Module) -> Boolean): List { + return modules.stream().filter(predicate).collect(Collectors.toList()) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/RotationManager.kt b/src/main/kotlin/com/paragon/backend/managers/RotationManager.kt new file mode 100644 index 0000000..8d45572 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/RotationManager.kt @@ -0,0 +1,120 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.event.EventEra +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.event.events.net.PacketEvent.Outbound +import com.paragon.mixin.duck.ILivingEntity +import com.paragon.util.calculations.Timer +import com.paragon.util.calculations.rotation.RotationUtil +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket +import net.minecraft.util.math.MathHelper + + +/** + * @author aesthetical + * @since 02/17/23 + */ +class RotationManager { + + private val releaseTimer: Timer + + val client: FloatArray + val server: FloatArray + + init { + Paragon.bus.subscribe(this) + + client = floatArrayOf(Float.NaN, Float.NaN) + server = floatArrayOf(0.0f, 0.0f) + releaseTimer = Timer() + } + + @EventListener + fun onPacketOutbound(event: Outbound) { + if (event.packet is PlayerMoveC2SPacket && event.packet.changesLook()) { + server[0] = event.packet.getYaw(mc.player!!.yaw) + server[1] = event.packet.getPitch(mc.player!!.pitch) + } + } + + @EventListener(recieveCancelled = true) + fun onMoveUpdate(event: MoveUpdateEvent) { + if (event.era == EventEra.PRE && mc.player != null) { + (mc.player as ILivingEntity?)!!.renderRotations[0] = server[0] + (mc.player as ILivingEntity?)!!.renderRotations[1] = server[1] + } + + if (RotationUtil.isValid(client)) { + if (releaseTimer.elapsed(KEEP_TIME.toDouble())) { + client[0] = Float.NaN + client[1] = Float.NaN + return + } + + event.yaw = client[0] + event.pitch = client[1] + event.isCancelled = true + + if (event.era == EventEra.PRE) { + rotateBody() + } + } + } + + private fun rotateBody() { + val xDiff = mc.player!!.x - mc.player!!.prevX + val yDiff = mc.player!!.z - mc.player!!.prevZ + + val distance = (xDiff * xDiff + yDiff * yDiff).toFloat() + var renderYawOffset = mc.player!!.bodyYaw + + if (distance > 0.0025000002f) { + renderYawOffset = Math.toDegrees(MathHelper.atan2(yDiff, xDiff)).toFloat() - 90.0f + } + + if (mc.player!!.handSwingProgress > 0.0f) { + renderYawOffset = client[0] + } + + val renderYawOffsetDiff = MathHelper.wrapDegrees(renderYawOffset - mc.player!!.bodyYaw) + mc.player!!.bodyYaw += renderYawOffsetDiff * 0.3f + + var rotationDiff = MathHelper.wrapDegrees(client[0] - mc.player!!.bodyYaw) + + if (rotationDiff < -75.0f) { + rotationDiff = -75.0f + } + + if (rotationDiff >= 75.0f) { + rotationDiff = 75.0f + } + + mc.player!!.bodyYaw = client[0] - rotationDiff + + if (rotationDiff * rotationDiff > 2500.0f) { + mc.player!!.bodyYaw += rotationDiff * 0.2f + } + } + + fun submit(yaw: Float, pitch: Float) { + releaseTimer.reset() + + client[0] = yaw + client[1] = pitch + } + + fun submit(f: FloatArray) { + releaseTimer.reset() + + client[0] = f[0] + client[1] = f[1] + } + + companion object { + private const val KEEP_TIME = 150L + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/ToastManager.kt b/src/main/kotlin/com/paragon/backend/managers/ToastManager.kt new file mode 100644 index 0000000..c40eea2 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/ToastManager.kt @@ -0,0 +1,74 @@ +package com.paragon.backend.managers + +import com.paragon.Paragon +import com.paragon.backend.event.events.render.RenderHUDEvent +import com.paragon.client.toasts.Toast +import com.paragon.client.toasts.ToastType +import com.paragon.util.rendering.NVGWrapper +import me.bush.eventbus.annotation.EventListener +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicInteger + +/** + * @author aesthetical + * @since 02/19/23 + */ +class ToastManager { + + private val toastMap: MutableMap = ConcurrentHashMap() + private val ID = AtomicInteger(0) + + init { + Paragon.bus.subscribe(this) + } + + @EventListener + fun onRenderHUD(event: RenderHUDEvent) { + NVGWrapper.scope { nvg -> + if (toastMap.isEmpty()) { + return@scope + } + + var posY = event.height - 56.0f + + for (id in toastMap.keys) { + val toast = toastMap[id] + + if (toast == null || toast.isDead) { + toastMap.remove(id) + continue + } + + toast.updateAndRender(nvg, posY, event.width) + posY -= (56.0f * toast.animation.animationFactor.toFloat()) + } + } + } + + fun info(deployer: String, content: String, lifespan: Long) { + add(ID.getAndIncrement(), Toast(ToastType.INFO, deployer, content, lifespan)) + } + + fun info(id: Int, deployer: String, content: String, lifespan: Long) { + add(id, Toast(ToastType.INFO, deployer, content, lifespan)) + } + + fun warn(deployer: String, content: String, lifespan: Long) { + add(ID.getAndIncrement(), Toast(ToastType.WARNING, deployer, content, lifespan)) + } + + fun warn(id: Int, deployer: String, content: String, lifespan: Long) { + add(id, Toast(ToastType.WARNING, content, deployer, lifespan)) + } + + private fun add(id: Int, toast: Toast) { + if (!toastMap.containsKey(id)) { + toastMap[id] = toast + } else { + val t = toastMap[id] + t!!.content = toast.content + t.endTime = System.currentTimeMillis() + t.lifespan + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/placement/PlacementData.kt b/src/main/kotlin/com/paragon/backend/managers/placement/PlacementData.kt new file mode 100644 index 0000000..49737e5 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/placement/PlacementData.kt @@ -0,0 +1,30 @@ +package com.paragon.backend.managers.placement + +import com.paragon.util.mc +import net.minecraft.util.ActionResult +import net.minecraft.util.Hand +import net.minecraft.util.math.Direction + +/** + * @author surge + * @since 09/03/2023 + */ +data class PlacementData(val slot: Int, val direction: Direction, val swing: Swing = Swing.CLIENT, val hand: Hand = Hand.MAIN_HAND) { + + val originalSlot = mc.player!!.inventory.selectedSlot + + var accept: (ActionResult) -> Unit = { + if (it.shouldSwingHand()) { + mc.player!!.swingHand(Hand.MAIN_HAND) + } + } + + private set + + fun accept(action: (ActionResult) -> Unit): PlacementData { + accept = action + + return this + } + +} diff --git a/src/main/kotlin/com/paragon/backend/managers/placement/PlacementManager.kt b/src/main/kotlin/com/paragon/backend/managers/placement/PlacementManager.kt new file mode 100644 index 0000000..ba5792c --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/placement/PlacementManager.kt @@ -0,0 +1,69 @@ +package com.paragon.backend.managers.placement + +import com.paragon.Paragon +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.util.mc +import com.paragon.util.player.PlayerUtil +import me.bush.eventbus.annotation.EventListener +import net.minecraft.util.ActionResult +import net.minecraft.util.Hand +import net.minecraft.util.hit.BlockHitResult +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Vec3d + +/** + * @author surge + * @since 09/03/2023 + */ +class PlacementManager { + + private val placements = LinkedHashMap() + + init { + Paragon.bus.subscribe(this) + } + + @EventListener + fun onTick(event: TickEvent) { + if (placements.isEmpty()) { + return + } + + val position = placements.keys.first() + val placement = placements[position]!! + + Paragon.inventoryManager.swap(placement.slot) + Paragon.inventoryManager.sync() + + val res: ActionResult = mc.interactionManager!!.interactBlock( + mc.player, + Hand.MAIN_HAND, + + BlockHitResult(Vec3d(position.x.toDouble(), position.y.toDouble(), position.z.toDouble()).add(0.5, 0.5, 0.5), placement.direction, position, false) + ) + + if (res.isAccepted) { + if (res.shouldSwingHand()) { + when (placement.swing) { + Swing.CLIENT -> mc.player!!.swingHand(Hand.MAIN_HAND) + Swing.SERVER -> PlayerUtil.silentSwing(Hand.MAIN_HAND) + else -> {} + } + } + + placement.accept(res) + } + + if (mc.player!!.inventory.selectedSlot != placement.slot) { + Paragon.inventoryManager.swap(placement.originalSlot) + Paragon.inventoryManager.sync() + } + + placements.remove(placements.keys.first()) + } + + fun submit(position: BlockPos, data: PlacementData) { + this.placements[position] = data + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/managers/placement/Swing.kt b/src/main/kotlin/com/paragon/backend/managers/placement/Swing.kt new file mode 100644 index 0000000..603bd81 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/managers/placement/Swing.kt @@ -0,0 +1,28 @@ +package com.paragon.backend.managers.placement + +import com.paragon.util.mc +import com.paragon.util.player.PlayerUtil +import net.minecraft.util.Hand + +/** + * @author surge + * @since 09/03/2023 + */ +enum class Swing(val swing: (Hand) -> Unit) { + + /** + * Swing client side + */ + CLIENT({ mc.player!!.swingHand(it) }), + + /** + * Swing server side + */ + SERVER({ PlayerUtil.silentSwing(it) }), + + /** + * Don't swing + */ + NONE({}) + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/module/Category.kt b/src/main/kotlin/com/paragon/backend/module/Category.kt new file mode 100644 index 0000000..5679301 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/module/Category.kt @@ -0,0 +1,32 @@ +package com.paragon.backend.module + +/** + * @author surge + * @since 11/02/2023 + */ +enum class Category(val displayName: String) { + /** + * Combat modules, e.g. Aura + */ + COMBAT("Combat"), + + /** + * Exploit modules, e.g. Ping Spoof, Packet Flight + */ + EXPLOIT("Exploit"), + + /** + * Movement modules, e.g. Step + */ + MOVEMENT("Movement"), + + /** + * Visual modules, e.g. ESP + */ + VISUAL("Visual"), + + /** + * Player modules, e.g. Anti Void + */ + PLAYER("Player") +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/module/Module.kt b/src/main/kotlin/com/paragon/backend/module/Module.kt new file mode 100644 index 0000000..11247dc --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/module/Module.kt @@ -0,0 +1,50 @@ +package com.paragon.backend.module + +import com.paragon.Paragon +import com.paragon.backend.ToggleFeature +import com.paragon.backend.bind.Bind +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing + +/** + * @author surge + * @since 11/02/2023 + */ +open class Module(name: String, description: String, val category: Category) : ToggleFeature(name, description) { + + val animation = BoundedAnimation(0.0f, 100.0f, 200f, false, Easing.CUBIC_IN_OUT) + + var visible by bool("Visible", true, "The module's visibility in the ClickGUI") + val key by bind("Key", Bind(this), "The key used to toggle the module") + + init { + key.setInhibitor { _, bind -> setState(bind.state) } + Paragon.keyboardManager.addBind(key) + } + + override fun enable() {} + override fun disable() {} + + override fun setState(state: Boolean) { + this.isEnabled = state + animation.state = state + + if (state) { + enable() + Paragon.bus.subscribe(this) + } else { + Paragon.bus.unsubscribe(this) + disable() + } + + Paragon.toastManager.info(this.name, "$name was toggled ${if (state) "on" else "off"}", 1000L) + } + + open val info: () -> String? = { null } + + fun toggle() { + key.state = !isEnabled + } + + fun isActive(): Boolean = isEnabled || animation.linearFactor > 0.0 +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/setting/Colour.kt b/src/main/kotlin/com/paragon/backend/setting/Colour.kt new file mode 100644 index 0000000..31ac276 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/setting/Colour.kt @@ -0,0 +1,19 @@ +package com.paragon.backend.setting + +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class Colour(r: Int, g: Int, b: Int, a: Int) : Color(r, g, b, a) { + + private val rainbow = false + private val rainboxSpeed = 4f + private val rainbowSaturation = 100f + private val synced = false + + fun integrateAlpha(alpha: Int): Colour { + return Colour(this.red, this.green, this.blue, alpha) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/setting/RegistrySetting.kt b/src/main/kotlin/com/paragon/backend/setting/RegistrySetting.kt new file mode 100644 index 0000000..7e97f6c --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/setting/RegistrySetting.kt @@ -0,0 +1,75 @@ +package com.paragon.backend.setting + +import com.paragon.Paragon +import net.minecraft.registry.Registry +import org.json.JSONArray +import org.json.JSONObject +import java.util.function.Predicate +import kotlin.reflect.KProperty + +/** + * TODO: Categorise by given enum, e.g. EntityType -> SpawnGroup + * + * @author surge + * @since 06/03/2023 + */ +class RegistrySetting(name: String, registry: Registry, description: String, private val default: Boolean) : Setting>(name, description, registry) { + + val states = hashMapOf().also { + registry.sortedBy { it.toString() }.forEach { registryValue -> + it[registryValue] = default + } + } + + fun getState(key: Any): Boolean { + return getStateT(key as T) + } + + fun getStateT(key: T): Boolean { + return states[key] ?: default + } + + fun setState(key: Any, value: Boolean) { + setStateT(key as T, value) + } + + fun setStateT(key: T, value: Boolean) { + states[key] = value + } + + fun enabled(): List { + return states.filter { it.value }.map { it.key } + } + + fun disabled(): List { + return states.filter { !it.value }.map { it.key } + } + + override fun write(json: JSONObject) { + val obj = JSONObject() + + states.forEach { (key, value) -> + obj.put(key.toString(), value) + } + + json.put(this.name, obj) + } + + override fun load(json: JSONObject) { + try { + val obj = json.getJSONObject(this.name) + + obj.keys().forEach { key -> + val value = obj.getBoolean(key) + val mappedKey = this.states.keys.first { it.toString() == key } + + if (mappedKey != null) { + this.states[mappedKey] = value + } + } + } catch (exception: Exception) { + Paragon.logger.warn("Failed to load $name") + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/setting/Setting.kt b/src/main/kotlin/com/paragon/backend/setting/Setting.kt new file mode 100644 index 0000000..978abe4 --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/setting/Setting.kt @@ -0,0 +1,144 @@ +package com.paragon.backend.setting + +import com.paragon.Paragon +import com.paragon.backend.Feature +import com.paragon.backend.event.events.paragon.SettingUpdateEvent +import org.json.JSONObject +import java.util.* +import kotlin.reflect.KProperty + +/** + * @author surge + * @since 11/02/2023 + */ +open class Setting(name: String, description: String, value: T) : Feature(name, description) { + + var value: T = value + private set + + // number setting bounds + var minimum: T? = null + private set + + var maximum: T? = null + private set + + var incrementation: T? = null + private set + + // enumeration ordinal + private var index = 0 + + // if the setting is visible inside the GUI + var visibility: () -> Boolean = { true } + + // values that the current value cannot be + val exclusions: List = ArrayList() + + constructor(name: String, description: String, value: T, minimum: T, maximum: T, incrementation: T) : this(name, description, value) { + this.minimum = minimum + this.maximum = maximum + this.incrementation = incrementation + + if (value is Enum<*>) { + index = nextIndex + } + } + + fun setValue(value: T) { + if (value != this.value) { + Paragon.bus.post(SettingUpdateEvent(this)) + } + + if (value is Enum<*>) { + index = nextIndex + } + + this.value = value + + if (value is Enum<*> && exclusions.contains(value)) { + setValue(nextEnum) + } + } + + open fun write(json: JSONObject) { + json.put(this.name, this.value) + } + + open fun load(json: JSONObject) { + try { + this.value = when (this.value) { + is Int -> json.getInt(name) as T + is Float -> json.getFloat(name) as T + is Double -> json.getDouble(name) as T + is Boolean -> json.getBoolean(name) as T + is Enum<*> -> { + val enum = value as Enum<*> + val value = java.lang.Enum.valueOf(enum::class.java, json.getString(name)) + + run breakLoop@{ + enum::class.java.enumConstants.forEachIndexed { index, enumValue -> + if (enumValue.name == value.name) { + this.index = index + return@breakLoop + } + } + } + + value as T + } + + else -> { + this.value + } + } + } catch (exception: Exception) { + Paragon.logger.warn("Failed to load $name") + } + } + + val nextEnum: T + get() { + val enum = value as Enum<*> + + return java.lang.Enum.valueOf( + enum::class.java, + enum.javaClass.enumConstants.map { it.name }[nextIndex] + ) as T + } + + val previousEnum: T + get() { + val enum = value as Enum<*> + + var prevIndex = index - 1 + if (prevIndex < 0) { + prevIndex = enum.javaClass.enumConstants.size - 1 + } + + return java.lang.Enum.valueOf( + enum::class.java, + enum.javaClass.enumConstants.map { it.name }[prevIndex] + ) as T + } + + private val nextIndex: Int + get() { + val enum = value as Enum<*> + + return if (index + 1 > enum.javaClass.enumConstants.map { it.name }.size - 1) 0 else index + 1 + } + + operator fun getValue(thisRef: Any?, property: KProperty<*>): T = value + + operator fun setValue(thisRef: Any?, property: KProperty<*>, v: T) { + value = v + } + + infix fun visibility(condition: () -> Boolean): Setting { + this.visibility = condition + + return this + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/backend/setting/SettingContainer.kt b/src/main/kotlin/com/paragon/backend/setting/SettingContainer.kt new file mode 100644 index 0000000..488f48c --- /dev/null +++ b/src/main/kotlin/com/paragon/backend/setting/SettingContainer.kt @@ -0,0 +1,121 @@ +package com.paragon.backend.setting + +import com.paragon.backend.bind.Bind +import net.minecraft.predicate.NumberRange +import net.minecraft.registry.Registry + +/** + * @author aesthetical + * @since 02/20/23 + */ +open class SettingContainer { + val settingMap = mutableMapOf>() + + protected fun bool(name: String, value: Boolean, description: String = "No description provided"): Setting { + return setting(name, description, value) + } + + // bad color spelling "colour" bruh + protected fun colour(name: String, value: Colour, description: String = "No description provided"): Setting { + return setting(name, description, value) + } + + protected fun bind(name: String, value: Bind, description: String = "No description provided"): Setting { + return setting(name, description, value) + } + + protected inline fun > enum(name: String, value: T, description: String = "No description provided"): Setting { + return setting(name, description, value) + } + + protected fun float( + name: String, + value: Float, + incrementation: Float, + range: ClosedRange, + description: String = "No description provided" + ): Setting { + + val setting = Setting(name, description, value, range.start, range.endInclusive, incrementation) + settingMap[name] = setting + return setting + } + + protected fun double( + name: String, + value: Double, + incrementation: Double, + range: ClosedRange, + description: String = "No description provided" + ): Setting { + + val setting = Setting(name, description, value, range.start, range.endInclusive, incrementation) + settingMap[name] = setting + return setting + } + + protected fun int( + name: String, + value: Int, + incrementation: Int, + range: IntRange, + description: String = "No description provided" + ): Setting { + + val setting = Setting(name, description, value, range.first, range.last, incrementation) + settingMap[name] = setting + return setting + } + + protected inline fun number( + name: String, + value: T, + incrementation: T, + range: NumberRange, + description: String = "No description provided" + ): Setting { + + val setting = Setting(name, description, value, range.min as T, range.max as T, incrementation) + settingMap[name] = setting + return setting + } + + protected inline fun registry( + name: String, + registry: Registry, + default: Boolean, + description: String = "No description provided" + ): RegistrySetting<*> { + + val setting = RegistrySetting(name, registry, description, default) + settingMap[name] = setting + return setting + } + + protected inline fun setting(name: String, description: String, value: T): Setting { + val setting = Setting(name, description, value) + settingMap[name] = setting + return setting + } + + protected fun register(container: SettingContainer) { + container.getSettings().forEach { + settingMap[it.name] = it + } + } + + fun visibleWhen(condition: () -> Boolean) { + this.getSettings().forEach { + val original = it.visibility + + it.visibility = { original() && condition() } + } + } + + fun getSettings(): Collection> = settingMap.values + + fun get(name: String): Setting<*>? { + return settingMap[name] + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/command/Configuration.kt b/src/main/kotlin/com/paragon/client/command/Configuration.kt new file mode 100644 index 0000000..2724741 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/command/Configuration.kt @@ -0,0 +1,90 @@ +package com.paragon.client.command + +import com.mojang.brigadier.arguments.StringArgumentType +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder +import com.paragon.Paragon +import com.paragon.backend.command.Command +import com.paragon.backend.command.argument.EnumArgumentType +import com.paragon.util.io.FileUtil +import com.paragon.util.mc +import com.paragon.util.print +import java.util.* + +/** + * @author aesthetical + * @since 02/26/23 + */ +object Configuration : Command( + arrayOf("config", "configuration", "cfg", "preset"), + usage = "[save | load | delete | list] ", + description = "Manages configurations") { + + override fun run(ctx: LiteralArgumentBuilder) { + ctx.then(RequiredArgumentBuilder.argument?>("action", EnumArgumentType.enum(Action::class.java)) + .executes { + + when (EnumArgumentType.enum(it, "action")) { + Action.LIST -> { + val fileList = FileUtil.PARAGON_PATH.resolve("configs").listFiles() + if (fileList == null) { + mc.inGameHud.print("There are no saved configurations") + return@executes SUCCESS + } + + mc.inGameHud.print(StringBuilder().apply { + + append("Config${if (fileList.size != 1) "s" else ""} list (${fileList.size})") + append(": ") + + val joiner = StringJoiner(", ") + for (file in fileList) { + joiner.add(file.nameWithoutExtension) + } + + append(joiner) + }.toString()) + } + + else -> mc.inGameHud.print("Please provide a configuration name to load, save or delete") + } + + return@executes SUCCESS + } + .then(RequiredArgumentBuilder.argument("configName", StringArgumentType.word()) + .executes { + + val configName = StringArgumentType.getString(it, "configName") + if (configName.isNullOrEmpty()) { + mc.inGameHud.print("Please provide a configuration name to load, save or delete") + return@executes SUCCESS + } + + when (EnumArgumentType.enum(it, "action")) { + Action.LOAD -> mc.inGameHud.print(Paragon.moduleManager.load(configName)) + Action.SAVE -> { + Paragon.moduleManager.save(configName) + mc.inGameHud.print("Saved config to file \"$configName.json\"") + } + Action.DELETE -> { + + if (configName.equals("current")) { + mc.inGameHud.print("You cannot delete the current configuration") + return@executes SUCCESS + } + + mc.inGameHud.print( + if (FileUtil.delete(FileUtil.PARAGON_PATH.resolve("configs").resolve("$configName.json"))) + "Deleted config file \"$configName.json\" successfully." + else "Unable to delete config file \"$configName.json\". Make sure it exists") + } + else -> mc.inGameHud.print("Cannot list a config (yet)") + } + return@executes SUCCESS + })) + } + + enum class Action { + SAVE, LOAD, DELETE, LIST + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/command/Drawn.kt b/src/main/kotlin/com/paragon/client/command/Drawn.kt new file mode 100644 index 0000000..e8d640c --- /dev/null +++ b/src/main/kotlin/com/paragon/client/command/Drawn.kt @@ -0,0 +1,25 @@ +package com.paragon.client.command + +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder +import com.paragon.backend.command.Command +import com.paragon.backend.command.argument.ModuleArgumentType +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.print + +/** + * @author aesthetical + * @since 02/24/23 + */ +object Drawn : Command(arrayOf("drawn", "hide", "hid"), usage = "[module]") { + override fun run(ctx: LiteralArgumentBuilder) { + ctx.then(RequiredArgumentBuilder.argument("module", ModuleArgumentType.module()) + .executes { + val module = ModuleArgumentType.module(it, "module") + module.visible = !module.visible + mc.inGameHud.print("Module is now ${if (module.visible) "shown" else "hidden"} on the arraylist") + return@executes SUCCESS + }) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/command/Prefix.kt b/src/main/kotlin/com/paragon/client/command/Prefix.kt new file mode 100644 index 0000000..f111272 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/command/Prefix.kt @@ -0,0 +1,28 @@ +package com.paragon.client.command + +import com.mojang.brigadier.arguments.StringArgumentType +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder +import com.paragon.Paragon +import com.paragon.backend.command.Command +import com.paragon.util.mc +import com.paragon.util.print + +/** + * @author aesthetical + * @since 02/24/23 + */ +object Prefix : Command(arrayOf("prefix", "pfx", "setprefix"), description = "Sets the command prefix") { + override fun run(ctx: LiteralArgumentBuilder) { + ctx.then(RequiredArgumentBuilder.argument("prefix", StringArgumentType.word()) + .executes { + Paragon.commandManager.prefix = StringArgumentType.getString(it, "prefix") + mc.inGameHud.print("Set the new command prefix to \"${Paragon.commandManager.prefix}\"") + return@executes SUCCESS + }) + .executes { + mc.inGameHud.print("Your current prefix is \"${Paragon.commandManager.prefix}\" (obviously dumbass)") + return@executes SUCCESS + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/command/Toggle.kt b/src/main/kotlin/com/paragon/client/command/Toggle.kt new file mode 100644 index 0000000..5c862c8 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/command/Toggle.kt @@ -0,0 +1,26 @@ +package com.paragon.client.command + +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder +import com.paragon.backend.command.Command +import com.paragon.backend.command.argument.ModuleArgumentType +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.print + +/** + * @author aesthetical + * @since 02/24/23 + */ +object Toggle : Command(arrayOf("toggle", "t"), usage = "[module name]", description = "Toggles a module on or off") { + override fun run(ctx: LiteralArgumentBuilder) { + ctx.then(RequiredArgumentBuilder.argument("moduleName", ModuleArgumentType.module()) + .executes { + val module = ModuleArgumentType.module(it, "moduleName") + module.toggle() + + mc.inGameHud.print("Toggled ${module.name} ${if (module.isEnabled) "on" else "off"}.") + return@executes SUCCESS + }) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/combat/Aura.kt b/src/main/kotlin/com/paragon/client/modules/combat/Aura.kt new file mode 100644 index 0000000..b4cf350 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/combat/Aura.kt @@ -0,0 +1,128 @@ +package com.paragon.client.modules.combat + +import com.paragon.Paragon +import com.paragon.backend.event.EventEra +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.rotation.RotationUtil.calcToEntity +import com.paragon.util.calculations.rotation.Target +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import com.paragon.util.unattackables +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.LivingEntity +import net.minecraft.registry.Registries +import net.minecraft.util.Hand +import kotlin.math.cos + +/** + * @author surge, aesthetical + * @since 11/02/2023 + */ +object Aura : Module("Aura", "Automatically attacks entities", Category.COMBAT) { + + private val filter = registry("Filter", Registries.ENTITY_TYPE, true, "Which entities to attack").also { + unattackables.forEach { type -> + it.setState(type, false) + } + } + + private val era by enum("Era", EventEra.PRE, "The time to attack at") + private val mode by enum("Mode", Mode.SWITCH, "How to target entities") + private val sort by enum("Sort", Sort.HEALTH, "How to sort targets") + private val range by double("Range", 4.0, 0.1, 1.0..6.0, "How far to attack from") + private val wallRange by double("Wall Range", 3.0, 0.1, 1.0..6.0, "How far to attack from through walls") + private val rotate by bool("Rotate", true, "If to rotate towards the entity") + private val target by enum("Target", Target.TORSO, "Where to rotate on the entity") + private val render by enum("Render", DrawMode.BOTH, "Render a polygon around the target") + private val sides by int("Sides", 8, 1, 3..120, "The amount of sides the polygon has") visibility { render != DrawMode.NONE } + private val alpha by int("Alpha", 100, 1, 0..255, "The alpha of the fill") visibility { render == DrawMode.FILL || render == DrawMode.BOTH } + + private var current: LivingEntity? = null + + override val info = { mode.name + ", " + range } + + override fun disable() { + current = null + } + + @EventListener(recieveCancelled = true) + fun onWalkingUpdate(event: MoveUpdateEvent) { + if (!isValidTarget(current) || mode == Mode.SWITCH) { + current = null + + val entities: MutableList = ArrayList() + + for (entity in mc.world!!.entities) { + if (entity is LivingEntity && isValidTarget(entity)) { + entities.add(entity) + } + } + + if (entities.isNotEmpty()) { + current = entities.stream() + .min(sort.comparator) + .orElse(null) + } + } + + if (current != null) { + if (rotate) { + Paragon.rotationManager.submit(calcToEntity(current!!, target)) + } + + if (event.era == era && mc.player!!.getAttackCooldownProgress(1.0f) == 1.0f) { + mc.interactionManager!!.attackEntity(mc.player, current) + mc.player!!.swingHand(Hand.MAIN_HAND) + } + } + } + + @EventListener(recieveCancelled = true) + fun onGameRender(event: GameRenderEvent) { + if (render != DrawMode.NONE && current != null) { + if (render == DrawMode.FILL || render == DrawMode.BOTH) { + Renderer.polygon(event.matrices, current!!.pos.add(0.0, current!!.height * (0.5 * (cos((mc.player!!.age * 4) * (Math.PI / 180)) + 1)), 0.0), current!!.width.toDouble(), getClientColour().integrateAlpha(alpha), Renderer.DrawMode.FILL, sides) + } + + if (render == DrawMode.OUTLINE || render == DrawMode.BOTH) { + Renderer.polygon(event.matrices, current!!.pos.add(0.0, current!!.height * (0.5 * (cos((mc.player!!.age * 4) * (Math.PI / 180)) + 1)), 0.0), current!!.width.toDouble(), getClientColour(), Renderer.DrawMode.LINES, sides) + } + } + } + + private fun isValidTarget(entity: LivingEntity?): Boolean { + if (entity == null || entity == mc.player || entity.isDead || entity.health <= 0.0f) { + return false + } + + if (entity.type !in filter.enabled()) { + return false + } + + val dist = if (mc.player!!.canSee(entity)) range else wallRange + + return mc.player!!.squaredDistanceTo(entity) <= dist * dist + } + + enum class Mode { + SINGLE, + SWITCH + } + + enum class Sort(val comparator: Comparator) { + HEALTH(Comparator.comparingDouble { obj: LivingEntity? -> obj!!.health.toDouble() }), + DISTANCE(Comparator.comparingDouble { entity: LivingEntity? -> entity!!.distanceTo(mc.player).toDouble() }) + } + + enum class DrawMode { + FILL, + OUTLINE, + BOTH, + NONE + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/combat/AutoTotem.kt b/src/main/kotlin/com/paragon/client/modules/combat/AutoTotem.kt new file mode 100644 index 0000000..76fcff3 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/combat/AutoTotem.kt @@ -0,0 +1,162 @@ +package com.paragon.client.modules.combat + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.Timer +import com.paragon.util.inventory.InventoryUtil +import com.paragon.util.inventory.InventoryUtil.normalize +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.block.Block +import net.minecraft.block.Blocks +import net.minecraft.entity.effect.StatusEffects +import net.minecraft.item.Item +import net.minecraft.item.Items +import net.minecraft.item.SwordItem +import net.minecraft.screen.slot.SlotActionType +import net.minecraft.util.Hand +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.MathHelper +import kotlin.math.roundToInt + +/** + * @author aesthetical + * @since 02/25/23 + */ +object AutoTotem : Module("Auto Totem", "Replaces items in your offhand", Category.COMBAT) { + + private val item by enum("Item", ItemType.TOTEM, "The item type") + private val health by float("Health", 16.0f, 0.1f, 1.0f..19.0f, "The health to swap to a totem") + private val delay by double("Delay", 0.1, 0.1, 0.0..3.5, "How long before replenishing the offhand slot") + private val gapple by bool("Gapple", true, "If to offhand gapple") + + private val timer = Timer() + + override val info = { getDisplayInfo().toString() } + + @EventListener + fun onTick(event: TickEvent) { + val fallDist = getMaxFallDist() + val items = if (mc.player!!.health < health || (fallDist > 0.0f && fallDist <= health)) { + ItemType.TOTEM.items + } else if (mc.options.useKey.isPressed && gapple && InventoryUtil.hasStackIn(Hand.MAIN_HAND, SwordItem::class.java)) { + ItemType.GAPPLE.items + } else { + item.items + } + + if (!InventoryUtil.hasStackIn(Hand.OFF_HAND, items) && timer.elapsed(delay * 1000.0)) { + timer.reset() + replaceInOffhand(items) + } + } + + private fun replaceInOffhand(items: Array) { + if (InventoryUtil.hasStackIn(Hand.OFF_HAND, items)) { + return + } + + var slot = -1 + for (i in 0..36) { + val itemStack = mc.player!!.inventory.getStack(i) + if (!itemStack.isEmpty) { + for (item in items) { + if (itemStack.item == item) { + slot = i + break + } + } + } + } + + if (slot == -1) { + return + } + + val hadInOffhand = !mc.player!!.getStackInHand(Hand.OFF_HAND).isEmpty + val syncId = mc.player!!.currentScreenHandler.syncId + mc.interactionManager!!.clickSlot(syncId, normalize(slot), 0, SlotActionType.PICKUP, mc.player) + mc.interactionManager!!.clickSlot(syncId, 45, 0, SlotActionType.PICKUP, mc.player) + if (hadInOffhand) { + mc.interactionManager!!.clickSlot(syncId, normalize(slot), 0, SlotActionType.PICKUP, mc.player) + } + + } + + private fun getMaxFallDist(): Float { + val multiplier = if (isBlockUnderSafe()) 0.0f else 1.0f + var reduction = 0.0f + if (mc.player!!.hasStatusEffect(StatusEffects.JUMP_BOOST)) { + reduction = (mc.player!!.getStatusEffect(StatusEffects.JUMP_BOOST)!!.amplifier + 1).toFloat() + } + + val dmg = MathHelper.ceil((getFirstBlockPosY() - 3.0f - reduction) * multiplier).toFloat() + return (mc.player!!.health - dmg).coerceAtLeast(0.0f) + } + + private fun getFirstBlockPosY(): Double { + for (y in 1 until 256 - (mc.player!!.y + 1.0).roundToInt()) { + val block: Block = mc.world!!.getBlockState(BlockPos( + mc.player!!.x + mc.player!!.velocity.x * 1.5, + (mc.player!!.y - y.toFloat()), + mc.player!!.z + mc.player!!.velocity.z * 1.5)).block + if (block != Blocks.AIR) { + return mc.player!!.y - y + } + } + + return -1.0 + } + + private fun isBlockUnderSafe(): Boolean { + for (y in 1 until 256 - (mc.player!!.y + 1.0).roundToInt()) { + val block: Block = mc.world!!.getBlockState(BlockPos( + mc.player!!.x + mc.player!!.velocity.x * 1.5, + (mc.player!!.y - y.toFloat()), + mc.player!!.z + mc.player!!.velocity.z * 1.5)).block + if (block == Blocks.SLIME_BLOCK && !mc.player!!.isSneaking || block == Blocks.COBWEB || block == Blocks.WATER) { + return true + } + } + + return false + } + + private fun getDisplayInfo(): Int { + val offhandStack = mc.player!!.getStackInHand(Hand.OFF_HAND) + return getItemCount(offhandStack.item) + } + + private fun getItemCount(vararg items: Item): Int { + var count = 0 + for (i in 0..36) { + val itemStack = mc.player!!.inventory.getStack(i) + if (!itemStack.isEmpty) { + for (item in items) { + if (itemStack.item == item) { + count += itemStack.count + } + } + } + } + + if (!mc.player!!.getStackInHand(Hand.OFF_HAND).isEmpty) { + val offhandStack = mc.player!!.getStackInHand(Hand.OFF_HAND) + for (item in items) { + if (offhandStack.item == item) { + count += offhandStack.count + } + } + } + + return count + } + + + enum class ItemType(vararg val items: Item) { + TOTEM(Items.TOTEM_OF_UNDYING), + CRYSTAL(Items.END_CRYSTAL), + GAPPLE(Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/combat/Burrow.kt b/src/main/kotlin/com/paragon/client/modules/combat/Burrow.kt new file mode 100644 index 0000000..545ae1d --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/combat/Burrow.kt @@ -0,0 +1,185 @@ +package com.paragon.client.modules.combat + +import com.paragon.Paragon +import com.paragon.backend.event.EventEra +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.rotation.RotationUtil +import com.paragon.util.mc +import com.paragon.util.nullCheck +import com.paragon.util.player.PlayerUtil +import me.bush.eventbus.annotation.EventListener +import net.minecraft.block.Blocks +import net.minecraft.item.BlockItem +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket +import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket +import net.minecraft.util.Hand +import net.minecraft.util.hit.BlockHitResult +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction +import net.minecraft.util.math.Vec3d +import java.lang.Double.isNaN + +/** + * @author aesthetical + * @since 02/20/23 + */ +object Burrow : Module("Burrow", "Lags you back into a block", Category.COMBAT) { + + private val vanillaJumpHeights = listOf(0.419999986886978, 0.7531999805212015, 1.001335979112147, 1.166109260938214) + private val validBlocks = listOf(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, Blocks.BEDROCK, Blocks.ENDER_CHEST) + + private val rotate by bool("Rotate", true, "If to rotate towards the block you're placing on") + private val swing by bool("Swing", true, "If to swing client side") + private val autoSwap by enum("Auto Swap", AutoSwap.SERVER, "How to swap to the block") + private val replace by bool("Replace", false, "Keeps the module on and automatically replaces the burrow block") + + private var startY = Double.NaN + private var burrowing = false + private var swapped = false; + + override fun disable() { + super.disable() + startY = Double.NaN + burrowing = false + + if (swapped && !nullCheck()) { + Paragon.inventoryManager.sync() + } + + swapped = false + } + + @EventListener + fun onMoveUpdate(event: MoveUpdateEvent) { + + if (event.era == EventEra.POST) { + if (isNaN(startY)) { + startY = mc.player!!.y + } + + if (mc.player!!.y - startY > 0.2) { + toggle() + return + } + + val blockPos = BlockPos(mc.player!!.pos) + if (mc.world!!.getBlockState(blockPos).material.isReplaceable) { + burrow(blockPos) + if (!replace) { + toggle() + } + } + } + } + + @EventListener + fun onPacketInbound(event: PacketEvent.Inbound) { + if (nullCheck() || !replace) { + return + } + + if (event.packet is BlockUpdateS2CPacket) { + val packet = event.packet + if (packet.pos.equals(BlockPos(mc.player!!.pos)) && packet.state.isReplaceable) { + burrow(packet.pos) + } + } + } + + private fun burrow(blockPos: BlockPos) { + if (burrowing) { + return + } + + burrowing = true + + var result: PlaceResult? = null + for (facing in Direction.values()) { + val n = blockPos.offset(facing) + if (!mc.world!!.getBlockState(n).material.isReplaceable) { + result = PlaceResult(n, facing.opposite) + break + } + } + + if (result == null) { + burrowing = false + return + } + + var slot = -1 + for (i in 0..8) { + val itemStack = mc.player!!.inventory.getStack(i) + if (!itemStack.isEmpty && itemStack.item is BlockItem) { + val block = (itemStack.item as BlockItem).block + if (validBlocks.contains(block)) { + slot = i + break + } + } + } + + if (slot == -1) { + burrowing = false + return + } + + if (rotate) { + val rotations = RotationUtil.calcAngleToBlock(result.pos, result.direction) + Paragon.rotationManager.submit(rotations) + mc.player!!.networkHandler.sendPacket(PlayerMoveC2SPacket.LookAndOnGround(rotations[0], rotations[1], mc.player!!.isOnGround)) + } + + var oldSlot = -1 + swapped = true + if (autoSwap == AutoSwap.CLIENT) { + oldSlot = mc.player!!.inventory.selectedSlot + mc.player!!.inventory.selectedSlot = slot + } else { + Paragon.inventoryManager.swap(slot) + } + + for (value in vanillaJumpHeights) { + mc.player!!.networkHandler.sendPacket(PlayerMoveC2SPacket.PositionAndOnGround( + mc.player!!.x, mc.player!!.y + value, mc.player!!.z, false)) + } + + val actionResult = mc.interactionManager!!.interactBlock(mc.player, Hand.MAIN_HAND, + BlockHitResult( + Vec3d(result.pos.x.toDouble(), result.pos.y.toDouble(), result.pos.z.toDouble()) + .add(0.5, 0.5, 0.5), + result.direction, result.pos, false)) + + if (actionResult.isAccepted) { + if (swing) { + mc.player!!.swingHand(Hand.MAIN_HAND) + } else { + PlayerUtil.silentSwing(Hand.MAIN_HAND) + } + } + + // TODO: Stop this flagging! + mc.player!!.networkHandler.sendPacket(PlayerMoveC2SPacket.PositionAndOnGround( + mc.player!!.x, mc.player!!.y + 2.3, mc.player!!.z, false)) + + burrowing = false + + if (autoSwap == AutoSwap.CLIENT) { + mc.player!!.inventory.selectedSlot = oldSlot + } else { + Paragon.inventoryManager.sync() + } + + swapped = false + } + + private data class PlaceResult(val pos: BlockPos, val direction: Direction) + + enum class AutoSwap { + CLIENT, SERVER + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/combat/Criticals.kt b/src/main/kotlin/com/paragon/client/modules/combat/Criticals.kt new file mode 100644 index 0000000..5a8390a --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/combat/Criticals.kt @@ -0,0 +1,96 @@ +package com.paragon.client.modules.combat + +import com.paragon.backend.event.events.net.PacketEvent.Outbound +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IPlayerInteractEntityC2SPacket +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.LivingEntity +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround +import net.minecraft.util.math.Vec3d + +/** + * @author aesthetical + * @since 02/17/22 + */ +object Criticals : Module("Criticals", "does funny extra damage", Category.COMBAT) { + + private val mode by enum("Mode", Mode.PACKET, "The anti-cheat bypass mode") + private val stopSprint by bool("Keep Sprint", true, "Allows you to crit even when sprinting") + + override val info = { mode.toString() } + + @EventListener + fun onPacket(event: Outbound) { + if (event.packet is IPlayerInteractEntityC2SPacket) { + if (event.packet.type == PlayerInteractEntityC2SPacket.InteractType.ATTACK && event.packet.entity is LivingEntity) { + if (!mc.player!!.isOnGround || mc.player!!.isHoldingOntoLadder || mc.player!!.isSubmergedInWater || mc.player!!.isInLava) { + return + } + + val sprint: Boolean = mc.player!!.isSprinting + + if (stopSprint && sprint) { + mc.player!!.networkHandler.sendPacket( + ClientCommandC2SPacket( + mc.player, + ClientCommandC2SPacket.Mode.STOP_SPRINTING + ) + ) + } + + when (mode) { + + Mode.PACKET -> { + mc.player!!.networkHandler.sendPacket( + PositionAndOnGround( + mc.player!!.x, + mc.player!!.y + 0.0625, + mc.player!!.z, + false + ) + ) + + mc.player!!.networkHandler.sendPacket( + PositionAndOnGround( + mc.player!!.x, + mc.player!!.y, + mc.player!!.z, + false + ) + ) + } + + Mode.NEW_NCP -> { + // TODO: Find NCP Updated bypasses + } + + Mode.MOTION -> { + val vel: Vec3d = mc.player!!.getVelocity() + mc.player!!.setVelocity(vel.x, vel.y + 0.2, vel.z) + } + + } + + if (stopSprint && sprint) { + mc.player!!.networkHandler.sendPacket( + ClientCommandC2SPacket( + mc.player, + ClientCommandC2SPacket.Mode.START_SPRINTING + ) + ) + } + } + } + } + + enum class Mode { + PACKET, + NEW_NCP, + MOTION + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/combat/Velocity.kt b/src/main/kotlin/com/paragon/client/modules/combat/Velocity.kt new file mode 100644 index 0000000..bf0f8a6 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/combat/Velocity.kt @@ -0,0 +1,50 @@ +package com.paragon.client.modules.combat + +import com.paragon.backend.event.events.net.PacketEvent.Inbound +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.mixins.net.packet.s2c.IEntityVelocityUpdateS2CPacket +import com.paragon.mixin.mixins.net.packet.s2c.IExplosionS2CPacket +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket +import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket + +/** + * @author KassuK, aesthetical + * @since 02/18/23 + */ +object Velocity : Module("Velocity", "Modifies your velocity", Category.COMBAT) { + + private val cancelNull by bool("Cancel Null", true, "If to cancel velocity packets if H and V % is 0.0") + private val horizontal by float("Horizontal", 0.0f, 1.0f, 0f..100.0f, "How much horizontal kb") + private val vertical by float("Vertical", 0.0f, 1.0f, 0f..100.0f, "How much vertical kb") + + override val info = { "H: ${horizontal}%, V: ${vertical}%" } + + @EventListener + fun onPacketReceive(event: Inbound) { + if (event.packet is EntityVelocityUpdateS2CPacket && event.packet.id == mc.player!!.id) { + if (horizontal == 0.0f && vertical == 0.0f && cancelNull) { + event.isCancelled = true + return + } + + (event.packet as IEntityVelocityUpdateS2CPacket).setVelocityX((event.packet.velocityX * (horizontal / 100.0f)).toInt()) + (event.packet as IEntityVelocityUpdateS2CPacket).setVelocityY((event.packet.velocityY * (vertical / 100.0f)).toInt()) + (event.packet as IEntityVelocityUpdateS2CPacket).setVelocityZ((event.packet.velocityZ * (horizontal / 100.0f)).toInt()) + } + + if (event.packet is ExplosionS2CPacket) { + if (horizontal == 0.0f && vertical == 0.0f && cancelNull) { + event.isCancelled = true + return + } + + (event.packet as IExplosionS2CPacket).setVelocityX(event.packet.playerVelocityX * (horizontal / 100.0f)) + (event.packet as IExplosionS2CPacket).setVelocityY(event.packet.playerVelocityY * (vertical / 100.0f)) + (event.packet as IExplosionS2CPacket).setVelocityZ(event.packet.playerVelocityZ * (horizontal / 100.0f)) + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/exploit/Disabler.kt b/src/main/kotlin/com/paragon/client/modules/exploit/Disabler.kt new file mode 100644 index 0000000..65cd5ef --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/exploit/Disabler.kt @@ -0,0 +1,36 @@ +package com.paragon.client.modules.exploit + +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IClientPlayerInteractionManager +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.KeepAliveC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket +import net.minecraft.util.Hand +import net.minecraft.util.hit.BlockHitResult +import net.minecraft.util.math.Direction +import net.minecraft.util.math.Vec3d + +/** + * @author aesthetical + * @since 04/09/23 + */ +object Disabler : Module("Disabler", "Disables anticheats", Category.EXPLOIT) { + + @EventListener + fun onPacketOutbound(event: PacketEvent.Outbound) { + if (event.packet is KeepAliveC2SPacket) { + event.cancel() + } else if (event.packet is PlayerMoveC2SPacket) { + (mc.interactionManager as IClientPlayerInteractionManager).hookSendSequencedPacket(mc.world) { seq -> + return@hookSendSequencedPacket PlayerInteractBlockC2SPacket( + Hand.MAIN_HAND, + BlockHitResult(Vec3d.ZERO, Direction.DOWN, mc.player!!.blockPos, false), + seq) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/exploit/FastProjectile.kt b/src/main/kotlin/com/paragon/client/modules/exploit/FastProjectile.kt new file mode 100644 index 0000000..a5b7c30 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/exploit/FastProjectile.kt @@ -0,0 +1,32 @@ +package com.paragon.client.modules.exploit + +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.Items +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.Full + +/** + * @author surge + * @since 27/02/2023 + */ +object FastProjectile : Module("Fast Projectile", "Manipulate the velocity of bows to give you a higher damage output", Category.EXPLOIT) { + private val shots by int("Shots", 10, 1, 1..300, "How many shots to take") + + @EventListener + fun onOutbound(event: PacketEvent.Outbound) { + if (event.packet is PlayerActionC2SPacket && event.packet.action == PlayerActionC2SPacket.Action.RELEASE_USE_ITEM && mc.player!!.mainHandStack.item == Items.BOW) { + mc.player!!.networkHandler!!.sendPacket(ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_SPRINTING)) + + for (i in 0..shots) { + mc.player!!.networkHandler!!.sendPacket(Full(mc.player!!.x, mc.player!!.y + 1e-10, mc.player!!.z, mc.player!!.yaw, mc.player!!.pitch, false)) + mc.player!!.networkHandler!!.sendPacket(Full(mc.player!!.x, mc.player!!.y - 1e-10, mc.player!!.z, mc.player!!.yaw, mc.player!!.pitch, true)) + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/exploit/PingSpoof.kt b/src/main/kotlin/com/paragon/client/modules/exploit/PingSpoof.kt new file mode 100644 index 0000000..c3e1a1c --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/exploit/PingSpoof.kt @@ -0,0 +1,63 @@ +package com.paragon.client.modules.exploit + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IClientConnection +import com.paragon.util.calculations.Timer +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.Packet +import net.minecraft.network.packet.c2s.play.KeepAliveC2SPacket +import java.util.concurrent.ConcurrentHashMap + +/** + * @author surge + * @since 19/02/2023 + */ +object PingSpoof : Module("Ping Spoof", "Spoofs your latency", Category.EXPLOIT) { + + private val delay by double("Delay", 125.0, 0.1, 25.0..1000.0, "The time before releasing packets") + private val sequential by bool("Sequential", true, "If to send packets exactly at the original time sent + the delay") + + private val packetQueue = ConcurrentHashMap>() + private val timer = Timer() + + override val info = { delay.toString() } + + override fun enable() { + if (!sequential) { + timer.reset() + } + } + + @EventListener + fun onTick(event: TickEvent) { + if (sequential) { + packetQueue.forEach { (id: Long, packet: Packet<*>?) -> + if (System.currentTimeMillis() - id >= delay) { + (mc.player!!.networkHandler.connection as IClientConnection).sendPacketNoEvent(packet) + packetQueue.remove(id) + } + } + } else { + if (timer.elapsed(delay)) { + timer.reset() + packetQueue.forEach { (id: Long?, packet: Packet<*>?) -> + (mc.player!!.networkHandler.connection as IClientConnection).sendPacketNoEvent(packet) + packetQueue.remove(id) + } + } + } + } + + @EventListener + fun onPacketOutbound(event: PacketEvent.Outbound) { + if (event.packet is KeepAliveC2SPacket) { + event.isCancelled = true + packetQueue[System.currentTimeMillis()] = event.packet + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/exploit/ThunderLocator.kt b/src/main/kotlin/com/paragon/client/modules/exploit/ThunderLocator.kt new file mode 100644 index 0000000..3da16b0 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/exploit/ThunderLocator.kt @@ -0,0 +1,33 @@ +package com.paragon.client.modules.exploit + +import com.paragon.Paragon +import com.paragon.backend.event.events.net.PacketEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket +import net.minecraft.sound.SoundEvent +import net.minecraft.sound.SoundEvents + +/** + * @author aesthetical + * @since 02/25/23 + */ +object ThunderLocator : Module("Thunder Locator", "Locates thunder", Category.EXPLOIT) { + + @EventListener + fun onPacketInbound(event: PacketEvent.Inbound) { + if (event.packet is PlaySoundS2CPacket) { + val packet = event.packet + + val soundEvent = (packet.sound.value() as SoundEvent) + if (soundEvent == SoundEvents.ENTITY_LIGHTNING_BOLT_THUNDER || soundEvent == SoundEvents.ENTITY_LIGHTNING_BOLT_IMPACT) { + Paragon.toastManager.info(this.name, + "Thunder sounded at ${String.format("%.1f", packet.x)}, ${String.format("%.1f", packet.y)}, ${String.format("%.1f", packet.z)}", + 5000L) + + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/AntiVoid.kt b/src/main/kotlin/com/paragon/client/modules/movement/AntiVoid.kt new file mode 100644 index 0000000..8495516 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/AntiVoid.kt @@ -0,0 +1,38 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.PositionAndOnGround + +/** + * @author aesthetical + * @since 02/18/23 + */ +object AntiVoid : Module("Anti Void", "Stops you from falling into the void", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.LAGBACK, "How to get you out of the void") + + override val info = { mode.toString() } + + @EventListener + fun onTick(event: TickEvent?) { + if (mc.player!!.y < mc.world!!.bottomY) { + when (mode) { + Mode.FLOAT -> (mc.player!!.velocity as IVec3d).setY(0.42) + Mode.LAGBACK -> mc.player!!.networkHandler.sendPacket(PositionAndOnGround(mc.player!!.x, mc.player!!.y + 0.1, mc.player!!.z, false)) + Mode.SUSPEND -> (mc.player!!.velocity as IVec3d).setY(0.0) + } + } + } + + enum class Mode { + SUSPEND, + FLOAT, + LAGBACK + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/AutoJump.kt b/src/main/kotlin/com/paragon/client/modules/movement/AutoJump.kt new file mode 100644 index 0000000..8ef5200 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/AutoJump.kt @@ -0,0 +1,31 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 06/03/2023 + */ +object AutoJump : Module("Auto Jump", "Automatically jumps for you", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.SPRINTING, "When to jump") + + @EventListener + fun onTick(event: TickEvent) { + if (mc.player!!.isOnGround && mode.check() && !mc.player!!.isSneaking) { + mc.player!!.jump() + } + } + + enum class Mode(val check: () -> Boolean) { + CONSTANT({ true }), + MOVING({ mc.player!!.lastRenderX != mc.player!!.x || mc.player!!.lastRenderZ != mc.player!!.z }), + SPRINTING({ (mc.player!!.forwardSpeed != 0f || mc.player!!.sidewaysSpeed != 0f) && mc.player!!.isSprinting }), + UNDER_BLOCK_SPRINT({ SPRINTING.check() && !mc.world!!.getBlockState(mc.player!!.blockPos.up(2)).isReplaceable }) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/ElytraFlight.kt b/src/main/kotlin/com/paragon/client/modules/movement/ElytraFlight.kt new file mode 100644 index 0000000..57b8da1 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/ElytraFlight.kt @@ -0,0 +1,297 @@ +package com.paragon.client.modules.movement + +import com.paragon.Paragon +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.move.MoveEvent +import com.paragon.backend.event.events.paragon.SettingUpdateEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Setting +import com.paragon.backend.setting.SettingContainer +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.Timer +import com.paragon.util.inventory.InventoryUtil +import com.paragon.util.mc +import com.paragon.util.nullCheck +import com.paragon.util.truncate +import me.bush.eventbus.annotation.EventListener +import net.minecraft.enchantment.EnchantmentHelper +import net.minecraft.item.FireworkRocketItem +import net.minecraft.item.ItemStack +import net.minecraft.item.Items +import net.minecraft.item.TridentItem +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket +import net.minecraft.util.Hand +import net.minecraft.util.math.Vec3d +import kotlin.math.cos +import kotlin.math.sin + +/** + * @author surge + * @since 13/03/2023 + */ +object ElytraFlight : Module("Elytra Flight", "Allows you to fly easier with elytra", Category.MOVEMENT) { + + private var modeInstance: Setting + + private val mode by enum("Mode", Mode.VANILLA, "How to apply easier flight").also { + modeInstance = it + } + + private val vanillaSettings = object : SettingContainer() { + + val horizontalSpeed by double("Horizontal", 1.0, 0.1, 0.1..5.0, "How fast you move horizontally") + val verticalSpeed by double("Vertical", 1.0, 0.1, 0.1..5.0, "How fast you move vertically") + + }.also { + it.visibleWhen { mode == Mode.VANILLA } + register(it) + } + + private val fireworkSettings = object : SettingContainer() { + + val delay by double("Delay", 10.0, 0.1, 1.0..20.0, "The delay (in seconds) between using firework rockets") + val resetIdle by bool("Reset Idle", false, "Reset the timer when not flying") + val autoSwap by enum("Auto Swap", AutoSwap.CLIENT, "How to swap to rockets") + val swapBack by bool("Swap Back", true, "Automatically swap back to your original slot") visibility { autoSwap != AutoSwap.NONE } + val substituteTrident by bool("Substitute Trident", true, "Use a trident in place of fireworks if the conditions are met") + + }.also { + it.visibleWhen { mode == Mode.FIREWORK } + register(it) + } + + private val autoTakeoff by bool("Auto Takeoff", true, "Automatically starts flying when you press the jump button") + + private val takeoffSettings = object : SettingContainer() { + + val delay by int("Takeoff Delay", 8, 1, 0..20, "How many ticks to wait before flying") + + }.also { + it.visibleWhen { autoTakeoff } + register(it) + } + + private var jumpDelay = 0 + + override val info = { + when (mode) { + Mode.VANILLA -> "" + else -> (fireworkSettings.delay - (FireworkProcessor.timer.timeMs() / 1000f)).truncate(1) + } + } + + override fun postLoad() { + if (this.isEnabled) { + this.mode.processor.enable() + } + } + + override fun enable() { + jumpDelay = 0 + this.mode.processor.enable() + } + + override fun disable() { + if (!nullCheck()) { + Paragon.inventoryManager.sync() + } + + this.mode.processor.disable() + } + + @EventListener + fun onSettingUpdate(event: SettingUpdateEvent) { + if (event.setting == modeInstance) { + this.mode.processor.disable() + } + } + + @EventListener + fun onTick(event: TickEvent) { + if (autoTakeoff && mc.options.jumpKey.isPressed && !mc.player!!.isFallFlying && mc.player!!.armorItems.any { it.item == Items.ELYTRA && it.damage != it.maxDamage }) { + if (jumpDelay < takeoffSettings.delay) { + jumpDelay++ + } else { + jumpDelay = 0 + + if (mc.player!!.isOnGround) { + mc.player!!.setJumping(false) + mc.player!!.jump() + } + + mc.networkHandler!!.sendPacket(ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)) + mc.player!!.startFallFlying() + + Paragon.toastManager.info(this.name, "Deploying Elytra!", 2000L) + } + } else { + jumpDelay = 0 + } + + mode.processor.onTick() + } + + private abstract class ModeProcessor { + + fun enable() { + Paragon.bus.subscribe(this) + } + + fun disable() { + Paragon.bus.unsubscribe(this) + } + + abstract fun onTick() + + } + + private object VanillaProcessor : ModeProcessor() { + + override fun onTick() {} + + @EventListener + fun onMove(event: MoveEvent) { + if (mc.player!!.isFallFlying) { + var forward = if (mc.options.forwardKey.isPressed) 1f else if (mc.options.backKey.isPressed) -1f else 0f + var strafe = if (mc.options.leftKey.isPressed) 1f else if (mc.options.rightKey.isPressed) -1f else 0f + val vertical = if (mc.options.jumpKey.isPressed) 1f else if (mc.options.sneakKey.isPressed) -1f else 0f + + var playerYaw = mc.player!!.yaw + + if (forward != 0f) { + if (strafe >= 1) { + playerYaw += (if (forward > 0) -45 else 45).toFloat() + strafe = 0f + } else if (strafe <= -1) { + playerYaw += (if (forward > 0) 45 else -45).toFloat() + strafe = 0f + } + + forward = if (forward > 0) { + 1f + } else { + -1f + } + } + + val sin = sin(Math.toRadians((playerYaw + 90).toDouble())) + val cos = cos(Math.toRadians((playerYaw + 90).toDouble())) + + val velocity = Vec3d(forward.toDouble() * vanillaSettings.horizontalSpeed * cos + strafe.toDouble() * vanillaSettings.horizontalSpeed * sin, vertical * vanillaSettings.verticalSpeed, forward.toDouble() * vanillaSettings.horizontalSpeed * sin - strafe.toDouble() * vanillaSettings.horizontalSpeed * cos) + + event.setX(velocity.x) + event.setY(velocity.y) + event.setZ(velocity.z) + } + } + + } + + private object FireworkProcessor : ModeProcessor() { + + val timer = Timer() + + override fun onTick() { + if (mc.player!!.isFallFlying && !mc.isPaused) { + if (timer.elapsed(fireworkSettings.delay, Timer.Format.SECONDS)) { + var hand = Hand.MAIN_HAND + + val original = mc.player!!.inventory.selectedSlot + + val tridentFound = InventoryUtil.find(InventoryUtil.HOTBAR) { + it.item is TridentItem && EnchantmentHelper.getRiptide(it) > 0 + } + + val shouldTrident = fireworkSettings.substituteTrident && tridentFound > -1 && mc.player!!.isTouchingWaterOrRain + + if (InventoryUtil.hasStackIn(Hand.OFF_HAND, FireworkRocketItem::class.java)) { + hand = Hand.OFF_HAND + } else { + when (fireworkSettings.autoSwap) { + AutoSwap.NONE -> { + if (mc.player!!.mainHandStack.item !is FireworkRocketItem && shouldTrident && mc.player!!.mainHandStack.item !is TridentItem) { + return + } + } + + AutoSwap.CLIENT, AutoSwap.SERVER -> { + val slot = if (shouldTrident) tridentFound else nextSlot + + if (slot == -1) { + return + } + + if (fireworkSettings.autoSwap == AutoSwap.CLIENT) { + mc.player!!.inventory.selectedSlot = slot + } else { + Paragon.inventoryManager.swap(slot) + } + } + } + } + + if (shouldTrident) { + mc.player!!.mainHandStack.onStoppedUsing(mc.world!!, mc.player!!, 0) + } else { + val result = mc.interactionManager!!.interactItem(mc.player, hand) + + if (result.shouldSwingHand()) { + mc.player!!.swingHand(hand) + } + } + + if (fireworkSettings.swapBack && mc.player!!.inventory.selectedSlot != original && hand == Hand.MAIN_HAND) { + if (fireworkSettings.autoSwap == AutoSwap.CLIENT || fireworkSettings.autoSwap == AutoSwap.SERVER) { + if (fireworkSettings.autoSwap == AutoSwap.CLIENT) { + mc.player!!.inventory.selectedSlot = original + } else { + Paragon.inventoryManager.swap(original) + } + } + } + + timer.reset() + } + } else if (fireworkSettings.resetIdle) { + timer.reset() + } + } + + private val nextSlot: Int + get() { + var slot: Int = mc.player!!.inventory.selectedSlot + var count = 0 + + if (mc.player!!.inventory.getStack(slot).item is FireworkRocketItem) { + count = mc.player!!.inventory.getStack(slot).count + } else { + slot = -1 + } + + for (i in 0..8) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + + if (stack.item is FireworkRocketItem && stack.count > count) { + slot = i + count = stack.count + } + } + + return slot + } + + } + + private enum class Mode(val processor: ModeProcessor) { + VANILLA(VanillaProcessor), + FIREWORK(FireworkProcessor) + } + + private enum class AutoSwap { + NONE, + CLIENT, + SERVER + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/Flight.kt b/src/main/kotlin/com/paragon/client/modules/movement/Flight.kt new file mode 100644 index 0000000..f769ad1 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/Flight.kt @@ -0,0 +1,70 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.MoveUtil.moving +import com.paragon.util.calculations.MoveUtil.strafe +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge, aesthetical + * @since 11/02/2023 + */ +object Flight : Module("Flight", "Lets you fly in survival mode", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.MOTION, "How to fly") + private val speed by float("Speed", 0.07f, 0.01f, 0.01f..0.5f, "How fast you fly") + + override val info = { mode.toString() } + + override fun disable() { + if (mode == Mode.CREATIVE) { + mc.player!!.abilities.flying = false + mc.player!!.abilities.flySpeed = 0.05f + + if (!mc.player!!.abilities.creativeMode) { + mc.player!!.abilities.allowFlying = false + } + } + } + + @EventListener + fun onTick(event: TickEvent?) { + when (mode) { + Mode.MOTION -> { + if (moving()) { + val strafe = strafe(speed * 10.0) + (mc.player!!.velocity as IVec3d).set(strafe[0], strafe[1]) + } else { + (mc.player!!.velocity as IVec3d).set(0.0, 0.0) + } + + if (mc.options.jumpKey.isPressed) { + (mc.player!!.velocity as IVec3d).setY(speed * 10.0) + } else if (mc.options.sneakKey.isPressed) { + (mc.player!!.velocity as IVec3d).setY(-speed * 10.0) + } else { + (mc.player!!.velocity as IVec3d).setY(0.0) + } + } + + Mode.CREATIVE -> { + mc.player!!.abilities.flySpeed = speed + mc.player!!.abilities.allowFlying = true + + if (!mc.player!!.abilities.creativeMode) { + mc.player!!.abilities.flying = true + } + } + } + } + + enum class Mode { + MOTION, + CREATIVE + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/InventoryMove.kt b/src/main/kotlin/com/paragon/client/modules/movement/InventoryMove.kt new file mode 100644 index 0000000..615e063 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/InventoryMove.kt @@ -0,0 +1,62 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.client.gui.screen.ChatScreen +import net.minecraft.client.gui.screen.ingame.AnvilScreen +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen +import net.minecraft.client.option.KeyBinding +import net.minecraft.client.util.InputUtil +import net.minecraft.util.math.MathHelper +import org.lwjgl.glfw.GLFW + +/** + * @author aesthetical + * @since 02/18/23 + */ +object InventoryMove : Module("Inventory Move", "Lets you walk around in inventories", Category.MOVEMENT) { + + private val arrowRotate by bool("Arrow Rotate", true, "If to rotate in guis with the arrow keys") + private val speed by float("Rotate Speed", 5.0f, 0.1f, 1.0f..20.0f, "The speed to rotate with the arrow keys") + + private var bindings: Array? = null + + override fun disable() { + super.disable() + bindings = null + } + + @EventListener + fun onTick(event: TickEvent?) { + if (mc.currentScreen != null && mc.currentScreen !is ChatScreen && mc.currentScreen !is AnvilScreen && mc.currentScreen !is CreativeInventoryScreen) { + if (bindings == null) { + bindings = arrayOf(mc.options.forwardKey, mc.options.backKey, mc.options.rightKey, mc.options.leftKey) + return + } + + val handle = mc.window.handle + + for (binding in bindings!!) { + binding.isPressed = InputUtil.isKeyPressed(handle, binding.defaultKey.code) + } + + if (arrowRotate) { + if (InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_UP)) { + mc.player!!.pitch = mc.player!!.pitch - speed + } else if (InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_DOWN)) { + mc.player!!.pitch = mc.player!!.pitch + speed + } else if (InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_RIGHT)) { + mc.player!!.yaw = mc.player!!.yaw + speed + } else if (InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_LEFT)) { + mc.player!!.yaw = mc.player!!.yaw - speed + } + + mc.player!!.pitch = MathHelper.clamp(mc.player!!.pitch, -90.0f, 90.0f) + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/LongJump.kt b/src/main/kotlin/com/paragon/client/modules/movement/LongJump.kt new file mode 100644 index 0000000..f6a1ff7 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/LongJump.kt @@ -0,0 +1,80 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.move.MoveEvent +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.MoveUtil +import com.paragon.util.calculations.MoveUtil.moving +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import kotlin.math.sqrt + +/** + * @author aesthetical + * @since 02/19/23 + */ +object LongJump : Module("Long Jump", "jumps longer than ur mom to a mcdonalds", Category.MOVEMENT) { + + private var mode by enum("Mode", Mode.NCP, "How to long jump") + private var boost by double("Boost", 1.5, 0.1, 0.1..8.0, "Boost speed for jumping") + + private var moveSpeed = 0.0 + private var travelDistance = 0.0 + private var stage = 0 + + override val info = { mode.toString() } + + override fun enable() { + super.enable() + moveSpeed = 0.0 + travelDistance = 0.0 + stage = 0 + } + + @EventListener + fun onMove(event: MoveEvent) { + if (moving()) { + + if (mode == Mode.NCP) { + when (stage) { + 0 -> moveSpeed = boost + MoveUtil.getBaseNcpSpeed(0) - 0.05 + 1 -> { + event.setY(0.42) + (mc.player!!.velocity as IVec3d).setY(0.42) + moveSpeed *= 2.13 + } + 2 -> { + val diff: Double = 0.66 * (travelDistance - MoveUtil.getBaseNcpSpeed(0)) + moveSpeed = travelDistance - diff + } + else -> moveSpeed = travelDistance - travelDistance / 159.0 + } + + moveSpeed = moveSpeed.coerceAtLeast(MoveUtil.getBaseNcpSpeed(0)) + event.setSpeed(moveSpeed) + + ++stage + } else if (mode == Mode.VANILLA) { + if (mc.player!!.isOnGround) { + event.setY(0.42) + (mc.player!!.velocity as IVec3d).setY(0.42) + } + + event.setSpeed(boost) + } + } + } + + @EventListener + fun onMoveUpdate(event: MoveUpdateEvent?) { + val diffX: Double = mc.player!!.getX() - mc.player!!.prevX + val diffZ: Double = mc.player!!.getZ() - mc.player!!.prevZ + travelDistance = sqrt(diffX * diffX + diffZ * diffZ) + } + + enum class Mode { + NCP, VANILLA + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/NoFall.kt b/src/main/kotlin/com/paragon/client/modules/movement/NoFall.kt new file mode 100644 index 0000000..2f59403 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/NoFall.kt @@ -0,0 +1,43 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.net.PacketEvent.Outbound +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.mixins.net.packet.c2s.IPlayerMoveC2SPacket +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket + +/** + * @author KassuK, aesthetical + * @since 02/18/23 + */ +object NoFall : Module("No Fall", "Prevents fall damage", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.SPOOF, "The anti-cheat bypass mode") + private val distance by float("Fall Distance", 3.0f, 0.1f,3.0f..120.0f, "The distance required to have fallen before reducing more fall damage") + + override val info = { mode.toString() } + + @EventListener + fun onPacketOutbound(event: Outbound) { + if (nullCheck()) { + return + } + + if (event.packet is PlayerMoveC2SPacket && mc.player!!.fallDistance >= distance) { + (event.packet as IPlayerMoveC2SPacket).setOnGround(true) + + if (mode == Mode.REDUCE) { + mc.player!!.fallDistance = 0.0f + } + } + } + + enum class Mode { + SPOOF, + REDUCE + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/NoSlowDown.kt b/src/main/kotlin/com/paragon/client/modules/movement/NoSlowDown.kt new file mode 100644 index 0000000..2e02a7d --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/NoSlowDown.kt @@ -0,0 +1,49 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.input.control.ItemSlowdownEvent +import com.paragon.backend.event.events.input.control.SneakSlowdownEvent +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket + +/** + * @author aesthetical + * @since 02/17/23 + */ +object NoSlowDown : Module("No Slow Down", "Stops you from getting slowed down", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.VANILLA, "How to bypass the anti-cheat") + private val sneak by bool("Sneak", false, "Stops sneaking from slowing you down") + + override val info = { mode.toString() } + + @EventListener + fun onItemSlowdown(event: ItemSlowdownEvent) { + if (mc.player!!.isUsingItem && !mc.player!!.isRiding && event.entity == mc.player) { + event.isCancelled = true + } + } + + @EventListener + fun onMoveUpdate(event: MoveUpdateEvent) { + if (mc.player!!.isUsingItem && !mc.player!!.isRiding && mode == Mode.NEW_NCP) { + mc.player!!.networkHandler.sendPacket(UpdateSelectedSlotC2SPacket(mc.player!!.inventory.selectedSlot)) + } + } + + @EventListener + fun onSneakSlowdown(event: SneakSlowdownEvent) { + if (event.entity == mc.player && sneak) { + event.isCancelled = true + } + } + + enum class Mode { + VANILLA, + NEW_NCP + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/Speed.kt b/src/main/kotlin/com/paragon/client/modules/movement/Speed.kt new file mode 100644 index 0000000..e3b2b00 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/Speed.kt @@ -0,0 +1,154 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.move.MoveEvent +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.client.modules.player.GameSpeed.setTimerSpeed +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.MoveUtil +import com.paragon.util.calculations.MoveUtil.moving +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import kotlin.math.sqrt + + +/** + * @author aesthetical + * @since 02/19/23 + */ +object Speed : Module("Speed", "Speedy speed", Category.MOVEMENT) { + + private var mode by enum("Mode", Mode.OLD_NCP_HOP, "How to go vroom vroom") + private var useTimer by bool("Timer", true, "Use timer to give an extra speed boost") + + private var moveSpeed = 0.0 + private var travelDistance = 0.0 + private var boost = false + private var hopStage = 0 + + override val info = { mode.name } + + override fun enable() { + super.enable() + hopStage = 4 + moveSpeed = 0.0 + travelDistance = 0.0 + boost = false + } + + @EventListener + fun onTick(event: TickEvent) { + if (mode == Mode.OLD_NCP_YPORT) { + if (moving()) { + mc.player!!.isSprinting = true + moveSpeed = 1.25 * MoveUtil.getBaseNcpSpeed(0) - 0.1 + if (mc.player!!.isOnGround) { + mc.player!!.jump() + moveSpeed *= if (useTimer) { + if (mc.player!!.age % 10 == 0) { + setTimerSpeed(1.35f) + } else { + setTimerSpeed(if (boost) 1.088f else 1.098f) + } + if (boost) 1.62 else 1.526 + } else { + setTimerSpeed(1.0f) + if (boost) 1.622 else 1.545 + } + } else { + boost = !boost + (mc.player!!.velocity as IVec3d).setY(-4.0) + setTimerSpeed(1.0f) + } + } + } + } + + @EventListener + fun onMove(event: MoveEvent) { + when (mode) { + Mode.OLD_NCP_YPORT -> { + if (moving()) { + event.setSpeed(moveSpeed) + } else { + event.nullOutVelocity() + } + } + + Mode.OLD_NCP_HOP, Mode.NEW_NCP_HOP -> { + val oldNcp: Boolean = mode == Mode.OLD_NCP_HOP + if (mc.player!!.isOnGround && moving()) { + hopStage = 2 + } + + if (hopStage == 1) { + val factor = if (oldNcp) 1.37 else 1.6 + moveSpeed = factor * MoveUtil.getBaseNcpSpeed(15) - 0.01 + hopStage = 2 + } else if (hopStage == 2) { + if (mc.player!!.isOnGround && moving()) { + val height = MoveUtil.getJumpHeight(0.3995) + event.setY(height) + (mc.player!!.velocity as IVec3d).setY(height) + + moveSpeed *= if (oldNcp) { + if (boost) 1.624 else 1.543 + } else { + if (boost) 1.53 else 1.41 + } + + setTimerSpeed(1.0f) + } + + hopStage = 3 + } else if (hopStage == 3) { + if (useTimer) { + if (oldNcp) { + setTimerSpeed(1.088f) + } else { + setTimerSpeed(if (boost) 1.088f else 1.073f) + } + } else { + setTimerSpeed(1.0f) + } + + val adjustment: Double = (if (boost) 0.72 else 0.66) * (travelDistance - MoveUtil.getBaseNcpSpeed(15)) + moveSpeed = travelDistance - adjustment + boost = !boost + hopStage = 4 + } else if (hopStage == 4) { + if (mc.world!!.getEntityCollisions(mc.player, mc.player!!.boundingBox.offset(0.0, mc.player!!.velocity.y, 0.0)).isNotEmpty()) { + hopStage = 1 + } + + moveSpeed = travelDistance - travelDistance / 150.0 + } + + moveSpeed = Math.max(moveSpeed, MoveUtil.getBaseNcpSpeed(15)) + if (moving()) { + event.setSpeed(moveSpeed) + } else { + event.nullOutVelocity() + } + } + + else -> { + // empty, kys kotlin + } + } + } + + @EventListener + fun onMoveUpdate(event: MoveUpdateEvent?) { + val diffX = mc.player!!.x - mc.player!!.prevX + val diffZ = mc.player!!.z - mc.player!!.prevZ + travelDistance = sqrt(diffX * diffX + diffZ * diffZ) + } + + enum class Mode { + OLD_NCP_HOP, OLD_NCP_YPORT, NEW_NCP_HOP + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/Sprint.kt b/src/main/kotlin/com/paragon/client/modules/movement/Sprint.kt new file mode 100644 index 0000000..77a2391 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/Sprint.kt @@ -0,0 +1,49 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.net.PacketEvent.Outbound +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.MoveUtil.moving +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket + +/** + * @author aesthetical, KassuK + * @since 02/18/23 + */ +object Sprint : Module("Sprint", "Automatically sprints for you", Category.MOVEMENT) { + + private val mode by enum("Mode", Mode.LEGIT, "How to sprint") + private val fullRage by bool("Full Rage", true, "If to never stop sprinting server side") visibility { mode == Mode.RAGE } + + override val info = { mode.toString() } + + @EventListener + fun onTick(event: TickEvent) { + if (!mc.player!!.isSprinting) { + mc.player!!.isSprinting = when (mode) { + Mode.LEGIT -> (mc.player!!.input.movementForward > 0.0f && !mc.player!!.isSneaking && !mc.player!!.isUsingItem && mc.player!!.hungerManager.foodLevel > 6) && !mc.player!!.horizontalCollision + Mode.OMNI -> moving() && !mc.player!!.horizontalCollision && mc.player!!.hungerManager.foodLevel > 6 + else -> true + } + } + } + + @EventListener + fun onPacketOutbound(event: Outbound) { + if (mode == Mode.RAGE && fullRage && event.packet is ClientCommandC2SPacket) { + if (event.packet.mode == ClientCommandC2SPacket.Mode.STOP_SPRINTING) { + event.isCancelled = true + } + } + } + + enum class Mode { + LEGIT, + RAGE, + OMNI + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/Step.kt b/src/main/kotlin/com/paragon/client/modules/movement/Step.kt new file mode 100644 index 0000000..19eeef6 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/Step.kt @@ -0,0 +1,44 @@ +package com.paragon.client.modules.movement + +import com.paragon.Paragon +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 11/02/2023 + */ +object Step : Module("Step", "Lets you instantly walk up blocks", Category.MOVEMENT) { + + private val height by float("Height", 1.0f, 0.1f, 0.5f..2.5f, "The maximum height you can step up") + + override val info = { height.toString() } + + override fun enable() { + super.enable() + Paragon.baritoneManager.set("assumeStep", true) + } + + override fun disable() { + Paragon.baritoneManager.set("assumeStep", false) + if (nullCheck()) { + return + } + + mc.player!!.stepHeight = 0.6f + } + + @EventListener + fun onTick(event: TickEvent) { + if (nullCheck()) { + return + } + + mc.player!!.stepHeight = height + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/movement/TridentBoost.kt b/src/main/kotlin/com/paragon/client/modules/movement/TridentBoost.kt new file mode 100644 index 0000000..7681688 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/movement/TridentBoost.kt @@ -0,0 +1,23 @@ +package com.paragon.client.modules.movement + +import com.paragon.backend.event.events.move.TridentVelocityEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 24/02/2023 + */ +object TridentBoost : Module("Trident Boost", "Adds an additional boost when you use a trident", Category.MOVEMENT) { + + private val multiplier by double("Multiplier", 1.5, 0.1, 0.1..3.0, "How much your velocity is multiplied by") + + @EventListener + fun onTridentVelocity(event: TridentVelocityEvent) { + event.x *= multiplier + event.y *= multiplier + event.z *= multiplier + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/AirPlace.kt b/src/main/kotlin/com/paragon/client/modules/player/AirPlace.kt new file mode 100644 index 0000000..2fbc551 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/AirPlace.kt @@ -0,0 +1,87 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.managers.placement.PlacementData +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.box +import com.paragon.util.getClientColour +import com.paragon.util.getPlaceableSide +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.BlockItem +import net.minecraft.util.hit.BlockHitResult +import net.minecraft.util.hit.HitResult +import net.minecraft.util.math.Direction + +/** + * @author surge + * @since 12/03/2023 + */ +object AirPlace : Module("Air Place", "Allows you to place blocks wherever you are looking", Category.PLAYER) { + + private val pause by int("Pause", 5, 1, 0..20, "The delay (in ticks) between placing blocks") + + private val box by enum("Box", Box.BOTH, "How to draw the box") + private val alpha by int("Alpha", 100, 1, 0..255, "The alpha of the fill") visibility { box == Box.FILL || box == Box.BOTH } + + private var tick = 0 + private var result: HitResult? = null + + @EventListener + fun onTick(event: TickEvent) { + result = mc.cameraEntity!!.raycast(mc.interactionManager!!.reachDistance.toDouble(), 0f, false) + + if (result !is BlockHitResult || mc.player!!.mainHandStack.item !is BlockItem) { + return + } + + if (mc.options.useKey.isPressed) { + if (tick >= pause) { + Paragon.placementManager.submit( + (result as BlockHitResult).blockPos, + PlacementData( + mc.player!!.inventory.selectedSlot, + (result as BlockHitResult).blockPos.getPlaceableSide() ?: Direction.UP + ) + ) + + tick = 0 + } else { + tick++ + } + } else { + tick = 0 + } + } + + @EventListener + fun onGameRender(event: GameRenderEvent) { + if (box == Box.NONE) { + return + } + + result?.let { + it as BlockHitResult + + if (box == Box.FILL || box == Box.BOTH) { + Renderer.box(event.matrices, it.blockPos.box(), getClientColour().integrateAlpha(alpha), Renderer.DrawMode.FILL) + } + + if (box == Box.OUTLINE || box == Box.BOTH) { + Renderer.box(event.matrices, it.blockPos.box(), getClientColour(), Renderer.DrawMode.LINES) + } + } + } + + private enum class Box { + FILL, + OUTLINE, + BOTH, + NONE + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/AutoElytra.kt b/src/main/kotlin/com/paragon/client/modules/player/AutoElytra.kt new file mode 100644 index 0000000..819d6da --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/AutoElytra.kt @@ -0,0 +1,53 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.Items +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket + +/** + * @author surge + * @since 28/02/2023 + */ +object AutoElytra : Module("Auto Elytra", "Automatically starts gliding if you are falling", Category.PLAYER) { + + /** + * TODO: Auto equip Elytra if not already equipped + */ + + private val distance by double("Distance", 5.0, 0.5, 1.0..50.0, "The fall distance to start gliding at") + + private var warned = false + + override val info = { + if (mc.player!!.isOnGround || mc.player!!.isFallFlying || mc.player!!.fallDistance > distance) { + null + } else { + String.format("%.2f", (distance - mc.player!!.fallDistance).toFloat()) + } + } + + @EventListener + fun onTick(event: TickEvent) { + if (mc.player!!.fallDistance >= distance && !mc.player!!.isFallFlying) { + if (mc.player!!.armorItems.any { it.item == Items.ELYTRA && it.damage != it.maxDamage }) { + mc.player!!.networkHandler.sendPacket(ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_FALL_FLYING)) + mc.player!!.startFallFlying() + + Paragon.toastManager.info(this.name, "Deploying Elytra!", 2000L) + } else if (!warned) { + Paragon.toastManager.warn(this.name, "Elytra not found!", 2000L) + warned = true + } + } + + if (mc.player!!.isOnGround) { + warned = false + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/AutoRespawn.kt b/src/main/kotlin/com/paragon/client/modules/player/AutoRespawn.kt new file mode 100644 index 0000000..6103329 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/AutoRespawn.kt @@ -0,0 +1,23 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket + +/** + * @author aesthetical + * @since 02/18/23 + */ +object AutoRespawn : Module("Auto Respawn", "Automatically respawns you", Category.PLAYER) { + + @EventListener + fun onTick(event: TickEvent?) { + if (mc.player!!.isDead || mc.player!!.health <= 0.0f) { + mc.player!!.networkHandler.sendPacket(ClientStatusC2SPacket(ClientStatusC2SPacket.Mode.PERFORM_RESPAWN)) + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/AutoTool.kt b/src/main/kotlin/com/paragon/client/modules/player/AutoTool.kt new file mode 100644 index 0000000..ca5e5b9 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/AutoTool.kt @@ -0,0 +1,65 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.event.events.input.control.AttackBlockEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.util.math.BlockPos + +/** + * @author aesthetical + * @since 02/22/23 + */ +object AutoTool : Module("Auto Tool", "Automatically swaps to the best tool", Category.PLAYER) { + + override fun enable() { + super.enable() + Paragon.baritoneManager.set("autoTool", false) + Paragon.baritoneManager.set("useSwordToMine", false) + } + + override fun disable() { + super.disable() + Paragon.baritoneManager.restoreValue("autoTool") + Paragon.baritoneManager.restoreValue("useSwordToMine") + } + + @EventListener + fun onAttackBlock(event: AttackBlockEvent) { + val slot = bestSlot(event.blockPos) + if (slot == -1 || slot == Paragon.inventoryManager.slot) { + return + } + + mc.player!!.inventory.selectedSlot = slot + } + + @JvmStatic + fun bestSlot(pos: BlockPos): Int { + val state = mc.world!!.getBlockState(pos) + if (state.getHardness(null, null) == -1.0f) { + return -1 + } + + var slot = -1 + var dmg = 0.0f + + for (i in 0..8) { + val stack = mc.player!!.inventory.getStack(i) + if (stack.isEmpty) { + continue + } + + val toolDmg = stack.item.getMiningSpeedMultiplier(stack, state) + if (toolDmg > dmg) { + slot = i + dmg = toolDmg + } + } + + return if (slot == -1) Paragon.inventoryManager.slot else slot + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/BlockFly.kt b/src/main/kotlin/com/paragon/client/modules/player/BlockFly.kt new file mode 100644 index 0000000..7dd9e48 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/BlockFly.kt @@ -0,0 +1,150 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.event.EventEra +import com.paragon.backend.event.events.move.MoveUpdateEvent +import com.paragon.backend.managers.placement.PlacementData +import com.paragon.backend.managers.placement.Swing +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IVec3d +import com.paragon.util.calculations.MoveUtil.getVanillaJumpVelocity +import com.paragon.util.calculations.rotation.RotationUtil +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.BlockItem +import net.minecraft.item.ItemStack +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction + +/** + * @author aesthetical + * @since 02/17/23 + */ +object BlockFly : Module("Block Fly", "Rapidly places blocks under your feet", Category.PLAYER) { + + private val rotate by bool("Rotate", true, "If to rotate where you're placing") + private val swing by enum("Swing", Swing.CLIENT, "How to swing") + private val autoSwap by enum("Auto Swap", AutoSwap.SERVER, "Automatically swap to a block slot") + private val tower by bool("Tower", true, "If to tower") + + private var prev: PlaceResult? = null + private var curr: PlaceResult? = null + + override fun disable() { + curr = null + prev = curr + + if (!nullCheck()) { + Paragon.inventoryManager.sync() + } + } + + @EventListener(recieveCancelled = true) + fun onMoveUpdate(event: MoveUpdateEvent) { + prev = curr + curr = next() + + if (rotate && prev != null) { + Paragon.rotationManager.submit(RotationUtil.calcAngleToBlock(prev!!.pos, prev!!.direction)) + } + + if (curr == null) { + return + } + + if (event.era == EventEra.POST) { + when (autoSwap) { + AutoSwap.NONE -> { + if (mc.player!!.mainHandStack.item !is BlockItem) { + return + } + } + + AutoSwap.CLIENT, AutoSwap.SERVER -> { + val slot = nextSlot + + if (slot == -1) { + return + } + + if (autoSwap == AutoSwap.CLIENT) { + mc.player!!.inventory.selectedSlot = slot + } else { + Paragon.inventoryManager.swap(slot) + } + } + } + + Paragon.placementManager.submit(curr!!.pos, PlacementData(mc.player!!.inventory.selectedSlot, curr!!.direction, swing).accept { + if (tower && mc.options.jumpKey.isPressed) { + (mc.player!!.velocity as IVec3d).setY(getVanillaJumpVelocity().toDouble()) + + if (mc.player!!.age % 4 == 0 || mc.player!!.isOnGround) { + (mc.player!!.velocity as IVec3d).setY(getVanillaJumpVelocity().toDouble()) + } + } + }) + } + } + + private val nextSlot: Int + get() { + var slot: Int = mc.player!!.inventory.selectedSlot + var count = 0 + + if (mc.player!!.inventory.getStack(slot).item is BlockItem) { + count = mc.player!!.inventory.getStack(slot).count + } else { + slot = -1 + } + + for (i in 0..8) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + + if (stack.item is BlockItem && stack.count > count) { + slot = i + count = stack.count + } + } + + return slot + } + + private operator fun next(): PlaceResult? { + val pos: BlockPos = BlockPos(mc.player!!.pos).down() + + for (direction in Direction.values()) { + val n = pos.offset(direction) + + if (!mc.world!!.getBlockState(n).material.isReplaceable) { + return PlaceResult(n, direction.opposite) + } + } + + for (direction in Direction.values()) { + val n = pos.offset(direction) + + if (mc.world!!.getBlockState(n).material.isReplaceable) { + for (d in Direction.values()) { + val nn = n.offset(d) + + if (!mc.world!!.getBlockState(nn).material.isReplaceable) { + return PlaceResult(nn, d.opposite) + } + } + } + } + return null + } + + private data class PlaceResult(val pos: BlockPos, val direction: Direction) + + enum class AutoSwap { + NONE, + CLIENT, + SERVER + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/FakePlayer.kt b/src/main/kotlin/com/paragon/client/modules/player/FakePlayer.kt new file mode 100644 index 0000000..1f44f2b --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/FakePlayer.kt @@ -0,0 +1,102 @@ +package com.paragon.client.modules.player + +import com.mojang.authlib.GameProfile +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener +import net.minecraft.client.network.OtherClientPlayerEntity +import net.minecraft.client.world.ClientWorld +import net.minecraft.entity.Entity +import net.minecraft.entity.Entity.RemovalReason +import net.minecraft.entity.damage.DamageSource +import net.minecraft.entity.effect.StatusEffectInstance +import net.minecraft.entity.effect.StatusEffects +import net.minecraft.item.ItemStack +import net.minecraft.item.Items +import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket +import net.minecraft.util.Hand +import java.util.* + +/** + * @author aesthetical + * @since 02/19/23 + */ +object FakePlayer : Module("Fake Player", "Spawns a fake player", Category.PLAYER) { + + private var fake: EntityFakePlayer? = null + + override fun enable() { + if (nullCheck()) { + toggle() + return + } + + fake = EntityFakePlayer(mc.world!!, GameProfile(UUID.randomUUID(), "Fake")) + + fake!!.copyPositionAndRotation(mc.player) + fake!!.inventory.clone(mc.player!!.inventory) + fake!!.id = -137769420 + + mc.world!!.spawnEntity(fake) + mc.world!!.addEntity(fake!!.id, fake) + } + + override fun disable() { + if (!nullCheck()) { + mc.world!!.removeEntity(fake!!.id, RemovalReason.KILLED) + } + + fake = null + } + + @EventListener + fun onTick(event: TickEvent?) { + if (mc.player!!.age < 5) { + toggle() + return + } + } + + private class EntityFakePlayer(clientWorld: ClientWorld, gameProfile: GameProfile) : OtherClientPlayerEntity(clientWorld, gameProfile) { + + override fun damage(source: DamageSource, amount: Float): Boolean { + health -= amount + return true + } + + override fun tick() { + super.tick() + + if (getStackInHand(Hand.OFF_HAND).item != Items.TOTEM_OF_UNDYING) { + setStackInHand(Hand.OFF_HAND, ItemStack(Items.TOTEM_OF_UNDYING)) + } + + if (health <= 0.0f) { + mc.networkHandler!!.onEntityStatus(EntityStatusS2CPacket(this, 35.toByte())) + + health = 1.0f + absorptionAmount = 8.0f + + clearActiveItem() + addStatusEffect(StatusEffectInstance(StatusEffects.REGENERATION, 900, 1)) + addStatusEffect(StatusEffectInstance(StatusEffects.ABSORPTION, 100, 1)) + } + } + + override fun isAttackable(): Boolean { + return true + } + + override fun handleAttack(attacker: Entity): Boolean { + return false + } + + override fun canTakeDamage(): Boolean { + return true + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/FastPlace.kt b/src/main/kotlin/com/paragon/client/modules/player/FastPlace.kt new file mode 100644 index 0000000..ce4718d --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/FastPlace.kt @@ -0,0 +1,51 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IMinecraftClient +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.BlockItem +import net.minecraft.item.ItemStack +import net.minecraft.item.Items +import net.minecraft.util.Hand + +/** + * @author aesthetical + * @since 02/18/23 + */ +object FastPlace : Module("Fast Place", "Places items fast", Category.PLAYER) { + + private val speed by int("Speed", 4, 1, 1..4, "How fast to place items at") + private val exp by bool("EXP", true, "If to place exp fast") + private val blocks by bool("Blocks", true, "If to place blocks fast") + private val fireworks by bool("Fireworks", true, "If to place fireworks fast") + private val crystals by bool("Crystals", true, "If to place end crystals fast") + + @EventListener + fun onTick(event: TickEvent?) { + + // 10/10 code i love this + if (shouldFastPlace(mc.player!!.getStackInHand(Hand.MAIN_HAND)) || shouldFastPlace(mc.player!!.getStackInHand(Hand.OFF_HAND))) { + (mc as IMinecraftClient).setItemUseCooldown(4 - speed) + } + } + + private fun shouldFastPlace(activeStack: ItemStack): Boolean { + if (!exp && activeStack.item == Items.EXPERIENCE_BOTTLE) { + return false + } + + if (!blocks && activeStack.item is BlockItem) { + return false + } + + if (!fireworks && activeStack.item == Items.FIREWORK_ROCKET) { + return false + } + + return !(!crystals && activeStack.item == Items.END_CRYSTAL) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/GameSpeed.kt b/src/main/kotlin/com/paragon/client/modules/player/GameSpeed.kt new file mode 100644 index 0000000..3e23eb0 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/GameSpeed.kt @@ -0,0 +1,38 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.mixin.duck.IMinecraftClient +import com.paragon.mixin.duck.IRenderTickCounter +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener + +/** + * @author aesthetical + * @since 02/17/23 + */ +object GameSpeed : Module("Game Speed", "makes ur game go zoom zoom verus airlines", Category.PLAYER) { + + private val speed by float("Speed", 1.0f, 0.01f, 0.1f..20.0f, "The timer speed") + + override val info = { speed.toString() } + + override fun disable() { + if (!nullCheck()) { + setTimerSpeed(1.0f) + } + } + + @EventListener + fun onTick(event: TickEvent?) { + setTimerSpeed(speed) + } + + @JvmStatic + fun setTimerSpeed(speed: Float) { + ((mc as IMinecraftClient).renderTickCounter as IRenderTickCounter).tickLength = 50.0f / speed + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/InventoryManager.kt b/src/main/kotlin/com/paragon/client/modules/player/InventoryManager.kt new file mode 100644 index 0000000..5cbdb6f --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/InventoryManager.kt @@ -0,0 +1,4 @@ +package com.paragon.client.modules.player + +object InventoryManager { +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/LiquidPlace.kt b/src/main/kotlin/com/paragon/client/modules/player/LiquidPlace.kt new file mode 100644 index 0000000..d3ea8e2 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/LiquidPlace.kt @@ -0,0 +1,19 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.entity.RaycastEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 13/03/2023 + */ +object LiquidPlace : Module("Liquid Place", "Allows you to place blocks on liquids", Category.PLAYER) { + + @EventListener + fun onRaycast(event: RaycastEvent) { + event.includeFluids = true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/NoTrace.kt b/src/main/kotlin/com/paragon/client/modules/player/NoTrace.kt new file mode 100644 index 0000000..c094889 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/NoTrace.kt @@ -0,0 +1,32 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.bind.Bind +import com.paragon.backend.event.events.entity.EntityTraceEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.PickaxeItem + +/** + * @author surge + * @since 28/02/2023 + */ +object NoTrace : Module("No Trace", "Allows you to interact through entities", Category.PLAYER) { + + private val pickaxe by bool("Pickaxe", true, "Apply when holding a pickaxe") + private val bind by bind("Force Bind", Bind(this)) + + init { + Paragon.keyboardManager.addBind(bind) + } + + @EventListener + fun onEntityTrace(event: EntityTraceEvent) { + if (pickaxe && mc.player!!.isHolding { it.item is PickaxeItem } || bind.state) { + event.cancel() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/PacketMine.kt b/src/main/kotlin/com/paragon/client/modules/player/PacketMine.kt new file mode 100644 index 0000000..22892e4 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/PacketMine.kt @@ -0,0 +1,232 @@ +package com.paragon.client.modules.player + +import com.paragon.Paragon +import com.paragon.backend.event.events.input.control.AttackBlockEvent +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.client.modules.player.AutoTool.bestSlot +import com.paragon.mixin.duck.IClientPlayerInteractionManager +import com.paragon.util.calculations.rotation.RotationUtil +import com.paragon.util.mc +import com.paragon.util.nullCheck +import com.paragon.util.player.PlayerUtil +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.enchantment.EnchantmentHelper +import net.minecraft.enchantment.Enchantments +import net.minecraft.entity.effect.StatusEffects +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket +import net.minecraft.util.Hand +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Box +import net.minecraft.util.math.Direction +import net.minecraft.util.math.MathHelper + +/** + * @author aesthetical + * @since 02/20/23 + */ +object PacketMine : Module("Packet Mine", "Mines blocks with packets", Category.PLAYER) { + + private val percentage by float("Percentage", 0.95f, 0.05f, 0.0f..1.0f, "At what percentage to try and break the block") + private val click by bool("Self Click", false, "If to require client input to finish breaking the block") + private val rotate by bool("Rotate", false, "If to rotate towards the block you are breaking") + private val render by bool("Render", true, "If to render the block progress") + + private var blockPos: BlockPos? = null + private var direction: Direction? = null + private var sentBreak = false + private var sentStopBreak = false + private var spoofItem = false + private var override = false + private var progress = 0.0 + + override fun disable() { + super.disable() + + if (!nullCheck()) { + stopBlockBreaking() + + if (spoofItem) { + Paragon.inventoryManager.sync() + spoofItem = false + } + } + + override = false + sentBreak = false + blockPos = null + direction = null + progress = 0.0 + } + + @EventListener + fun onGameRender(event: GameRenderEvent) { + if (blockPos != null && render) { + var box = Box(0.0, 0.0, 0.0, 1.0, 1.0, 1.0) + box = box.offset(blockPos!!.x.toDouble(), blockPos!!.y.toDouble(), blockPos!!.z.toDouble()) + + val center = box.center + var bb = Box(center, center) + + val factor: Double = MathHelper.clamp(progress, 0.0, 1.0) + bb = bb.expand(factor * 0.5, factor * 0.5, factor * 0.5) + + val color = (if (factor >= percentage) Colour(0, 255, 0, 100) else Colour(255, 0, 0, 100)) + Renderer.box(event.matrices, bb, color, Renderer.DrawMode.FILL) + Renderer.box(event.matrices, bb, color, Renderer.DrawMode.LINES) + } + } + + @EventListener + fun onTick(event: TickEvent) { + if (blockPos != null && direction != null) { + val blockState = mc.world!!.getBlockState(blockPos) + if (blockState.material.isReplaceable || blockState.isAir || blockState.getHardness(null, null) == -1.0f) { + stopBlockBreaking() + + sentStopBreak = false + override = false + + if (spoofItem) { + Paragon.inventoryManager.sync() + spoofItem = false + } + return + } + + val slot = bestSlot(blockPos!!) + progress += getStrength(blockPos!!, slot) + if (progress >= percentage || override) { + + if (Paragon.inventoryManager.slot != slot && progress >= percentage) { + spoofItem = true + Paragon.inventoryManager.swap(slot) + } + + if (rotate) { + Paragon.rotationManager.submit(RotationUtil.calcAngleToBlock(blockPos!!, direction!!)) + } + + if (!sentStopBreak) { + + if (click && !override) { + return + } + + sentStopBreak = true + (mc.interactionManager as IClientPlayerInteractionManager).hookSendSequencedPacket(mc.world) { + return@hookSendSequencedPacket PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction, it) + } + } + } + } + } + + @EventListener + fun onAttackBlock(event: AttackBlockEvent) { + if (blockPos != null && event.blockPos != blockPos) { + stopBlockBreaking() + } + + if (blockPos != null && blockPos == event.blockPos) { + event.isCancelled = true + + if (click && progress >= percentage) { + override = true + } + + return + } + + val blockState = mc.world!!.getBlockState(event.blockPos) + if (blockState.material.isReplaceable || blockState.isAir || blockState.getHardness(null, null) == -1.0f) { + return + } + + event.isCancelled = true + + blockPos = event.blockPos + direction = event.direction + + if (!sentBreak) { + sentBreak = true + + PlayerUtil.silentSwing(Hand.MAIN_HAND) + (mc.interactionManager as IClientPlayerInteractionManager).hookSendSequencedPacket(mc.world) { + return@hookSendSequencedPacket PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, blockPos, direction, it) + } + } + } + + private fun stopBlockBreaking() { + if (sentBreak) { + mc.player!!.networkHandler.sendPacket(PlayerActionC2SPacket(PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, blockPos, direction)) + } + + override = false + progress = 0.0 + sentBreak = false + blockPos = null + direction = null + sentStopBreak = false + } + + private fun getStrength(blockPos: BlockPos, slot: Int): Double { + val at = mc.world!!.getBlockState(blockPos) + val held = mc.player!!.inventory.getStack(slot) + val hardness = at.getHardness(null, null) + if (hardness < 0.0f) { + return 0.0 + } + + val s = getDestroySpeed(blockPos, slot) + val f = (if (!held.isEmpty && held.isSuitableFor(at)) 30.0f else 100.0f).toDouble() + return s / hardness / f + } + + private fun getDestroySpeed(blockPos: BlockPos, slot: Int): Double { + val at = mc.world!!.getBlockState(blockPos) + val held = mc.player!!.inventory.getStack(slot) + + var breakSpeed = 1.0f + if (!held.isEmpty) { + breakSpeed *= held.getMiningSpeedMultiplier(at) + } + + if (breakSpeed > 1.0f) { + val effMod: Int = EnchantmentHelper.getLevel(Enchantments.EFFICIENCY, held) + if (effMod > 0) { + val mod = effMod * effMod + 1.0f + breakSpeed += if (!held.isSuitableFor(at)) { + mod * 0.08f + } else { + mod + } + } + } + + if (mc.player!!.hasStatusEffect(StatusEffects.HASTE)) { + val amp = mc.player!!.getStatusEffect(StatusEffects.HASTE)!!.amplifier + if (amp > 0) { + breakSpeed *= 1.0f + (amp + 1.0f) * 0.2f + } + } + + if (mc.player!!.hasStatusEffect(StatusEffects.MINING_FATIGUE)) { + val amp = mc.player!!.getStatusEffect(StatusEffects.MINING_FATIGUE)!!.amplifier + if (amp > 0) { + breakSpeed *= 1.0f + (amp + 1.0f) * 0.2f + } + } + + if (mc.player!!.isSubmergedInWater && !EnchantmentHelper.hasAquaAffinity(mc.player)) { + breakSpeed /= 5.0f + } + + return breakSpeed.toDouble() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/Replenish.kt b/src/main/kotlin/com/paragon/client/modules/player/Replenish.kt new file mode 100644 index 0000000..43bcf20 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/Replenish.kt @@ -0,0 +1,104 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.Timer +import com.paragon.util.inventory.InventoryUtil +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.item.BlockItem +import net.minecraft.item.ItemStack +import net.minecraft.screen.slot.SlotActionType + +/** + * @author aesthetical + * @since 02/18/23 + */ +object Replenish : Module("Replenish", "Automatically replenishes your hotbar", Category.PLAYER) { + + private val delay = double("Delay", 0.1, 0.1, 0.0..3.5, "How long before replenishing the next item") + private val percentage = float("Percentage", 75.0f, 0.1f, 1.0f..99.0f, "The percentage of item depletion before replenishing") + + private val hotbarCache: MutableMap = HashMap() + private val timer = Timer() + + override fun disable() { + super.disable() + hotbarCache.clear() + } + + @EventListener + fun onTick(event: TickEvent?) { + for (i in 0..8) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + + if (!stack.isEmpty) { + hotbarCache[i] = stack + } + } + + if (timer.elapsed((delay.value * 1000.0).toLong().toDouble())) { + for (i in 0..8) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + val percent = stack.count.toFloat() / stack.maxCount.toFloat() * 100.0f + + if (percent < percentage.value && replenishItem(i)) { + timer.reset() + break + } + } + } + } + + private fun replenishItem(slot: Int): Boolean { + if (!hotbarCache.containsKey(slot)) { + return false + } + + val itemStack = hotbarCache[slot] + var s = -1 + var count = 0 + + for (i in 9..35) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + + if (stack.isEmpty) { + continue + } + + if (InventoryUtil.getStackName(stack) != InventoryUtil.getStackName(itemStack!!)) { + continue + } + + if (itemStack.item is BlockItem && stack.item is BlockItem && (stack.item as BlockItem).block == (itemStack.item as BlockItem).block) { + s = i + count = stack.count + break + } + + if (itemStack.item == stack.item) { + s = i + count = stack.count + break + } + } + + if (s == -1) { + return false + } + + val placeBack = count + itemStack!!.count > itemStack.maxCount + val syncId: Int = mc.player!!.currentScreenHandler.syncId + + mc.interactionManager!!.clickSlot(syncId, s, 0, SlotActionType.PICKUP, mc.player) + mc.interactionManager!!.clickSlot(syncId, InventoryUtil.normalize(slot), 0, SlotActionType.PICKUP, mc.player) + + if (placeBack) { + mc.interactionManager!!.clickSlot(syncId, s, 0, SlotActionType.PICKUP, mc.player) + } + + return true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/RotationLock.kt b/src/main/kotlin/com/paragon/client/modules/player/RotationLock.kt new file mode 100644 index 0000000..52f7086 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/RotationLock.kt @@ -0,0 +1,39 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener + +/** + * @author aesthetical, finnish kid + * @since 02/22/23 + */ +object RotationLock : Module("Rotation Lock", "Locks your rotations", Category.PLAYER) { + + private var yaw = 0f + private var pitch = 0f + + override fun enable() { + if (nullCheck()) { + return + } + + yaw = mc.player!!.yaw + pitch = mc.player!!.pitch + } + + @EventListener + fun onTick(event: TickEvent?) { + if (nullCheck()) { + return + } + + mc.player!!.setHeadYaw(yaw) + mc.player!!.setBodyYaw(yaw) + mc.player!!.yaw = yaw + mc.player!!.pitch = pitch + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/player/Stealer.kt b/src/main/kotlin/com/paragon/client/modules/player/Stealer.kt new file mode 100644 index 0000000..e955c06 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/player/Stealer.kt @@ -0,0 +1,45 @@ +package com.paragon.client.modules.player + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.Timer +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener +import net.minecraft.screen.GenericContainerScreenHandler +import net.minecraft.screen.slot.SlotActionType + +/** + * @author aesthetical + * @since 02/22/23 + */ +object Stealer : Module("Stealer", "Automatically steals from chests", Category.PLAYER) { + private val delay by int("Delay", 50, 1, 0..1000, "How long to wait before stealing the next item") + private val autoClose by bool("Auto Close", true, "If to automatically close the chest after stealing everything") + + private val timer = Timer() + + override val info = { delay.toString() } + + @EventListener + fun onTick(event: TickEvent) { + if (mc.player!!.currentScreenHandler is GenericContainerScreenHandler) { + val handler = mc.player!!.currentScreenHandler as GenericContainerScreenHandler + + if (timer.elapsed(delay.toDouble())) { + for (i in 0..(handler.rows * 9)) { + val stack = handler.inventory.getStack(i) + if (!stack.isEmpty) { + mc.interactionManager!!.clickSlot(handler.syncId, i, 0, SlotActionType.QUICK_MOVE, mc.player) + timer.reset() + return + } + } + + if (autoClose) { + mc.player!!.closeHandledScreen() + } + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/ChinaHat.kt b/src/main/kotlin/com/paragon/client/modules/visual/ChinaHat.kt new file mode 100644 index 0000000..a5788bd --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/ChinaHat.kt @@ -0,0 +1,35 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.calculations.MathsUtil +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.client.option.Perspective +import net.minecraft.util.math.Vec3d + +/** + * @author surge + * @since 06/03/2023 + */ +object ChinaHat : Module("China Hat", "-1000 social credit", Category.VISUAL) { + + private val offset by double("Offset", -0.25, 0.01, -2.0..0.0, "The Y offset of the outside edge") + private val alpha by int("Alpha", 150, 1, 0..255, "The alpha of the fill") + + @EventListener + fun onGameRender(event: GameRenderEvent) { + mc.world!!.players.forEach { + if (it != mc.player || mc.options.perspective != Perspective.FIRST_PERSON) { + val pos = MathsUtil.interpolate(it, event.tickDelta) + + Renderer.polygon(event.matrices, pos.add(0.0, it.height.toDouble() + 0.25, 0.0), 0.65, getClientColour().integrateAlpha(alpha), Renderer.DrawMode.FILL, 120, offset) + Renderer.polygon(event.matrices, pos.add(0.0, it.height.toDouble() + 0.25, 0.0), 0.65, getClientColour(), Renderer.DrawMode.LINES, 120, offset) + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/ClickGUI.kt b/src/main/kotlin/com/paragon/client/modules/visual/ClickGUI.kt new file mode 100644 index 0000000..2e38304 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/ClickGUI.kt @@ -0,0 +1,48 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.client.ui.configuration.aesthetical.AestheticalUI +import com.paragon.client.ui.configuration.surge.SurgeUI +import com.paragon.util.mc +import com.paragon.util.nullCheck +import org.lwjgl.glfw.GLFW + +/** + * @author surge + * @since 11/02/2023 + */ +object ClickGUI : Module("Click GUI", "The main GUI of the client", Category.VISUAL) { + + private val mode by enum("Mode", Mode.SURGE, "The type of click gui") + + var surgeUi: SurgeUI? = null + var aestheticalUI: AestheticalUI? = null + + init { + key.code = GLFW.GLFW_KEY_RIGHT_SHIFT + visible = false + } + + override fun enable() { + if (nullCheck()) { + return + } + + mc.setScreen( + when (mode) { + Mode.SURGE -> surgeUi + Mode.AESTHETICAL -> aestheticalUI + else -> null + } + ) + + toggle() + } + + enum class Mode { + SURGE, AESTHETICAL + } + + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/ESP.kt b/src/main/kotlin/com/paragon/client/modules/visual/ESP.kt new file mode 100644 index 0000000..44c4907 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/ESP.kt @@ -0,0 +1,62 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.Entity +import net.minecraft.entity.mob.HostileEntity +import net.minecraft.entity.passive.PassiveEntity +import net.minecraft.entity.player.PlayerEntity + +/** + * @author surge + * @since 22/02/2023 + */ +object ESP : Module("ESP", "Highlights entities in the world", Category.VISUAL) { + + private val box by enum("Box", Box.BOTH, "How to draw the box") + private val passive by bool("Passive", true, "Highlight passive entities") + private val hostile by bool("Hostile", true, "Highlight hostile entities") + private val players by bool("Players", true, "Highlight players") + private val alpha by int("Alpha", 100, 1, 0..255, "The alpha of the fill") visibility { box == Box.FILL || box == Box.BOTH } + + @EventListener + fun onGameRender(event: GameRenderEvent) { + filtered().forEach { (entity, colour) -> + if (box == Box.FILL || box == Box.BOTH) { + Renderer.box(event.matrices, entity.boundingBox, colour.integrateAlpha(alpha), Renderer.DrawMode.FILL) + } + + if (box == Box.OUTLINE || box == Box.BOTH) { + Renderer.box(event.matrices, entity.boundingBox, colour, Renderer.DrawMode.LINES) + } + } + } + + private fun filtered(): Map { + val entities: MutableMap = HashMap() + + mc.world!!.entities.filter { it is PassiveEntity && passive || it is HostileEntity && hostile || it is PlayerEntity && players && it != mc.player }.forEach { + entities[it] = when (it) { + is PassiveEntity -> Colour(0, 255, 0, 255) + is HostileEntity -> Colour(255, 0, 0, 255) + is PlayerEntity -> getClientColour().integrateAlpha(255) + else -> Colour(0, 0, 0, 0) + } + } + + return entities + } + + private enum class Box { + FILL, + OUTLINE, + BOTH + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/FullBright.kt b/src/main/kotlin/com/paragon/client/modules/visual/FullBright.kt new file mode 100644 index 0000000..221636b --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/FullBright.kt @@ -0,0 +1,59 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.render.GammaModifyEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.effect.StatusEffectInstance +import net.minecraft.entity.effect.StatusEffects + +/** + * @author KassuK, aesthetical + * @since 02/17/23 + */ +object FullBright : Module("Full Bright", "Makes the game brighter", Category.VISUAL) { + + private var gavePotion = false + + private val mode by enum("Mode", Mode.GAMMA, "How to brighten up your game") + + override val info = { mode.name } + + override fun disable() { + if (!nullCheck() && gavePotion) { + mc.player!!.removeStatusEffect(StatusEffects.NIGHT_VISION) + } + + gavePotion = false + } + + @EventListener + fun onTick(event: TickEvent?) { + if (mode == Mode.EFFECT) { + if (mc.player!!.hasStatusEffect(StatusEffects.NIGHT_VISION)) { + return + } + + gavePotion = true + + mc.player!!.addStatusEffect(StatusEffectInstance(StatusEffects.NIGHT_VISION, 400, 1)) + } + } + + @EventListener + fun onGammaModify(event: GammaModifyEvent) { + if (mode == Mode.GAMMA) { + event.gamma = 100.0f + event.isCancelled = true + } + } + + enum class Mode { + GAMMA, + EFFECT + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/HUD.kt b/src/main/kotlin/com/paragon/client/modules/visual/HUD.kt new file mode 100644 index 0000000..c0110d3 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/HUD.kt @@ -0,0 +1,108 @@ +package com.paragon.client.modules.visual + +import com.paragon.Paragon +import com.paragon.backend.event.events.render.RenderHUDEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.BuildConfig.BuildConfig +import com.paragon.util.formatCapitalised +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.rendering.ColorUtil +import com.paragon.util.rendering.NVGWrapper +import me.bush.eventbus.annotation.EventListener +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import net.minecraft.client.gui.screen.ChatScreen +import java.awt.Color + +/** + * @author aesthetical + * @since 02/17/23 + */ +object HUD : Module("HUD", "Renders an overlay", Category.VISUAL) { + + private val yAnimation = BoundedAnimation(0.0f, 30.0f, 200.0f, false, Easing.CUBIC_IN_OUT) + + init { + // auto-enable + if (!isEnabled) { + toggle() + } + + visible = false + } + + @EventListener + fun onRenderHUD(event: RenderHUDEvent) { + NVGWrapper.scope { r: NVGWrapper -> + r.text("P", 4.0f, 4.0f, getClientColour(), size = 17f, shadow = true) + r.text( + "aragon " + BuildConfig.BRANCH + "/" + BuildConfig.HASH, + 4.0f + r.textWidth("P"), + 4.0f, + Color.white, + size = 17f, + shadow = true + ) + + val enabled: List = Paragon.moduleManager.modules + .filter { module: Module -> module.isActive() && module.visible } + .sortedBy { + r.textWidth(it.name + if (it.info() == null) "" else " " + it.info()!!.replace("_", " ")) + } + .reversed() + + if (enabled.isNotEmpty()) { + var y = 4.0f + if (mc.player!!.activeStatusEffects.isNotEmpty()) { + y += 52.0f + } + + for (i in enabled.indices) { + val module = enabled[i] + val c = module.name + var textWidth = r.textWidth(c, size = 17.0f) + + if (module.info() != null) { + textWidth += r.textWidth(" " + module.info()!!.replace("_", " ").formatCapitalised(), size = 17.0f) + } + + module.animation.maximum = textWidth + + val x = (event.width - textWidth * module.animation.animationFactor - 8.0f).toFloat() + val rectWidth = textWidth + 8.0f + val color = ColorUtil.gradientRainbow(getClientColour(), 0.72f, i * 200 + 150) + + r.quad(x - 4.0f, y, rectWidth, (22.0f * module.animation.animationFactor).toFloat(), Color(0, 0, 0, 145)) + r.quad(x + rectWidth - 6.0f, y, 2.0f, 22.0f, color) + r.text(c, x, y + 3, color, size = 17f, shadow = true) + + if (module.info() != null) { + r.text( + module.info()!!.replace("_", " ").formatCapitalised(), + x + 2.0f + r.textWidth(module.name + " ", size = 17.0f), + y + 3, + Color.gray, + size = 17f, + shadow = true + ) + } + + y += (22.0f * module.animation.animationFactor).toFloat() + } + } + + yAnimation.state = mc.currentScreen is ChatScreen + var y = event.height - 20.0f - (yAnimation.animationFactor.toFloat() * yAnimation.maximum) + + r.text("XYZ: ", 1.5f, y, Color.GRAY, shadow = true) + r.text(String.format("%.1f", mc.player!!.x) + + " " + String.format("%.1f", mc.player!!.y) + " " + + String.format("%.1f", mc.player!!.z), + 2.0f + r.textWidth("XYZ: "), y, Color.WHITE, shadow = true) + + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/HoleESP.kt b/src/main/kotlin/com/paragon/client/modules/visual/HoleESP.kt new file mode 100644 index 0000000..83ea904 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/HoleESP.kt @@ -0,0 +1,128 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.mc.TickEvent +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.util.backgroundThread +import com.paragon.util.box +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.block.Blocks +import net.minecraft.util.math.BlockPos +import java.util.concurrent.ConcurrentHashMap +import kotlin.math.sqrt + +/** + * @author surge + * @since 22/02/2023 + */ +object HoleESP : Module("Hole ESP", "Highlights safe holes", Category.VISUAL) { + + private val range by int("Range", 5, 1, 1..10, "The range to search for holes in") + private val box by enum("Box", Box.BOTH, "How to draw the box") + private val obsidian by bool("Passive", true, "Highlight holes surrounded by obsidian") + private val mixed by bool("Hostile", true, "Highlight holes surrounded by obsidian or bedrock") + private val bedrock by bool("Players", true, "Highlight holes surrounded by bedrock") + private val alpha by int("Alpha", 100, 1, 0..255, "The alpha of the fill") visibility { box == Box.FILL || box == Box.BOTH } + private val height by double("Height", 0.2, 0.01, 0.0..1.0, "The height of the box") + private val dynamicHeight by bool("DynamicHeight", false, "Shrinks the boxes the closer they are to you") + private val reverseDynamic by bool("ReverseDynamic", false, "Expands the boxes the closer they are to you") visibility { dynamicHeight } + + private val holes = ConcurrentHashMap() + + @EventListener + fun onTick(event: TickEvent) { + backgroundThread { + for (x in -range..range) { + for (y in -range..range) { + for (z in -range..range) { + val pos = BlockPos(mc.player!!.blockPos.x + x, mc.player!!.blockPos.y + y,mc.player!!.blockPos.z + z) + + val type = getType(pos) + + if (type != null) { + holes[pos] = type + } + } + } + } + + // hopefully prevent the flickering thing?? + + val removeBuffer = mutableListOf() + + holes.forEach { (pos, type) -> + if (sqrt(pos.getSquaredDistance(mc.player!!.x, mc.player!!.y, mc.player!!.z)) > range || getType(pos) != type) { + removeBuffer.add(pos) + } + } + + removeBuffer.forEach { + holes.remove(it) + } + } + } + + @EventListener + fun onGameRender(event: GameRenderEvent) { + holes.forEach { (position, type) -> + var bb = position.box() + bb = bb.withMaxY(bb.minY + height) + + if (dynamicHeight) { + bb = if (reverseDynamic) { + bb.withMaxY(bb.minY + (height * (1 - (sqrt(position.getSquaredDistance(mc.player!!.x, mc.player!!.y, mc.player!!.z)) / range)))) + } else { + bb.withMaxY(bb.minY + (height * (sqrt(position.getSquaredDistance(mc.player!!.x, mc.player!!.y, mc.player!!.z)) / range))) + } + } + + if (box == Box.FILL || box == Box.BOTH) { + Renderer.box(event.matrices, bb, type.colour.integrateAlpha(alpha), Renderer.DrawMode.FILL) + } + + if (box == Box.OUTLINE || box == Box.BOTH) { + Renderer.box(event.matrices, bb, type.colour, Renderer.DrawMode.LINES) + } + } + } + + fun getType(position: BlockPos): Type? { + if (!mc.world!!.getBlockState(position).isReplaceable || mc.world!!.getBlockState(position.down()).isReplaceable) { + return null + } + + val surrounding = arrayListOf( + mc.world!!.getBlockState(position.north()), + mc.world!!.getBlockState(position.east()), + mc.world!!.getBlockState(position.south()), + mc.world!!.getBlockState(position.west()) + ) + + if (surrounding.all { it.block == Blocks.OBSIDIAN } && obsidian) { + return Type.OBSIDIAN + } else if (surrounding.all { it.block == Blocks.BEDROCK } && bedrock) { + return Type.BEDROCK + } else if (surrounding.all { it.block == Blocks.OBSIDIAN || it.block == Blocks.BEDROCK } && mixed) { + return Type.MIXED + } + + return null + } + + enum class Type(val colour: Colour) { + OBSIDIAN(Colour(255, 0, 0, 255)), + MIXED(Colour(255, 140, 0, 255)), + BEDROCK(Colour(0, 255, 0, 255)) + } + + private enum class Box { + FILL, + OUTLINE, + BOTH + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/Tags.kt b/src/main/kotlin/com/paragon/client/modules/visual/Tags.kt new file mode 100644 index 0000000..5aee77d --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/Tags.kt @@ -0,0 +1,193 @@ +package com.paragon.client.modules.visual + +import com.mojang.blaze3d.systems.RenderSystem +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.event.events.render.RenderNameplateEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.util.calculations.MathsUtil.interpolate +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.client.render.* +import net.minecraft.client.render.VertexFormat.DrawMode +import net.minecraft.client.render.model.json.ModelTransformation +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.ItemStack +import net.minecraft.util.Formatting +import net.minecraft.util.Hand +import net.minecraft.util.math.Vec3d +import org.lwjgl.opengl.GL11 +import java.lang.Double.max + +/** + * @author aesthetical + * @since 02/19/23 + */ +object Tags : Module("Tags", "Draws tags over players heads", Category.VISUAL) { + + private val scale = float("Scale", 0.25f, 0.05f, 0.1f..0.8f, "The scaling of tags based off distance") + + @EventListener + fun onGameRender(event: GameRenderEvent) { + if (mc.cameraEntity != null) { + for (entity in mc.world!!.players) { + if (entity == null || entity == mc.player || entity.isDead) { + continue + } + + val camera: Vec3d = mc.gameRenderer.camera.pos + val pos = interpolate(entity, event.tickDelta).subtract(camera) + Renderer.submit { render(event.matrices, entity, pos) } + } + } + } + + @EventListener + fun onRenderNameplate(event: RenderNameplateEvent) { + if (event.entity != null && !event.entity.isDead) { + event.isCancelled = true + } + } + + private fun render(matrices: MatrixStack, player: PlayerEntity, pos: Vec3d) { + matrices.push() + + RenderSystem.enablePolygonOffset() + RenderSystem.polygonOffset(1.0f, -1500000.0f) + RenderSystem.disableDepthTest() + + matrices.translate(pos.x, pos.y + player.height + 0.12, pos.z) + matrices.multiply(mc.entityRenderDispatcher.rotation) + + val distance = mc.cameraEntity!!.distanceTo(player).toDouble() + val scaling = scale.value * max(distance, 4.0).toFloat() / 50.0f + + matrices.scale(-scaling, -scaling, scaling) + + val content = getPlayerInfo(player) + val width: Int = mc.textRenderer.getWidth(content) / 2 + + rectangle( + matrices, + (-width - 2).toDouble(), + -(mc.textRenderer.fontHeight + 1).toDouble(), + width * 2.0 + 4.0, + mc.textRenderer.fontHeight + 3.0, + Colour(0, 0, 0, 120) + ) + + mc.textRenderer.draw(matrices, content, -width.toFloat(), -(mc.textRenderer.fontHeight - 1).toFloat(), -1) + + var itemRenderX = -24 / 2 * player.inventory.armor.size + 16 + + if (!player.getStackInHand(Hand.OFF_HAND).isEmpty) { + renderItem(matrices, player.getStackInHand(Hand.OFF_HAND), itemRenderX) + itemRenderX += 12 + } + + for (i in 3 downTo 0) { + val stack = player.inventory.getArmorStack(i) + + if (!stack.isEmpty) { + renderItem(matrices, stack, itemRenderX) + itemRenderX += 12 + } + } + + if (!player.getStackInHand(Hand.MAIN_HAND).isEmpty) { + renderItem(matrices, player.getStackInHand(Hand.MAIN_HAND), itemRenderX) + } + + RenderSystem.enableDepthTest() + RenderSystem.polygonOffset(1.0f, 1500000.0f) + RenderSystem.disablePolygonOffset() + + matrices.pop() + } + + private fun renderItem(matrices: MatrixStack, stack: ItemStack, x: Int) { + matrices.push() + matrices.translate(x.toFloat(), -18f, 0f) + matrices.scale(-12f, -12f, 0f) + + RenderSystem.enableDepthTest() + RenderSystem.enableBlend() + DiffuseLighting.disableGuiDepthLighting() + + val z: Float = mc.itemRenderer.zOffset + mc.itemRenderer.zOffset = -150f + mc.itemRenderer.renderItem( + stack, + ModelTransformation.Mode.GUI, + 0xF000F0, + OverlayTexture.DEFAULT_UV, + matrices, + mc.bufferBuilders.entityVertexConsumers, + 0 + ) + + mc.bufferBuilders.entityVertexConsumers.draw() + mc.itemRenderer.zOffset = z + + DiffuseLighting.enableGuiDepthLighting() + RenderSystem.disableBlend() + RenderSystem.disableDepthTest() + + matrices.pop() + } + + private fun rectangle(matrices: MatrixStack, x: Double, y: Double, w: Double, h: Double, colour: Colour) { + val matrix = matrices.peek().positionMatrix + val builder = Tessellator.getInstance().buffer + + GL11.glDepthFunc(GL11.GL_ALWAYS) + GL11.glEnable(GL11.GL_BLEND) + + RenderSystem.enableBlend() + RenderSystem.blendFuncSeparate(770, 771, 1, 0) + RenderSystem.setShader { GameRenderer.getPositionColorProgram() } + + builder.begin(DrawMode.QUADS, VertexFormats.POSITION_COLOR) + + builder.vertex(matrix, x.toFloat(), y.toFloat(), 0.0f).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, x.toFloat(), (y + h).toFloat(), 0.0f).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, (x + w).toFloat(), (y + h).toFloat(), 0.0f).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, (x + w).toFloat(), y.toFloat(), 0.0f).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + + BufferRenderer.drawWithGlobalProgram(builder.end()) + RenderSystem.disableBlend() + + GL11.glDisable(GL11.GL_BLEND) + GL11.glDepthFunc(GL11.GL_LEQUAL) + } + + private fun getPlayerInfo(entity: PlayerEntity): String { + val builder = StringBuilder() + builder.append(entity.gameProfile.name) + builder.append(" ") + + val playerHealth = entity.health + entity.absorptionAmount + var formatting = Formatting.DARK_RED + + if (playerHealth > 18.0f) { + formatting = Formatting.GREEN + } else if (playerHealth > 16.0f) { + formatting = Formatting.DARK_GREEN + } else if (playerHealth > 12.0f) { + formatting = Formatting.YELLOW + } else if (playerHealth > 8.0f) { + formatting = Formatting.GOLD + } else if (playerHealth > 5.0f) { + formatting = Formatting.RED + } + + builder.append(formatting) + builder.append(String.format("%.1f", entity.health + entity.absorptionAmount)) + + return builder.toString() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/Toasts.kt b/src/main/kotlin/com/paragon/client/modules/visual/Toasts.kt new file mode 100644 index 0000000..58a44c9 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/Toasts.kt @@ -0,0 +1,20 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module + +/** + * @author aesthetical + * @since 02/20/23 + */ +object Toasts : Module("Toasts", "Configures toasts", Category.VISUAL) { + + init { + visible = false + setState(true) + } + + val toggle by bool("Toggle", true, description = "If to show toasts for toggled modules") + val totems by bool("Totems", true, description = "If to show toasts for totem pops") + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/Tracers.kt b/src/main/kotlin/com/paragon/client/modules/visual/Tracers.kt new file mode 100644 index 0000000..9b447aa --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/Tracers.kt @@ -0,0 +1,59 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.util.calculations.MathsUtil +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.Entity +import net.minecraft.entity.mob.HostileEntity +import net.minecraft.entity.passive.PassiveEntity +import net.minecraft.entity.player.PlayerEntity + +/** + * @author surge, aesthetical + * @since 12/02/2023 + */ +object Tracers : Module("Tracers", "Draws lines to entities", Category.VISUAL) { + + private val passive by bool("Passive", true, "Draw lines to passive entities") + private val hostile by bool("Hostile", true, "Draw lines to hostile entities") + private val players by bool("Players", true, "Draw lines to players") + private val lineWidth by float("Line Width", 1.5f, 0.1f, 0.1f..5.0f, "The width of the tracer line") + + private val stem by bool("Stem", false, "If to draw a stem on the entity") + private val stemFade by bool("Stem Fade", true, "Fade the stem at the top") visibility { stem } + + private val alpha by int("Alpha", 50, 1, 0..255) + + @EventListener + fun onGameRender(event: GameRenderEvent) { + filtered().forEach { (entity: Entity, colour: Colour?) -> + val entityPosition = MathsUtil.interpolate(entity, event.tickDelta) + + Renderer + .submit(Renderer.line(event.matrices, Renderer.crosshair(), entityPosition, lineWidth, colour)) + .optional(stem, Renderer.line(event.matrices, entityPosition, entityPosition.add(0.0, entity.height.toDouble(), 0.0), lineWidth, colour, secondary = colour.integrateAlpha(if (stemFade) 0 else 255))) + } + } + + private fun filtered(): Map { + val entities: MutableMap = HashMap() + + mc.world!!.entities.filter { it is PassiveEntity && passive || it is HostileEntity && hostile || it is PlayerEntity && players && it != mc.player }.forEach { + entities[it] = when (it) { + is PassiveEntity -> Colour(0, 255, 0, alpha) + is HostileEntity -> Colour(255, 0, 0, alpha) + is PlayerEntity -> getClientColour().integrateAlpha(alpha) + else -> Colour(0, 0, 0, 0) + } + } + + return entities + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/Trajectories.kt b/src/main/kotlin/com/paragon/client/modules/visual/Trajectories.kt new file mode 100644 index 0000000..38c7336 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/Trajectories.kt @@ -0,0 +1,161 @@ +package com.paragon.client.modules.visual + +import com.paragon.Paragon +import com.paragon.backend.event.events.render.GameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Colour +import com.paragon.util.calculations.MathsUtil.interpolate +import com.paragon.util.component1 +import com.paragon.util.component2 +import com.paragon.util.component3 +import com.paragon.util.mc +import com.paragon.util.rendering.Renderer +import me.bush.eventbus.annotation.EventListener +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.projectile.ProjectileUtil +import net.minecraft.item.* +import net.minecraft.util.Hand +import net.minecraft.util.hit.HitResult +import net.minecraft.util.math.Box +import net.minecraft.util.math.MathHelper +import net.minecraft.util.math.Vec3d +import net.minecraft.world.RaycastContext + + +/** + * @author aesthetical + * @since 02/25/23 + */ +object Trajectories : Module("Trajectories", "Shows the landing path of a throwable", Category.VISUAL) { + + @EventListener + fun onGameRender(event: GameRenderEvent) { + if (mc.player == null) { + return + } + + val landingPath = calcPath(mc.player!!, event.tickDelta) + if (landingPath != null) { + Renderer.box(event.matrices, Box(landingPath.final, landingPath.final.add(1.0, 1.0, 1.0)), Colour(255, 255, 255, 100), Renderer.DrawMode.FILL) + } + } + + private fun calcPath(e: PlayerEntity, tickDelta: Float): LandingPath? { + if (e == null || e.isDead) { + return null + } + + val stack = if (mc.player!!.activeHand == Hand.OFF_HAND) { + mc.player!!.getStackInHand(Hand.OFF_HAND) + } else Paragon.inventoryManager.serverStack + + if ((stack.item !is BowItem && stack.item !is PotionItem && stack.item !is TridentItem && stack.item !is EnderPearlItem && stack.item !is SnowballItem && stack.item !is EggItem)) { + return null + } + + val yaw = Paragon.rotationManager.server[0] + val pitch = Paragon.rotationManager.server[1] + + var (x, y, z) = interpolate(e, tickDelta) + + var velocity = 0.0f + var inaccuracy = 0.0f + + when (stack.item) { + + is EnderPearlItem, is EggItem, is SnowballItem -> velocity = 1.5f + is ExperienceBottleItem -> { + velocity = 0.7f + inaccuracy = -20.0f + } + is PotionItem -> velocity = 0.5f + is BowItem -> { + velocity = BowItem.getPullProgress(stack.maxUseTime - e.itemUseTimeLeft) * 1.5f + inaccuracy = 1.0f + } + } + + var motionX = (-MathHelper.sin(yaw / 180.0f * Math.PI.toFloat()) * MathHelper.cos(pitch / 180.0f * Math.PI.toFloat()) * 0.4f).toDouble() + var motionY = (-MathHelper.sin((pitch + inaccuracy) / 180.0f * Math.PI.toFloat()) * 0.4f).toDouble() + var motionZ = (MathHelper.cos(yaw / 180.0f * Math.PI.toFloat()) * MathHelper.cos(pitch / 180.0f * Math.PI.toFloat()) * 0.4f).toDouble() + + val distance: Double = MathHelper.square(motionX * motionX + motionY * motionY + motionZ * motionZ) + + motionX /= distance + motionY /= distance + motionZ /= distance + + motionX += 0.007499999832361937 * inaccuracy + motionY += 0.007499999832361937 * inaccuracy + motionZ += 0.007499999832361937 * inaccuracy + + motionX *= velocity.toDouble() + motionY *= velocity.toDouble() + motionZ *= velocity.toDouble() + + val size = if (stack.item is BowItem) 0.5 else 0.25 + val path = mutableListOf() + + var finalResult: HitResult? = null + + while (y > 0.0) { + val pos = Vec3d(x, y, z) + val motion = Vec3d(x + motionX, y + motionY, z + motionZ) + + // TODO: raycastBlocks or find a better way (this is kinda shit) + val result = mc.world!!.raycast(RaycastContext(pos, motion, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, e)) + if (result != null && result.type.equals(HitResult.Type.BLOCK)) { + finalResult = result + break + } + + val bb = Box( + x - size, y - size, z - size, + x + size, y + size, z + size) + .stretch(motionX, motionY, motionZ) + .expand(1.0, 1.0, 1.0) + + val entitiesColliding = mc.world!!.getOtherEntities(e, bb) + if (entitiesColliding.isNotEmpty()) { + for (entity in entitiesColliding) { + if (!entity.isCollidable || entity.equals(e)) { + continue + } + + val box = entity.boundingBox.expand(0.3) + val r = ProjectileUtil.getEntityCollision(mc.world, entity, pos, motion, box) { it != null && !it.isSpectator && !it.equals(e) } + if (r != null) { + println("collided with $entity") + finalResult = r + break + } + } + } + + x += motionX + y += motionY + z += motionZ + + motionX *= 0.99 + motionY *= 0.99 + motionZ *= 0.99 + + motionY -= if (stack.item is ExperienceBottleItem) { + 0.07 + } else if (stack.item is BowItem || stack.item is PotionItem) { + 0.6 + } else { + 0.03 + } + + println("pathed +(${path.size})") + path.add(Vec3d(x, y, z)) + } + + println("final: $x, $y, $z with ${path.size} paths. final result class: ${if (finalResult == null) "null" else finalResult.javaClass.simpleName}") + return LandingPath(Vec3d(x, y, z), path, finalResult) + } + + data class LandingPath(val final: Vec3d, val path: List, val result: HitResult?) +} diff --git a/src/main/kotlin/com/paragon/client/modules/visual/UnfocusedCPU.kt b/src/main/kotlin/com/paragon/client/modules/visual/UnfocusedCPU.kt new file mode 100644 index 0000000..8a2da47 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/UnfocusedCPU.kt @@ -0,0 +1,33 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.FPSLimitEvent +import com.paragon.backend.event.events.render.PreGameRenderEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import me.bush.eventbus.annotation.EventListener + +/** + * @author surge + * @since 24/02/2023 + */ +object UnfocusedCPU : Module("Unfocused CPU", "Stops world rendering when the window isn't focused", Category.VISUAL) { + + private var limit by int("Limit", 5, 1, 1..60, "The FPS limit to apply when the window isn't focused") + + @EventListener + fun onPreGameRender(event: PreGameRenderEvent) { + if (!mc.isWindowFocused) { + event.cancel() + } + } + + @EventListener + fun onFPSLimit(event: FPSLimitEvent) { + if (!mc.isWindowFocused) { + event.cancel() + event.limit = limit + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/ViewClip.kt b/src/main/kotlin/com/paragon/client/modules/visual/ViewClip.kt new file mode 100644 index 0000000..867304a --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/ViewClip.kt @@ -0,0 +1,22 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.ClipToSpaceEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import me.bush.eventbus.annotation.EventListener + +/** + * @author aesthetical + * @since 02/19/23 + */ +object ViewClip : Module("View Clip", "Clips your camera out of bounds", Category.VISUAL) { + + private val distance by double("Distance", 3.0, 0.5, 1.0..50.0, "The camera clip distance") + + @EventListener + fun onClipToSpace(event: ClipToSpaceEvent) { + event.distance = distance + event.isCancelled = true + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/modules/visual/Xray.kt b/src/main/kotlin/com/paragon/client/modules/visual/Xray.kt new file mode 100644 index 0000000..3d1269e --- /dev/null +++ b/src/main/kotlin/com/paragon/client/modules/visual/Xray.kt @@ -0,0 +1,77 @@ +package com.paragon.client.modules.visual + +import com.paragon.backend.event.events.render.BlockAmbientLightLevelEvent +import com.paragon.backend.event.events.render.DrawSideOfBlockEvent +import com.paragon.backend.event.events.render.GammaModifyEvent +import com.paragon.backend.module.Category +import com.paragon.backend.module.Module +import com.paragon.util.mc +import com.paragon.util.nullCheck +import me.bush.eventbus.annotation.EventListener +import net.minecraft.block.Block +import net.minecraft.block.Blocks + +/** + * @author aesthetical + * @since 02/20/23 + */ +object Xray : Module("Xray", "Lets you see ores through blocks", Category.VISUAL) { + + @JvmStatic + val blocks = mutableListOf() + + init { + // TODO: Make this load from a config + + blocks += Blocks.COAL_ORE + blocks += Blocks.COPPER_ORE + blocks += Blocks.IRON_ORE + blocks += Blocks.LAPIS_ORE + blocks += Blocks.GOLD_ORE + blocks += Blocks.EMERALD_ORE + blocks += Blocks.DIAMOND_ORE + blocks += Blocks.REDSTONE_ORE + blocks += Blocks.NETHER_QUARTZ_ORE + blocks += Blocks.ANCIENT_DEBRIS + blocks += Blocks.DEEPSLATE_COAL_ORE + blocks += Blocks.DEEPSLATE_COPPER_ORE + blocks += Blocks.DEEPSLATE_IRON_ORE + blocks += Blocks.DEEPSLATE_LAPIS_ORE + blocks += Blocks.DEEPSLATE_GOLD_ORE + blocks += Blocks.DEEPSLATE_EMERALD_ORE + blocks += Blocks.DEEPSLATE_DIAMOND_ORE + blocks += Blocks.DEEPSLATE_REDSTONE_ORE + } + + override fun enable() { + super.enable() + if (!nullCheck()) { + mc.worldRenderer.reload() + } + } + + override fun disable() { + super.disable() + if (!nullCheck()) { + mc.worldRenderer.reload() + } + } + + @EventListener + fun onDrawSideOfBlock(event: DrawSideOfBlockEvent) { + event.drawSide = blocks.contains(event.block) + event.isCancelled = true + } + + @EventListener + fun onBlockAmbientLightLevel(event: BlockAmbientLightLevelEvent) { + event.lightLevel = 100.0f + event.isCancelled = true + } + + @EventListener + fun onGammaModify(event: GammaModifyEvent) { + event.gamma = 100.0f + event.isCancelled = true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/toasts/Toast.kt b/src/main/kotlin/com/paragon/client/toasts/Toast.kt new file mode 100644 index 0000000..f48fcdf --- /dev/null +++ b/src/main/kotlin/com/paragon/client/toasts/Toast.kt @@ -0,0 +1,57 @@ +package com.paragon.client.toasts + +import com.paragon.backend.setting.Colour +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.Animation +import me.surge.animation.Easing +import java.awt.Color + +/** + * @author aesthetical + * @since 02/19/23 + */ +class Toast(val toastType: ToastType, var deployer: String, var content: String, val lifespan: Long) { + + var endTime: Long = System.currentTimeMillis() + lifespan + var isDead = false + private set + + val animation = Animation(200f, true, Easing.CUBIC_IN_OUT) + + fun updateAndRender(nvg: NVGWrapper, posY: Float, screenWidth: Float) { + if (System.currentTimeMillis() > endTime) { + animation.state = false + + if (animation.animationFactor <= 0.0) { + isDead = true + } + } else { + animation.state = true + } + + val width: Float = nvg.textWidth(content, size = 14.0f) + + val x: Float = screenWidth - 8.0f - (width * animation.animationFactor).toFloat() + + nvg.roundedQuad(x - 4.0f, posY, width + 8.0f, 50.0f, 4.5f, Colour(23, 23, 23, 185)) + + val percent = (endTime - System.currentTimeMillis()).toDouble() / lifespan.toDouble() + val barWidth = ((width + 8.0f) * percent).toFloat() + + val colour = when (toastType) { + ToastType.ERROR -> Colour(245, 66, 66, 255) + ToastType.SUCCESS -> Colour(66, 245, 117, 255) + ToastType.WARNING -> Colour(245, 126, 66, 255) + else -> getClientColour() + } + + nvg.scissor(x - 4.0f, posY + 46f, barWidth, 4f) { + nvg.roundedQuad(x - 4.0f, posY, barWidth.coerceAtLeast(9f), 50.0f, 4.5f, colour) + } + + nvg.text(deployer, x, posY + 9.0F, Color.white, size = 16.0f, shadow = false) + nvg.text(content, x, posY + 28.0f, Color.white, size = 14.0f, shadow = false) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/toasts/ToastType.kt b/src/main/kotlin/com/paragon/client/toasts/ToastType.kt new file mode 100644 index 0000000..c96a279 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/toasts/ToastType.kt @@ -0,0 +1,12 @@ +package com.paragon.client.toasts + +/** + * @author aesthetical + * @since 02/19/23 + */ +enum class ToastType { + INFO, + SUCCESS, + WARNING, + ERROR +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/AestheticalUI.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/AestheticalUI.kt new file mode 100644 index 0000000..2944734 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/AestheticalUI.kt @@ -0,0 +1,77 @@ +package com.paragon.client.ui.configuration.aesthetical + +import com.paragon.Paragon +import com.paragon.backend.module.Category +import com.paragon.client.ui.configuration.aesthetical.elements.ModuleCategoryPanel +import com.paragon.util.mc +import com.paragon.util.rendering.NVGWrapper +import net.minecraft.client.gui.screen.Screen +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.text.Text + +/** + * @author aesthetical + * @since 02/23/23 + */ +class AestheticalUI : Screen(Text.of("ballsack")) { + + private val panels = mutableListOf() + + init { + var x = 4.0f + for (category in Category.values()) { + val moduleList = Paragon.moduleManager.getModules { it.category == category } + if (moduleList.isNotEmpty()) { + val panel = ModuleCategoryPanel(category.displayName, moduleList) + panel.x = x + panel.y = 14.0f + panel.width = 120.0f + panel.height = 16.5f + + x += (panel.width * 2) + 6.0f + panels += panel + } + } + } + + override fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + super.render(matrices, mouseX, mouseY, delta) + + NVGWrapper.scope { nvg -> + //nvg.quad(0f, 0f, width.toFloat() * 2, height.toFloat() * 2, Color(0, 0, 0, 150)) + + panels.forEach { + it.render( + nvg, + mc.mouse.x.toInt(), + mc.mouse.y.toInt(), + 0f + ) + } + } + } + + override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { + panels.forEach { it.mouseClick(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button) } + return super.mouseClicked(mouseX, mouseY, button) + } + + override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean { + panels.forEach { it.mouseRelease(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button) } + return super.mouseReleased(mouseX, mouseY, button) + } + + override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean { + panels.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + return super.keyPressed(keyCode, scanCode, modifiers) + } + + override fun shouldPause(): Boolean { + return false + } + + override fun close() { + Paragon.moduleManager.save("current") + super.close() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleCategoryPanel.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleCategoryPanel.kt new file mode 100644 index 0000000..ddfb040 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleCategoryPanel.kt @@ -0,0 +1,68 @@ +package com.paragon.client.ui.configuration.aesthetical.elements + +import com.paragon.backend.module.Module +import com.paragon.util.rendering.NVGWrapper +import java.awt.Color + +/** + * @author aesthetical + * @since 02/23/23 + */ +class ModuleCategoryPanel(private val categoryName: String, modules: List) : SettingElement() { + + private val children = mutableListOf() + + init { + modules.forEach { children.add(ModuleElement(it)) } + } + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + + nvg.quad(x, y, width * 2, getTotalHeight() * 2, PANEL_COLOR) + nvg.text(categoryName, x + 4.0f, y + (((height * 2) / 2.0f) - 16.0f / 2.0f), Color.WHITE, "axiforma", shadow = true) + + var posY = y + (height * 2) + (PADDING * 2) + for (child in children) { + if (!child.visible()) { + continue + } + + child.x = x + (PADDING * 2) + child.width = (width * 2) - (PADDING * 4.0f) + child.y = posY + child.height = 13.5f + + child.render(nvg, mouseX, mouseY, mouseDelta) + posY += child.getTotalHeight() * 2 + } + + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + children.forEach { it.mouseClick(mouseX, mouseY, button) } + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + children.forEach { it.mouseRelease(mouseX, mouseY, button) } + return super.mouseRelease(mouseX, mouseY, button) + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + children.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + super.keyTyped(keyCode, scanCode, modifiers) + } + + override fun getTotalHeight(): Float { + var height = height + PADDING + for (component in children) { + height += component.getTotalHeight() + } + return (height + PADDING) + } + + companion object { + private val PANEL_COLOR = Color(30, 30, 30) + private const val PADDING = 1.0f + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleElement.kt new file mode 100644 index 0000000..60f1d26 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/ModuleElement.kt @@ -0,0 +1,133 @@ +package com.paragon.client.ui.configuration.aesthetical.elements + +import com.paragon.backend.bind.Bind +import com.paragon.backend.module.Module +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.aesthetical.elements.setting.BindSettingElement +import com.paragon.client.ui.configuration.aesthetical.elements.setting.BooleanSettingElement +import com.paragon.client.ui.configuration.aesthetical.elements.setting.EnumSettingElement +import com.paragon.client.ui.configuration.aesthetical.elements.setting.NumberSettingElement +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_1 +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2 +import java.awt.Color + +/** + * @author aesthetical + * @since 02/23/23 + */ +class ModuleElement(private val module: Module) : SettingElement() { + + private val hoverAnimation = BoundedAnimation(0.0f, 2.0f, 20.0f, false, Easing.LINEAR) + private val openAnimation = BoundedAnimation(0.0f, 2.0f, 200.0f, false, Easing.LINEAR) + + private val children = mutableListOf() + private var opened = false + + init { + module.settingMap.forEach { (_, v) -> + when (v.value) { + is Bind -> children.add(BindSettingElement(v as Setting)) + is Boolean -> children.add(BooleanSettingElement(v as Setting)) + is Enum<*> -> children.add(EnumSettingElement(v as Setting>)) + is Number -> children.add(NumberSettingElement(v as Setting)) + } + } + } + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + hoverAnimation.state = hovered(mouseX, mouseY, h = height * 2) + openAnimation.maximum = getComponentHeight() //- (if (openAnimation.animationValue > 0.0) height else 0.0f) + + nvg.quad(x, y, width, height * 2, if (module.isEnabled) getClientColour() else UNTOGGLED_BG) + nvg.text(module.name, x + 4.0f + (hoverAnimation.animationFactor.toFloat() * 2.0f), y + (((height * 2) / 2.0f) - 16.0f / 2.0f), Color.WHITE, "axiforma", shadow = true) + + openAnimation.state = opened + + if (openAnimation.animationValue > 0.0) { + var posY = y + (height * 2) + PADDING + + nvg.scissor(x, y, width, (getTotalHeight()) * 2) { + for (child in children) { + if (!child.visible()) { + continue + } + + child.x = x + PADDING + child.width = width - (PADDING * 2.0f) + child.y = posY + child.height = 13.5f + + child.render(nvg, mouseX, mouseY, mouseDelta) + + posY += child.getTotalHeight() * 2 + } + } + } + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY, h = height * 2)) { + if (button == GLFW_MOUSE_BUTTON_1) { + module.toggle() + } else if (button == GLFW_MOUSE_BUTTON_2) { + opened = !opened + } + } + + if (opened) { + children.forEach { it.mouseClick(mouseX, mouseY, button) } + } + + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (opened) { + children.forEach { it.mouseRelease(mouseX, mouseY, button) } + } + + return super.mouseRelease(mouseX, mouseY, button) + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + if (opened) { + children.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + } + + super.keyTyped(keyCode, scanCode, modifiers) + } + + override fun getTotalHeight(): Float { + return if (openAnimation.animationValue > 0.0) (getComponentHeight()) else height + } + + private fun getComponentHeight(): Float { + var h = height + + if (openAnimation.animationValue > 0.0) { + var additional = 0.0 + + for (component in children) { + if (component.visible()) { + additional += component.getTotalHeight() + } + } + + additional += 2.0f + + h += (additional * openAnimation.animationFactor).toFloat() + } + + return h + } + + companion object { + private val PADDING = 1.5f + private val UNTOGGLED_BG = Color(35, 35, 35) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/SettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/SettingElement.kt new file mode 100644 index 0000000..e395275 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/SettingElement.kt @@ -0,0 +1,11 @@ +package com.paragon.client.ui.configuration.aesthetical.elements + +import com.paragon.util.rendering.ui.Element + +abstract class SettingElement : Element() { + open val visible: () -> Boolean = { true } + + open fun getTotalHeight(): Float { + return height + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BindSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BindSettingElement.kt new file mode 100644 index 0000000..12051fb --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BindSettingElement.kt @@ -0,0 +1,71 @@ +package com.paragon.client.ui.configuration.aesthetical.elements.setting + +import com.paragon.backend.bind.Bind +import com.paragon.backend.bind.DeviceType +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.aesthetical.elements.SettingElement +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import org.lwjgl.glfw.GLFW.GLFW_KEY_UNKNOWN +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2 +import java.awt.Color + +/** + * @author aesthetical + * @since 02/23/23 + */ +class BindSettingElement(private val setting: Setting) : SettingElement() { + private val hoverAnimation = BoundedAnimation(0.0f, 2.0f, 20.0f, false, Easing.LINEAR) + private var listening = false + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + hoverAnimation.state = hovered(mouseX, mouseY, h = height * 2) + + nvg.quad(x, y, width, height * 2, SETTING_BG) + + val midPoint = (((height * 2) / 2.0f) - 16.0f / 2.0f) + nvg.text(if (listening) "Listening..." else setting.name, x + 4.0f + (hoverAnimation.animationFactor.toFloat() * 2.0f), y + midPoint, Color.WHITE, "axiforma", shadow = true) + if (!listening) { + val text = setting.value.toString() + nvg.text(text, x + width - (nvg.textWidth(text, face = "axiforma", size = 16.0f) + 4.0f), y + midPoint, Color.GRAY, "axiforma", shadow = true) + } + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + + if (listening) { + listening = false + setting.value.type = DeviceType.KEYBOARD + setting.value.code = keyCode + } + + super.keyTyped(keyCode, scanCode, modifiers) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY, h = height * 2) && button == 0) { + listening = !listening + return true // wait next mouse tick + } + + // this is so we can attack/place without binds interfering + // if someone really wants a mouse bind on 0 or 1, they can edit their binds file + if (listening) { + if (button > GLFW_MOUSE_BUTTON_2) { + listening = false + setting.value.type = DeviceType.MOUSE + setting.value.code = button + } else if (button == GLFW_MOUSE_BUTTON_2) { + listening = false + setting.value.code = GLFW_KEY_UNKNOWN + } + } + + return super.mouseClick(mouseX, mouseY, button) + } + + companion object { + private val SETTING_BG = Color(19, 19, 19) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BooleanSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BooleanSettingElement.kt new file mode 100644 index 0000000..5cae4de --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/BooleanSettingElement.kt @@ -0,0 +1,43 @@ +package com.paragon.client.ui.configuration.aesthetical.elements.setting + +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.aesthetical.elements.SettingElement +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_1 +import java.awt.Color + +/** + * @author aesthetical + * @since 02/23/23 + */ +class BooleanSettingElement(private val setting: Setting) : SettingElement() { + private val hoverAnimation = BoundedAnimation(0.0f, 2.0f, 20.0f, false, Easing.LINEAR) + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + hoverAnimation.state = hovered(mouseX, mouseY, h = height * 2) + + nvg.quad(x, y, width, height * 2, SETTING_BG) + + val midPoint = (((height * 2) / 2.0f) - 16.0f / 2.0f) + nvg.text(setting.name, x + 4.0f + (hoverAnimation.animationFactor.toFloat() * 2.0f), y + midPoint, Color.WHITE, "axiforma", shadow = true) + + val dimension = ((height - 4) * 2) + nvg.roundedQuad(x + width - (dimension + 4.0f), y + midPoint, dimension, dimension, 2.5f, if (setting.value) getClientColour() else SETTING_BG.brighter()) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + + if (hovered(mouseX, mouseY, h = height * 2) && button == GLFW_MOUSE_BUTTON_1) { + setting.setValue(!setting.value) + } + + return super.mouseClick(mouseX, mouseY, button) + } + + companion object { + private val SETTING_BG = Color(19, 19, 19) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/EnumSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/EnumSettingElement.kt new file mode 100644 index 0000000..4330d11 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/EnumSettingElement.kt @@ -0,0 +1,47 @@ +package com.paragon.client.ui.configuration.aesthetical.elements.setting + +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.aesthetical.elements.SettingElement +import com.paragon.util.formatCapitalised +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_1 +import org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2 +import java.awt.Color + +/** + * @author aesthetical + * @since 02/24/23 + */ +class EnumSettingElement(private val setting: Setting>) : SettingElement() { + private val hoverAnimation = BoundedAnimation(0.0f, 2.0f, 20.0f, false, Easing.LINEAR) + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + hoverAnimation.state = hovered(mouseX, mouseY, h = height * 2) + + nvg.quad(x, y, width, height * 2, SETTING_BG) + + val midPoint = (((height * 2) / 2.0f) - 16.0f / 2.0f) + nvg.text(setting.name, x + 4.0f + (hoverAnimation.animationFactor.toFloat() * 2.0f), y + midPoint, Color.WHITE, "axiforma", shadow = true) + val t = setting.value.toString().formatCapitalised() + nvg.text(t, x + width - (nvg.textWidth(t, face = "axiforma", size = 16.0f) + 4.0f), y + midPoint, Color.GRAY, "axiforma", shadow = true) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + + if (hovered(mouseX, mouseY, h = height * 2)) { + if (button == GLFW_MOUSE_BUTTON_1) { + setting.setValue(setting.nextEnum) + } else if (button == GLFW_MOUSE_BUTTON_2) { + setting.setValue(setting.previousEnum) + } + } + + return super.mouseClick(mouseX, mouseY, button) + } + + companion object { + private val SETTING_BG = Color(19, 19, 19) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/NumberSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/NumberSettingElement.kt new file mode 100644 index 0000000..7de964d --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/aesthetical/elements/setting/NumberSettingElement.kt @@ -0,0 +1,80 @@ +package com.paragon.client.ui.configuration.aesthetical.elements.setting + +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.aesthetical.elements.SettingElement +import com.paragon.util.calculations.MathsUtil +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import me.surge.animation.BoundedAnimation +import me.surge.animation.Easing +import java.awt.Color +import kotlin.math.roundToInt + +/** + * @author aesthetical + * @since 02/24/23 + */ +class NumberSettingElement(private val setting: Setting) : SettingElement() { + private val hoverAnimation = BoundedAnimation(0.0f, 2.0f, 20.0f, false, Easing.LINEAR) + private var dragging = false + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + hoverAnimation.state = hovered(mouseX, mouseY, h = height * 2) + + nvg.quad(x, y, width, height * 2, SETTING_BG) + + val difference = width.coerceAtMost(0f.coerceAtLeast(mouseX - (x + 4))).toDouble() + + val minimum = setting.minimum!!.toDouble() + val maximum = setting.maximum!!.toDouble() + + val value: Double + + if (dragging) { + value = if (difference == 0.0) { + minimum + } else { + val newValue = MathsUtil.roundDouble(difference / (width - 8) * (maximum - minimum) + minimum, 2) + val precision = 1 / setting.incrementation!!.toDouble() + (minimum.coerceAtLeast(maximum.coerceAtMost(newValue)) * precision).roundToInt() / precision + } + + when (setting.value) { + is Int -> setting.setValue(value.toInt()) + is Float -> setting.setValue(value.toFloat()) + is Double -> setting.setValue(value) + } + } + + val renderWidth = ((width - 4) * (setting.value.toDouble() - minimum) / (maximum - minimum)).toFloat() + nvg.quad(x, y, renderWidth, height * 2, getClientColour()) + + val midPoint = (((height * 2) / 2.0f) - 16.0f / 2.0f) + nvg.text(setting.name, x + 4.0f + (hoverAnimation.animationFactor.toFloat() * 2.0f), y + midPoint, Color.WHITE, "axiforma", shadow = true) + + val t = setting.value.toString() + nvg.text(t, x + width - (nvg.textWidth(t, face = "axiforma", size = 16.0f) + 4.0f), y + midPoint, Color.GRAY, "axiforma", shadow = true) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY, h = height * 2) && button == 0) { + dragging = true + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (dragging) { + dragging = false + return true + } + + return super.mouseRelease(mouseX, mouseY, button) + } + + companion object { + private val SETTING_BG = Color(19, 19, 19) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/SurgeUI.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/SurgeUI.kt new file mode 100644 index 0000000..ae63c62 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/SurgeUI.kt @@ -0,0 +1,93 @@ +package com.paragon.client.ui.configuration.surge + +import com.paragon.Paragon +import com.paragon.backend.module.Category +import com.paragon.client.ui.configuration.surge.panel.Panel +import com.paragon.mixin.duck.IMouse +import com.paragon.util.mc +import com.paragon.util.rendering.NVGWrapper +import net.minecraft.client.gui.screen.Screen +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.text.Text +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class SurgeUI : Screen(Text.of("")) { + + private val panels: MutableList = ArrayList() + + init { + var x = 20f + + for (category in Category.values()) { + panels.add(Panel(category, x, 20f)) + x += 200f + } + } + + override fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + super.render(matrices, mouseX, mouseY, delta) + + NVGWrapper.scope { nvg -> + nvg.quad(0f, 0f, width.toFloat() * 2, height.toFloat() * 2, Color(0, 0, 0, 150)) + + panels.forEach { panel: Panel -> + panel.render( + nvg, + mc.mouse.x.toInt(), + mc.mouse.y.toInt(), + 0f + ) + } + } + } + + override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { + panels.forEach { + if (it.mouseClick(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button)) { + return true + } + } + + return super.mouseClicked(mouseX, mouseY, button) + } + + override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean { + panels.forEach { + if (it.mouseRelease(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button)) { + return true + } + } + + return super.mouseReleased(mouseX, mouseY, button) + } + + override fun mouseScrolled(mouseX: Double, mouseY: Double, amount: Double): Boolean { + panels.forEach { + if (it.scroll(mc.mouse.x.toInt(), mc.mouse.y.toInt(), amount)) { + return true + } + } + + return super.mouseScrolled(mouseX, mouseY, amount) + } + + override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean { + panels.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + + return super.keyPressed(keyCode, scanCode, modifiers) + } + + override fun shouldPause(): Boolean { + return false + } + + override fun close() { + Paragon.moduleManager.save("current") + super.close() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/module/ModuleElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/module/ModuleElement.kt new file mode 100644 index 0000000..825b353 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/module/ModuleElement.kt @@ -0,0 +1,115 @@ +package com.paragon.client.ui.configuration.surge.module + +import com.paragon.backend.bind.Bind +import com.paragon.backend.module.Module +import com.paragon.backend.setting.RegistrySetting +import com.paragon.backend.setting.Setting +import com.paragon.client.ui.configuration.surge.setting.* +import com.paragon.client.ui.configuration.surge.setting.registry.RegistrySettingElement +import com.paragon.util.fade +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element +import me.surge.animation.Animation +import me.surge.animation.Easing +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class ModuleElement(private val module: Module, x: Float, y: Float, width: Float, height: Float) : Element(x, y, width, height) { + + private val enabled = Animation({ 150f }, false) { Easing.LINEAR } + private val expanded = Animation({ 150f }, false) { Easing.LINEAR } + + private val children: MutableList> = ArrayList() + + init { + enabled.state = module.isEnabled + + module.settingMap.values.forEach { + when (it.value) { + is Number -> children.add(NumberSettingElement(it as Setting, x, y, width, 32f)) + is Boolean -> children.add(BooleanSettingElement(it as Setting, x, y, width, height)) + is Bind -> children.add(BindSettingElement(it as Setting, x, y, width, height)) + is Enum<*> -> children.add(EnumSettingElement(it as Setting>, x, y, width, height)) + } + + if (it is RegistrySetting<*>) { + children.add(RegistrySettingElement(it, x, y, width, height)) + } + } + } + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + enabled.state = module.isEnabled + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + + nvg.text(module.name, x + 5, y + 7, Color.GRAY.fade(getClientColour(), enabled.animationFactor), size = 13f, shadow = false) + + if (children.size > 2) { + val ind = if (expanded.animationFactor > 0) " .." else "..." + nvg.text(ind, x + width - (nvg.textWidth(ind) + 5), y + 6, Color.WHITE, size = 12f, shadow = true) + } + + if (expanded.animationFactor > 0) { + nvg.scissor(x, y + height, width, getOffset() - height) { + var offset = y + height + + children.filter { it.setting.visibility() }.forEach { child -> + child.x = x + 2 + child.y = offset + + child.render(nvg, mouseX, mouseY, mouseDelta) + nvg.quad(x, offset, 2f, child.getOffset(), getClientColour()) + + offset += child.getOffset() + } + } + } + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY)) { + if (button == 0) { + module.toggle() + return true + } else if (button == 1) { + expanded.state = !expanded.state + return true + } + } + + if (expanded.state) { + if (children.filter { it.setting.visibility() }.any { it.mouseClick(mouseX, mouseY, button) }) { + return true + } + } + + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (expanded.state) { + if (children.filter { it.setting.visibility() }.any { it.mouseRelease(mouseX, mouseY, button) }) { + return true + } + } + + return super.mouseRelease(mouseX, mouseY, button) + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + if (expanded.state) { + children.filter { it.setting.visibility() }.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + } + + super.keyTyped(keyCode, scanCode, modifiers) + } + + override fun getOffset(): Float { + return (super.getOffset() + children.filter { it.setting.visibility() }.sumOf { it.getOffset().toDouble() }.toFloat() * expanded.animationFactor).toFloat() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/panel/Panel.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/panel/Panel.kt new file mode 100644 index 0000000..91a36e1 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/panel/Panel.kt @@ -0,0 +1,108 @@ +package com.paragon.client.ui.configuration.surge.panel + +import com.paragon.Paragon +import com.paragon.backend.module.Category +import com.paragon.client.ui.configuration.surge.module.ModuleElement +import com.paragon.util.formatCapitalised +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element +import me.surge.animation.Animation +import me.surge.animation.Easing +import org.lwjgl.nanovg.NanoVG +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class Panel(private val category: Category, x: Float, y: Float) : Element(x, y, 190f, 600f) { + + private val bar = 35f + private val elements: MutableList = ArrayList() + private val expanded = Animation({ 150f }, true) { Easing.LINEAR } + private var dragging = false + private var lastX = 0f + private var lastY = 0f + + init { + Paragon.moduleManager + .getModules { it.category == this.category } + .forEach { elements.add(ModuleElement(it, x, y, width, 24f)) } + } + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + if (dragging) { + x = mouseX - lastX + y = mouseY - lastY + } + + val scissorHeight = (moduleHeight * expanded.animationFactor).toFloat() + + nvg.quad(x, y, width, bar + scissorHeight + 4, Color(16, 16, 16)) + nvg.text(category.name.formatCapitalised(), x + width / 2, y + 9, Color.WHITE, "inter", 18f, false, NanoVG.NVG_ALIGN_CENTER or NanoVG.NVG_ALIGN_TOP) + nvg.quad(x, y + bar - 2, width, 2f, getClientColour()) + + nvg.scissor(x, y + 35, width, scissorHeight) { + nvg.quad(x, y + 35, width, scissorHeight, Color(19, 22, 24)) + + var offset = y + bar + + elements.forEach { + it.x = x + it.y = offset + it.render(nvg, mouseX, mouseY, mouseDelta) + offset += it.getOffset() + } + } + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY) && mouseY <= y + bar) { + if (button == 0) { + dragging = true + lastX = mouseX - x + lastY = mouseY - y + return true + } else if (button == 1) { + expanded.state = !expanded.state + return true + } + } + + if (elements.any { it.mouseClick(mouseX, mouseY, button) }) { + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (dragging && button == 0) { + dragging = false + return true + } + + if (elements.any { it.mouseRelease(mouseX, mouseY, button) }) { + return true + } + + return super.mouseRelease(mouseX, mouseY, button) + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + elements.forEach { it.keyTyped(keyCode, scanCode, modifiers) } + super.keyTyped(keyCode, scanCode, modifiers) + } + + private val moduleHeight: Float + get() { + var height = 0f + + for (element in elements) { + height += element.getOffset() + } + + return height + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BindSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BindSettingElement.kt new file mode 100644 index 0000000..702ed6e --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BindSettingElement.kt @@ -0,0 +1,66 @@ +package com.paragon.client.ui.configuration.surge.setting + +import com.paragon.backend.bind.Bind +import com.paragon.backend.bind.DeviceType +import com.paragon.backend.setting.Setting +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import org.lwjgl.glfw.GLFW +import java.awt.Color + +/** + * @author surge, aesthetical + * @since 11/02/2023 + */ +class BindSettingElement(setting: Setting, x: Float, y: Float, width: Float, height: Float) : SettingElement(setting, x, y, width, height) { + + private var listening = false + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + + if (listening) { + nvg.quad(x, y, width, height, getClientColour()) + } + + nvg.text(setting.name, x + 5, y + 7f, Color.WHITE, size = 12f, shadow = false) + nvg.text(setting.value.toString(), x + width - nvg.textWidth(setting.value.toString(), size = 12.0f) - 5, y + 7f, Color.GRAY, size = 12f, shadow = false) + + super.render(nvg, mouseX, mouseY, mouseDelta) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + return if (hovered(mouseX, mouseY)) { + when (button) { + 0 -> { + listening = !listening + true + } + + 1 -> { + setting.value.code = GLFW.GLFW_KEY_UNKNOWN + listening = false + true + } + + else -> { + setting.value.type = DeviceType.MOUSE + setting.value.code = button + listening = false + true + } + } + } else super.mouseClick(mouseX, mouseY, button) + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + if (listening) { + setting.value.type = DeviceType.KEYBOARD + setting.value.code = keyCode + listening = false + } + + super.keyTyped(keyCode, scanCode, modifiers) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BooleanSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BooleanSettingElement.kt new file mode 100644 index 0000000..8709726 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/BooleanSettingElement.kt @@ -0,0 +1,31 @@ +package com.paragon.client.ui.configuration.surge.setting + +import com.paragon.backend.setting.Setting +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class BooleanSettingElement(setting: Setting, x: Float, y: Float, width: Float, height: Float) : SettingElement(setting, x, y, width, height) { + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + + nvg.text(setting.name, x + 5, y + 7.5f, if (setting.value) getClientColour() else Color.WHITE, size = 12f, shadow = false) + + super.render(nvg, mouseX, mouseY, mouseDelta) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY) && button == 0) { + setting.setValue(!setting.value) + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/EnumSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/EnumSettingElement.kt new file mode 100644 index 0000000..be5ccbd --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/EnumSettingElement.kt @@ -0,0 +1,39 @@ +package com.paragon.client.ui.configuration.surge.setting + +import com.paragon.backend.setting.Setting +import com.paragon.util.formatCapitalised +import com.paragon.util.rendering.NVGWrapper +import java.awt.Color + +/** + * @author surge + * @since 11/02/2023 + */ +class EnumSettingElement(setting: Setting>, x: Float, y: Float, width: Float, height: Float) : SettingElement>(setting, x, y, width, height) { + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + nvg.text(setting.name, x + 5, y + 7, Color.WHITE, size = 12f, shadow = false) + + val data = setting.value.name.formatCapitalised() + + nvg.text(data, x + width - nvg.textWidth(data, "inter", 12f) - 5, y + 7, Color.GRAY, size = 12f, shadow = false) + + super.render(nvg, mouseX, mouseY, mouseDelta) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY)) { + if (button == 0) { + setting.setValue(setting.nextEnum) + } else if (button == 1) { + setting.setValue(setting.previousEnum) + } + + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/NumberSettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/NumberSettingElement.kt new file mode 100644 index 0000000..4a61ce2 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/NumberSettingElement.kt @@ -0,0 +1,74 @@ +package com.paragon.client.ui.configuration.surge.setting + +import com.paragon.backend.setting.Setting +import com.paragon.util.calculations.MathsUtil.roundDouble +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import java.awt.Color +import kotlin.math.roundToInt + +/** + * @author surge + * @since 11/02/2023 + */ +class NumberSettingElement(setting: Setting, x: Float, y: Float, width: Float, height: Float) : SettingElement(setting, x, y, width, height) { + + private var dragging = false + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + + val difference = width.coerceAtMost(0f.coerceAtLeast(mouseX - (x + 4))).toDouble() + + val minimum = setting.minimum!!.toDouble() + val maximum = setting.maximum!!.toDouble() + + val renderWidth = ((width - 8) * (setting.value.toDouble() - minimum) / (maximum - minimum)).toFloat() + + val value: Double + + if (dragging) { + value = if (difference == 0.0) { + minimum + } else { + val newValue = roundDouble(difference / (width - 8) * (maximum - minimum) + minimum, 2) + val precision = 1 / setting.incrementation!!.toDouble() + (minimum.coerceAtLeast(maximum.coerceAtMost(newValue)) * precision).roundToInt() / precision + } + + when (setting.value) { + is Int -> setting.setValue(value.toInt()) + is Float -> setting.setValue(value.toFloat()) + is Double -> setting.setValue(value) + } + } + + nvg.quad(x + 4, y + 24, width - 8f, 2f, Color(20, 20, 20)) + nvg.quad(x + 4, y + 24, renderWidth, 2f, getClientColour()) + nvg.quad(x + 2 + renderWidth, y + 23, 4f, 4f, Color.WHITE) + + nvg.text(setting.name, x + 5, y + 7, Color.WHITE, size = 12f, shadow = false) + nvg.text(setting.value.toString(), x + width - nvg.textWidth(setting.value.toString(), size = 12.0f) - 5, y + 7, Color.GRAY, size = 12f, shadow = false) + + super.render(nvg, mouseX, mouseY, mouseDelta) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY) && button == 0) { + dragging = true + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (dragging) { + dragging = false + return true + } + + return super.mouseRelease(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/SettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/SettingElement.kt new file mode 100644 index 0000000..81c0414 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/SettingElement.kt @@ -0,0 +1,23 @@ +package com.paragon.client.ui.configuration.surge.setting + +import com.paragon.backend.setting.Setting +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element + +/** + * @author surge + * @since 11/02/2023 + */ +open class SettingElement(val setting: Setting, x: Float, y: Float, width: Float, height: Float) : Element(x, y, width, height) { + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) {} + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + return super.mouseClick(mouseX, mouseY, button) + } + + override fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + return super.mouseRelease(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryElement.kt new file mode 100644 index 0000000..8c22eb3 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryElement.kt @@ -0,0 +1,37 @@ +package com.paragon.client.ui.configuration.surge.setting.registry + +import com.paragon.backend.setting.RegistrySetting +import com.paragon.util.fade +import com.paragon.util.formatCapitalised +import com.paragon.util.getClientColour +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element +import me.surge.animation.Animation +import me.surge.animation.Easing +import java.awt.Color + +/** + * @author surge + * @since 06/03/2023 + */ +class RegistryElement(val element: T, val setting: RegistrySetting, x: Float, y: Float, width: Float, height: Float) : Element(x, y, width, height) { + + private val enabled = Animation(200f, element in setting.enabled(), Easing.LINEAR) + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + enabled.state = setting.getStateT(element) + + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + nvg.text(element.toString().split('.').last().formatCapitalised(), x + 5, y + 7, Color.GRAY.fade(getClientColour(), enabled.animationFactor), size = 13f, shadow = false) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY)) { + setting.setStateT(element, !setting.getStateT(element)) + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryScreen.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryScreen.kt new file mode 100644 index 0000000..be2fb94 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistryScreen.kt @@ -0,0 +1,118 @@ +package com.paragon.client.ui.configuration.surge.setting.registry + +import com.paragon.backend.setting.RegistrySetting +import com.paragon.util.getClientColour +import com.paragon.util.mc +import com.paragon.util.offset +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.tempGrow +import net.minecraft.client.gui.screen.Screen +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.text.Text +import net.minecraft.util.math.MathHelper +import org.lwjgl.nanovg.NanoVG.NVG_ALIGN_CENTER +import org.lwjgl.nanovg.NanoVG.NVG_ALIGN_TOP +import java.awt.Color +import java.awt.Rectangle +import java.lang.Double.max + +/** + * @author surge + * @since 06/03/2023 + */ +class RegistryScreen(val setting: RegistrySetting, val last: Screen) : Screen(Text.of("")) { + + private val elements = mutableListOf>() + + private var bounds = Rectangle(width / 2 - 110, height / 2 - 90, 220, 180) + private var scroll = 0f + + init { + setting.states.forEach { (key, _) -> + elements.add(RegistryElement(key, setting, 0f, 0f, 200f, 24f)) + } + } + + override fun init() { + bounds = Rectangle(width - 414, height - 220, 826, 440) + } + + override fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + var totalHeight = 0.0 + + // lets just ignore this + var i = 0 + + elements.forEach { + i++ + + if (i % 4 == 0) { + totalHeight += it.height + 2f + } + } + + scroll = MathHelper.clamp(scroll.toDouble(), -max( + 0.0, + totalHeight - MathHelper.clamp(totalHeight, 0.0, bounds.height - 36.0) + ), 0.0).toFloat() + + NVGWrapper.scope { nvg -> + nvg.quad(0f, 0f, width.toFloat() * 2, height.toFloat() * 2, Color(0, 0, 0, 150)) + nvg.quad(bounds.tempGrow(0, 30), Color(16, 16, 16)) + + nvg.text(setting.name, bounds.x + bounds.width / 2f, bounds.y + 5f, size = 20f, alignment = NVG_ALIGN_CENTER or NVG_ALIGN_TOP) + nvg.quad(bounds.offset(10, 28).tempGrow(-20, -(bounds.height) + 2), getClientColour()) + + // lmao. + var i = 0 + + var offsetX = bounds.x + 10f + var offsetY = bounds.y + 30f + scroll + + nvg.scissor(bounds.x.toFloat(), bounds.y.toFloat() + 30f, bounds.width.toFloat(), bounds.height.toFloat() - 10f) { + elements.sortedBy { it.element.toString() }.forEach { + it.x = offsetX + it.y = offsetY + + it.render(nvg, mc.mouse.x.toInt(), mc.mouse.y.toInt(), delta) + + offsetX += it.width + 2f + + i++ + + if (i % 4 == 0) { + offsetX = bounds.x + 10f + offsetY += it.height + 2f + } + } + } + } + + super.render(matrices, mouseX, mouseY, delta) + } + + override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { + if (bounds.offset(0, 30).contains(mc.mouse.x.toInt(), mc.mouse.y.toInt())) { + elements.forEach { + if (it.mouseClick(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button)) { + return true + } + } + } + + return super.mouseClicked(mouseX, mouseY, button) + } + + override fun mouseScrolled(mouseX: Double, mouseY: Double, amount: Double): Boolean { + if (bounds.offset(0, 30).contains(mc.mouse.x.toInt(), mc.mouse.y.toInt())) { + scroll += amount.toFloat() * 18 + } + + return super.mouseScrolled(mouseX, mouseY, amount) + } + + override fun close() { + client!!.setScreen(last) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistrySettingElement.kt b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistrySettingElement.kt new file mode 100644 index 0000000..5860bc7 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/configuration/surge/setting/registry/RegistrySettingElement.kt @@ -0,0 +1,33 @@ +package com.paragon.client.ui.configuration.surge.setting.registry + +import com.paragon.backend.setting.RegistrySetting +import com.paragon.client.ui.configuration.surge.setting.SettingElement +import com.paragon.util.mc +import com.paragon.util.rendering.NVGWrapper +import net.minecraft.registry.Registry +import java.awt.Color + +/** + * @author surge + * @since 06/03/2023 + */ +class RegistrySettingElement(setting: RegistrySetting, x: Float, y: Float, width: Float, height: Float) : SettingElement>(setting, x, y, width, height) { + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) { + nvg.quad(x, y, width, height, if (hovered(mouseX, mouseY)) hovered else background) + + nvg.text(setting.name, x + 5, y + 7.5f, Color.WHITE, size = 12f) + + super.render(nvg, mouseX, mouseY, mouseDelta) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hovered(mouseX, mouseY) && button == 0) { + mc.setScreen(RegistryScreen(setting as RegistrySetting, mc.currentScreen!!)) + return true + } + + return super.mouseClick(mouseX, mouseY, button) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/title/MainMenuHook.kt b/src/main/kotlin/com/paragon/client/ui/title/MainMenuHook.kt new file mode 100644 index 0000000..2536ec3 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/title/MainMenuHook.kt @@ -0,0 +1,208 @@ +package com.paragon.client.ui.title + +import com.paragon.Paragon.Companion.altManager +import com.paragon.Paragon.Companion.version +import com.paragon.backend.alt.Alt +import com.paragon.client.ui.widgets.ButtonElement +import com.paragon.client.ui.widgets.ElementContainer +import com.paragon.client.ui.widgets.TextFieldElement +import com.paragon.util.BuildConfig.BuildConfig +import com.paragon.util.fade +import com.paragon.util.mc +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.NVGWrapper.scope +import me.surge.animation.Animation +import me.surge.animation.Easing +import net.minecraft.SharedConstants +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.util.math.MathHelper +import org.lwjgl.glfw.GLFW.GLFW_KEY_BACKSPACE +import org.lwjgl.glfw.GLFW.GLFW_KEY_ENTER +import org.lwjgl.nanovg.NanoVG.* +import java.awt.Color +import java.lang.Double.max + +/** + * @author surge + * @since 22/02/2023 + */ +object MainMenuHook { + + var height = 0f + private var altManagerUI: AltManagerUI = AltManagerUI() + + fun init() { + altManagerUI = AltManagerUI() + } + + fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + scope { nvg -> + nvg.text("Running Paragon v" + version + " on git " + BuildConfig.BRANCH + "/" + BuildConfig.HASH, 5f, 5f, Color.WHITE, shadow = true) + altManagerUI.render(nvg, mouseX, mouseY, delta) + } + } + + fun mouseClicked(mouseX: Int, mouseY: Int, button: Int): Boolean { + altManagerUI.mouseClicked(mouseX, mouseY, button) + return false + } + + fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean { + altManagerUI.keyTyped(keyCode, scanCode, modifiers) + return false + } + + fun mouseScrolled(mouseX: Int, mouseY: Int, amount: Float): Boolean { + altManagerUI.mouseScrolled(mouseX, mouseY, amount) + return false + } + + fun charTyped(char: Char, modifiers: Int) { + altManagerUI.charTyped(char, modifiers) + } + + private class AltManagerUI : ElementContainer() { + + private val expand = Animation(300f, false, Easing.CIRC_IN_OUT) + + private val WIDTH = 300f + + private val x: Float + get() { + return (-WIDTH + ((WIDTH + 10) * expand.animationFactor)).toFloat() + } + + private val height: Float + get() { + return mc.window.height - 60f + } + + private val altEntries = mutableListOf() + + private var scroll = 0f + + init { + altManager.alts.forEach { + altEntries.add(AltEntry(it, 0f, 0f, WIDTH - 20f, 30f)) + } + + put("email", TextFieldElement("Email", 0f, 0f, WIDTH - 20f, 25f)) + put("password", TextFieldElement("Password", 0f, 0f, WIDTH - 20f, 25f)) + + put("add", ButtonElement("Add", 0f, 0f, WIDTH - 20f, 25f) { + altManager.alts.add(Alt(get("email", TextFieldElement::class.java)!!.inputted, get("password", TextFieldElement::class.java)!!.inputted)) + + get("email", TextFieldElement::class.java)!!.inputted = "" + get("password", TextFieldElement::class.java)!!.inputted = "" + }) + } + + fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, delta: Float) { + altEntries.removeIf { entry -> !altManager.alts.any { alt -> entry.alt.email == alt.email } } + + altManager.alts.forEach { alt -> + if (!altEntries.any { it.alt == alt }) { + altEntries.add(AltEntry(alt, 0f, 0f, WIDTH - 20f, 25f)) + } + } + + val totalHeight = altEntries.sumOf { it.height.toDouble() + 10f } + + nvg.roundedQuad(x + WIDTH - 10f, 30f + (height / 2f) - 16, 36f, 32f, 7f, Color(16, 16, 16)) + nvg.roundedQuad(x, 30f, WIDTH, height, 10f, Color(16, 16, 16)) + + nvg.text("Alt Manager", x + 10f, 39f, Color.WHITE, shadow = false) + nvg.text(altManager.status, x + WIDTH - nvg.textWidth(altManager.status, size = 12f) - 5, 44f, Color.WHITE, "inter", 12f, false) + nvg.quad(x + 5f, 65f, WIDTH - 10f, 1f, Color(55, 55, 55, 50)) + + nvg.text(if (expand.state) "<" else ">", x + WIDTH + 12f, 30f + (height / 2f) + 9, Color.WHITE, "inter", 30f, false, alignment = NVG_ALIGN_CENTER) + + scroll = MathHelper.clamp(scroll.toDouble(), -max(0.0, totalHeight - MathHelper.clamp(altEntries.sumOf { it.height.toDouble() + 10f }, 0.0, height - 60.0)), 0.0).toFloat() + + var offset = 70f + scroll + + nvg.scissor(x + 10f, offset, WIDTH - 10f, height - 20f) { + altEntries.forEach { + it.x = x + 10f + it.y = offset + it.width = WIDTH - 85f + + it.render(nvg, mouseX, mouseY, delta) + + offset += it.height + 10f + } + } + + positionAscending(x + 10f, 30f + height, 5f) + renderElements(nvg, mouseX, mouseY, delta) + } + + fun mouseClicked(mouseX: Int, mouseY: Int, button: Int) { + if (mouseX >= x + WIDTH && mouseX <= x + WIDTH + 30f && mouseY >= 30f + (height / 2f) - 13 && mouseY <= 30f + (height / 2f) + 13) { + this.expand.state = !this.expand.state + return + } + + altEntries.forEach { + it.clicked(button) + } + + clickElements(mouseX, mouseY, button) + } + + fun mouseScrolled(mouseX: Int, mouseY: Int, amount: Float) { + if (mouseX >= x && mouseX <= x + WIDTH && mouseY >= 65f && mouseY <= 30f + height) { + scroll += amount * 13 + } + } + + fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + typeElements(keyCode, scanCode, modifiers) + } + + fun charTyped(char: Char, modifiers: Int) { + charElements(char, modifiers) + } + + } + + private class AltEntry(val alt: Alt, var x: Float, var y: Float, var width: Float, var height: Float) : ElementContainer() { + + private val hovered = Animation(100f, false, Easing.LINEAR) + + init { + put("delete", ButtonElement("Delete", 0f, 0f, 64f, height) { + altManager.alts.remove(this.alt) + }) + } + + fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, delta: Float) { + hovered.state = hovered(mouseX, mouseY) + + nvg.roundedQuad(x, y, width, height, 7f, Color(23, 23, 23).fade(Color(33, 33, 33), hovered.animationFactor)) + + nvg.text(alt.cachedUsername, x + 5f, y + height / 2f, Color.WHITE, "inter", size = 14f, false, alignment = NVG_ALIGN_LEFT or NVG_ALIGN_MIDDLE) + + get("delete")!! + .position(x + width + 5f, y) + .render(nvg, mouseX, mouseY, delta) + } + + fun clicked(button: Int) { + if (get("delete")!!.hovered(mc.mouse.x.toInt(), mc.mouse.y.toInt())) { + get("delete")!!.mouseClick(mc.mouse.x.toInt(), mc.mouse.y.toInt(), button) + return + } + + if (hovered.state && button == 0) { + altManager.login(alt) + } + } + + fun hovered(mouseX: Int, mouseY: Int): Boolean { + return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height + } + + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/widgets/ButtonElement.kt b/src/main/kotlin/com/paragon/client/ui/widgets/ButtonElement.kt new file mode 100644 index 0000000..f855423 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/widgets/ButtonElement.kt @@ -0,0 +1,35 @@ +package com.paragon.client.ui.widgets + +import com.paragon.util.fade +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element +import me.surge.animation.Animation +import me.surge.animation.Easing +import org.lwjgl.nanovg.NanoVG +import java.awt.Color + +/** + * @author surge + * @since 07/03/2023 + */ +class ButtonElement(val text: String, x: Float, y: Float, width: Float, height: Float, val clicked: () -> Unit) : Element(x, y, width, height) { + + private val hover = Animation(100f, false, Easing.LINEAR) + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, delta: Float) { + hover.state = hovered(mouseX, mouseY) + + nvg.roundedQuad(x, y, width, height, 7f, Color(23, 23, 23).fade(Color(33, 33, 33), hover.animationFactor)) + nvg.text(text, x + width / 2f, y + height / 2f + 1, Color.WHITE, "inter", 12f, false, alignment = NanoVG.NVG_ALIGN_CENTER or NanoVG.NVG_ALIGN_MIDDLE) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hover.state) { + clicked() + return true + } + + return false + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/widgets/ElementContainer.kt b/src/main/kotlin/com/paragon/client/ui/widgets/ElementContainer.kt new file mode 100644 index 0000000..08b62b1 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/widgets/ElementContainer.kt @@ -0,0 +1,61 @@ +package com.paragon.client.ui.widgets + +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element + +/** + * @author surge + * @since 07/03/2023 + */ +open class ElementContainer { + + val elements = hashMapOf() + + fun renderElements(nvg: NVGWrapper, mouseX: Int, mouseY: Int, delta: Float) { + elements.forEach { + it.value.render(nvg, mouseX, mouseY, delta) + } + } + + fun clickElements(mouseX: Int, mouseY: Int, button: Int) { + elements.forEach { + it.value.mouseClick(mouseX, mouseY, button) + } + } + + fun typeElements(keyCode: Int, scanCode: Int, modifiers: Int) { + elements.forEach { (_, element) -> + element.keyTyped(keyCode, scanCode, modifiers) + } + } + + fun charElements(char: Char, modifiers: Int) { + elements.forEach { (_, element) -> + element.charTyped(char, modifiers) + } + } + + fun positionAscending(x: Float, initialY: Float, offset: Float = 10f): ElementContainer { + var y = initialY - offset + + elements.forEach { (_, element) -> + y -= element.height + offset + element.position(x, y) + } + + return this + } + + fun put(id: String, element: Element) { + elements[id] = element + } + + fun take(id: String) { + elements.remove(id) + } + + inline fun get(id: String, clazz: Class = T::class.java): T? { + return elements[id]?.let { clazz.cast(it) } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/client/ui/widgets/TextFieldElement.kt b/src/main/kotlin/com/paragon/client/ui/widgets/TextFieldElement.kt new file mode 100644 index 0000000..4b220b3 --- /dev/null +++ b/src/main/kotlin/com/paragon/client/ui/widgets/TextFieldElement.kt @@ -0,0 +1,58 @@ +package com.paragon.client.ui.widgets + +import com.paragon.util.fade +import com.paragon.util.rendering.NVGWrapper +import com.paragon.util.rendering.ui.Element +import me.surge.animation.Animation +import me.surge.animation.Easing +import net.minecraft.SharedConstants +import org.lwjgl.glfw.GLFW +import java.awt.Color + +/** +* @author surge +* @since 07/03/2023 +*/ +class TextFieldElement(val initial: String, x: Float, y: Float, width: Float, height: Float) : Element(x, y, width, height) { + + private val hover = Animation(100f, false, Easing.LINEAR) + private val listening = Animation(100f, false, Easing.LINEAR) + + var inputted: String = "" + + override fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, delta: Float) { + hover.state = hovered(mouseX, mouseY) + + nvg.roundedQuad(x, y, width, height, 7f, Color(23, 23, 23).fade(Color(33, 33, 33), hover.animationFactor).fade(Color(43, 43, 43), listening.animationFactor)) + nvg.text(inputted.ifEmpty { initial }, x + 5, y + 8, Color.WHITE, "inter", 12f, false) + } + + override fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + if (hover.state) { + listening.state = !listening.state + return true + } + + return false + } + + override fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) { + if (listening.state) { + if (keyCode == GLFW.GLFW_KEY_ENTER) { + listening.state = false + return + } else if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { + if (inputted.isNotEmpty()) { + inputted = inputted.substring(0, inputted.length - 1) + } + } + } + } + + override fun charTyped(char: Char, modifiers: Int) { + if (listening.state && SharedConstants.isValidChar(char)) { + inputted += char.toString() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/Misc.kt b/src/main/kotlin/com/paragon/util/Misc.kt new file mode 100644 index 0000000..dbb6a4d --- /dev/null +++ b/src/main/kotlin/com/paragon/util/Misc.kt @@ -0,0 +1,222 @@ +package com.paragon.util + +import com.paragon.backend.setting.Colour +import kotlinx.coroutines.* +import net.minecraft.block.* +import net.minecraft.client.MinecraftClient +import net.minecraft.client.gui.hud.InGameHud +import net.minecraft.entity.EntityType +import net.minecraft.text.Style +import net.minecraft.text.Text +import net.minecraft.util.Formatting +import net.minecraft.util.crash.CrashReport +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Box +import net.minecraft.util.math.Direction +import net.minecraft.util.math.Vec3d +import java.awt.Color +import java.awt.Rectangle +import kotlin.coroutines.CoroutineContext +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +/** + * @author surge, bush + * @since 19/02/2023 + */ +val mc: MinecraftClient = MinecraftClient.getInstance() + +// they aren't actually unattackable but we dont want to attack them by default +// i love chatgpt +val unattackables = arrayOf( + EntityType.ARMOR_STAND, + EntityType.ITEM_FRAME, + EntityType.LEASH_KNOT, + EntityType.PAINTING, + EntityType.END_CRYSTAL, + EntityType.EXPERIENCE_ORB, + EntityType.FIREWORK_ROCKET, + EntityType.GLOW_ITEM_FRAME, + EntityType.LIGHTNING_BOLT, + EntityType.PHANTOM, + EntityType.PUFFERFISH, + EntityType.SHULKER_BULLET, + EntityType.SMALL_FIREBALL, + EntityType.SNOWBALL, + EntityType.SPECTRAL_ARROW, + EntityType.TRIDENT, + EntityType.WITHER_SKULL, + EntityType.FALLING_BLOCK, + EntityType.EGG, + EntityType.ARROW, + EntityType.BOAT, + EntityType.MINECART, + EntityType.ENDER_PEARL, + EntityType.EYE_OF_ENDER, + EntityType.FIREBALL, + EntityType.TRADER_LLAMA, + EntityType.WANDERING_TRADER, + EntityType.FISHING_BOBBER, + EntityType.DRAGON_FIREBALL, + EntityType.LLAMA_SPIT, + EntityType.SMALL_FIREBALL + + // might be some more idk +) + +fun nullCheck() = mc.player == null || mc.world == null +fun getClientColour(): Colour = Colour(185, 19, 211, 255) + +fun Color.fade(secondary: Color, factor: Double): Color { + return Color( + (this.red + (secondary.red - this.red) * factor.coerceIn(0.0, 1.0)).toInt(), + (this.green + (secondary.green - this.green) * factor.coerceIn(0.0, 1.0)).toInt(), + (this.blue + (secondary.blue - this.blue) * factor.coerceIn(0.0, 1.0)).toInt(), + (this.alpha + (secondary.alpha - this.alpha) * factor.coerceIn(0.0, 1.0)).toInt() + ) +} + +fun BlockPos.getPlaceableSide(): Direction? { + Direction.values().forEach { + val neighbour = this.offset(it) + val opposite = it.opposite + + val state = mc.world!!.getBlockState(neighbour) + + if (state.isAir || state.block.interactable()) { + return@forEach + } + + return opposite + } + + return null +} + +fun Block.interactable(): Boolean = this is CraftingTableBlock + || this is AnvilBlock + || this is ButtonBlock + || this is AbstractPressurePlateBlock + || this is BlockWithEntity + || this is BedBlock + || this is FenceGateBlock + || this is DoorBlock + || this is NoteBlock + || this is TrapdoorBlock + +fun Number.truncate(places: Int): String { + val split = this.toString().split('.') + + var decimals = "" + + if (split.size > 1) { + decimals = '.' + split[1].substring(0, minOf(places + 1, split[1].lastIndex)) + } + + return split[0] + decimals +} + +operator fun Vec3d.component1(): Double = x +operator fun Vec3d.component2(): Double = y +operator fun Vec3d.component3(): Double = z + +fun BlockPos.box(): Box { + return Box(this.x.toDouble(), this.y.toDouble(), this.z.toDouble(), (this.x + 1).toDouble(), (this.y + 1).toDouble(), (this.z + 1).toDouble()) +} + +fun InGameHud.print(content: String, id: Int = hashCode()) { + val chatComponent = Text.literal(Formatting.LIGHT_PURPLE.toString() + "paragon" + Formatting.DARK_GRAY + " \u00BB ") + .setStyle(Style.EMPTY.withColor(Formatting.GRAY)).append(content) + chatHud.addMessage(chatComponent) +} + +fun String.formatCapitalised(): String { + return buildString(this.length) { + var isFirst = true + + this@formatCapitalised.forEach { + if (it == '_') { + isFirst = true + return@forEach + } + + if (isFirst) { + append(' ') + append(it.toString().uppercase()) + isFirst = false + } else { + append(it.toString().lowercase()) + } + } + } +} + +fun Rectangle.offset(x: Int, y: Int): Rectangle { + return Rectangle( + this.x + x, + this.y + y, + this.width, + this.height + ) +} + +fun Rectangle.tempGrow(width: Int, height: Int): Rectangle { + return Rectangle( + this.x, + this.y, + this.width + width, + this.height + height + ) +} + +// FROM 711.CLUB vvv + +private val defaultContext = Dispatchers.Default + CoroutineExceptionHandler { context, throwable -> + mc.setCrashReportSupplier( + CrashReport( + """ + Paragon: An uncaught exception was thrown from a coroutine. This means something + bad happened that would probably make the game unplayable if it wasn't shut down. + + Context: $context + + DM the devs and tell them to fix their shitcode! (also please send them this whole log) + + """.trimIndent(), throwable + ) + ) +} + +object Background : CoroutineScope by CoroutineScope(defaultContext), CoroutineContext by defaultContext + +// BIG +fun backgroundThread(block: suspend CoroutineScope.() -> Unit) = Background.launch(block = block) + +fun CoroutineScope.lazyLaunch(block: suspend CoroutineScope.() -> Unit) = launch( + start = CoroutineStart.LAZY, block = block +) + +/** + * Runs the given block on another thread. If the delegated + * property is called before the thread finishes, the + * calling thread will be paused until it finishes. + * + * @author bush + * @since 2/17/2022 + */ +class AsyncDelegate(block: suspend CoroutineScope.() -> T) : ReadWriteProperty { + private val deferred = Background.async { block() } + private var value: T? = null + + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + // I know this will go every time if the .await()'ed value is null, but I cba to change this + if (value == null) value = runBlocking { deferred.await() } + return value!! + } + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + this.value = value + } +} + +fun async(block: suspend CoroutineScope.() -> T) = AsyncDelegate(block) \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/calculations/MathsUtil.kt b/src/main/kotlin/com/paragon/util/calculations/MathsUtil.kt new file mode 100644 index 0000000..89ccf94 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/calculations/MathsUtil.kt @@ -0,0 +1,23 @@ +package com.paragon.util.calculations + +import net.minecraft.entity.Entity +import net.minecraft.util.math.Vec3d +import java.math.BigDecimal +import java.math.RoundingMode + +/** + * @author surge + * @since 11/02/2023 + */ +object MathsUtil { + + @JvmStatic + fun roundDouble(value: Double, scale: Int): Double { + return BigDecimal(value).setScale(scale, RoundingMode.HALF_DOWN).toDouble() + } + + fun interpolate(entity: Entity, partialTicks: Float): Vec3d { + return Vec3d(entity.lastRenderX, entity.lastRenderY, entity.lastRenderZ).add(Vec3d((entity.x - entity.lastRenderX) * partialTicks, (entity.y - entity.lastRenderY) * partialTicks, (entity.z - entity.lastRenderZ) * partialTicks)) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/calculations/MoveUtil.kt b/src/main/kotlin/com/paragon/util/calculations/MoveUtil.kt new file mode 100644 index 0000000..89d8835 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/calculations/MoveUtil.kt @@ -0,0 +1,123 @@ +package com.paragon.util.calculations + +import com.paragon.util.mc +import net.minecraft.entity.effect.StatusEffects +import net.minecraft.util.math.BlockPos +import kotlin.math.cos +import kotlin.math.sin + + +/** + * @author aesthetical + * @since 02/17/23 + */ +object MoveUtil { + + val NULL_VELOCITY = doubleArrayOf(0.0, 0.0) + + /** + * Checks if the local player is inputting + * @return if they are moving/inputting + */ + @JvmStatic + fun moving(): Boolean { + return mc.player!!.input.movementForward != 0.0f || mc.player!!.input.movementSideways != 0.0f + } + + /** + * Calculates the base NCP speed based on player conditions + * @param potionFactor once the potion (speed/slowness) duration left is less than this, it'll stop applying the potion effect to the speed + * @return the base speed + */ + @JvmStatic + fun getBaseNcpSpeed(potionFactor: Int): Double { + var baseSpeed = 0.2783 + if (mc.player!!.hasStatusEffect(StatusEffects.SPEED)) { + val effect = mc.player!!.getStatusEffect(StatusEffects.SPEED) + if (effect!!.duration > potionFactor) { + baseSpeed *= 1.0 + 0.2 * (effect.amplifier + 1) + } + } + if (mc.player!!.hasStatusEffect(StatusEffects.SLOWNESS)) { + val effect = mc.player!!.getStatusEffect(StatusEffects.SLOWNESS) + if (effect!!.duration > potionFactor) { + baseSpeed /= 1.0 + 0.2 * (effect.amplifier + 1) + } + } + return baseSpeed + } + + /** + * Calculates the jump height needed based on potions + * @param jumpHeight the base jump height + * @return the jump height calculated + */ + @JvmStatic + fun getJumpHeight(jumpHeight: Double): Double { + var jumpHeight = jumpHeight + if (mc.player!!.hasStatusEffect(StatusEffects.JUMP_BOOST)) { + jumpHeight += (mc.player!!.getStatusEffect(StatusEffects.JUMP_BOOST)!!.amplifier + 1.0) * 0.1 + } + return jumpHeight + } + + @JvmStatic + private fun getJumpVelocityMultiplier(): Float { + val f: Float = mc.world!!.getBlockState(mc.player!!.blockPos).block.jumpVelocityMultiplier + val g: Float = mc.world!!.getBlockState(BlockPos(mc.player!!.pos.x, mc.player!!.boundingBox.minY - 0.5000001, mc.player!!.pos.z)).block.jumpVelocityMultiplier + return if (f.toDouble() == 1.0) g else f + } + + @JvmStatic + fun getVanillaJumpVelocity(): Float { + return 0.42f * getJumpVelocityMultiplier() + } + + /** + * Calculates movement strafe + * @param moveSpeed the speed to go + * @return the strafe x and z values + */ + @JvmStatic + fun strafe(moveSpeed: Double): DoubleArray { + if (mc.player == null) { + return NULL_VELOCITY + } + + var forward: Float = mc.player!!.input.movementForward + var strafe: Float = mc.player!!.input.movementSideways + var yaw: Float = mc.player!!.yaw + + if (forward != 0.0f) { + if (strafe > 0.0f) { + if (forward > 0.0f) { + yaw -= 45.0f + } else { + yaw += 45.0f + } + } else if (strafe < 0.0f) { + if (forward > 0.0f) { + yaw += 45.0f + } else { + yaw -= 45.0f + } + } + + strafe = 0.0f + + if (forward > 0.0f) { + forward = 1.0f + } else if (forward < 0.0f) { + forward = -1.0f + } + } + + val sin = -sin(Math.toRadians(yaw.toDouble())) + val cos = cos(Math.toRadians(yaw.toDouble())) + + return doubleArrayOf( + forward * moveSpeed * sin + strafe * moveSpeed * cos, + forward * moveSpeed * cos - strafe * moveSpeed * sin + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/calculations/Timer.kt b/src/main/kotlin/com/paragon/util/calculations/Timer.kt new file mode 100644 index 0000000..46fe4c1 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/calculations/Timer.kt @@ -0,0 +1,34 @@ +package com.paragon.util.calculations + +import java.util.function.Function + +/** + * @author surge + * @since 11/02/2023 + */ +class Timer { + + private var last: Long + + init { + last = System.currentTimeMillis() + } + + fun elapsed(delay: Double, format: Format = Format.MILLISECONDS): Boolean { + return timeMs() >= format.mutate(delay) + } + + fun reset() { + last = System.currentTimeMillis() + } + + fun timeMs(): Long { + return System.currentTimeMillis() - last + } + + enum class Format(val mutate: (Double) -> Double) { + MILLISECONDS({ it }), + SECONDS({ it * 1000 }) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/calculations/rotation/RotationUtil.kt b/src/main/kotlin/com/paragon/util/calculations/rotation/RotationUtil.kt new file mode 100644 index 0000000..336dc59 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/calculations/rotation/RotationUtil.kt @@ -0,0 +1,91 @@ +package com.paragon.util.calculations.rotation + +import com.paragon.util.mc +import net.minecraft.entity.LivingEntity +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Direction +import net.minecraft.util.math.MathHelper +import net.minecraft.util.math.Vec3d +import java.lang.Float.isNaN +import kotlin.math.abs +import kotlin.math.atan2 +import kotlin.math.hypot +import kotlin.math.sqrt + +/** + * @author aesthetical + * @since 02/17/23 + */ +object RotationUtil { + + /** + * Calculates rotations towards an entity + * @param entity the entity + * @param target the place to target the entity at + * @return the rotations to the entity + */ + @JvmStatic + fun calcToEntity(entity: LivingEntity, target: Target?): FloatArray { + val playerPos: Vec3d = mc.player!!.eyePos + val entityPos = entity.pos + + val eyes = when (target) { + Target.HEAD -> entityPos.add(0.0, entity.standingEyeHeight.toDouble(), 0.0) + Target.TORSO -> entityPos.add(0.0, (entity.height * 0.75), 0.0) + Target.LEGS -> entityPos.add(0.0, (entity.height * 0.45), 0.0) + else -> entityPos + } + + val deltaX = eyes.x - playerPos.x + val deltaZ = eyes.z - playerPos.z + + val yaw = -(atan2(deltaX, deltaZ) * (180.0 / Math.PI)).toFloat() + var pitch = (-Math.toDegrees(atan2(eyes.y - playerPos.y, hypot(deltaX, deltaZ)))).toFloat() + + if (pitch > 90.0f) { + pitch = 90.0f + } else if (pitch < -90.0f) { + pitch = -90.0f + } + + return floatArrayOf(yaw, pitch) + } + + /** + * Calculates angles to a block + * @param pos the position + * @param facing the direction of the block position + * @return the rotations to the block at the direction + */ + fun calcAngleToBlock(pos: BlockPos, facing: Direction): FloatArray { + val x: Double = pos.x + 0.5 - mc.player!!.x + facing.offsetX / 2.0 + val y = pos.y + 0.5 + val z: Double = pos.z + 0.5 - mc.player!!.z + facing.offsetZ / 2.0 + + val distance = sqrt(x * x + z * z) + var yaw = (atan2(z, x) * 180.0 / Math.PI - 90.0f).toFloat() + + var pitch = (atan2(mc.player!!.y + mc.player!!.standingEyeHeight - y, distance) * 180.0 / Math.PI).toFloat() + + if (yaw < 0.0f) { + yaw += 360.0f + } + + pitch = MathHelper.clamp(pitch, -90.0f, 90.0f) + + return floatArrayOf(yaw, pitch) + } + + /** + * Checks if a rotation provided is valid + * @param rots the rotations + * @return if they are valid or not + */ + fun isValid(rots: FloatArray?): Boolean { + if (rots == null || rots.size < 2) { + return false + } + + return !isNaN(rots[0]) && !isNaN(rots[1]) && abs(rots[1]) <= 90.0f + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/calculations/rotation/Target.kt b/src/main/kotlin/com/paragon/util/calculations/rotation/Target.kt new file mode 100644 index 0000000..cfea445 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/calculations/rotation/Target.kt @@ -0,0 +1,12 @@ +package com.paragon.util.calculations.rotation + +/** + * @author aesthetical + * @since 02/17/23 + */ +enum class Target { + HEAD, + TORSO, + LEGS, + FEET +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/inventory/InventoryUtil.kt b/src/main/kotlin/com/paragon/util/inventory/InventoryUtil.kt new file mode 100644 index 0000000..3ed4231 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/inventory/InventoryUtil.kt @@ -0,0 +1,78 @@ +package com.paragon.util.inventory + +import com.paragon.util.mc +import net.minecraft.item.BlockItem +import net.minecraft.item.Item +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NbtCompound +import net.minecraft.util.Hand + +/** + * @author aesthetical + * @since 02/18/23 + */ +object InventoryUtil { + + @JvmField val HOTBAR = 0..8 + + // fuck mojang + fun getStackName(stack: ItemStack): String { + val compound: NbtCompound? = stack.getSubNbt("display") + return if (compound == null || !compound.contains("Name")) "" else compound.getString("Name") + } + + fun hasStackIn(hand: Hand, items: Array): Boolean { + val itemStack = mc.player!!.getStackInHand(hand) + + for (item in items) { + if (!itemStack.isEmpty && itemStack.item == item) { + return true + } + } + + return false + } + + fun hasStackIn(hand: Hand, vararg items: Class<*>): Boolean { + val itemStack = mc.player!!.getStackInHand(hand) + + for (item in items) { + if (!itemStack.isEmpty && item.isInstance(itemStack.item)) { + return true + } + } + + return false + } + + fun holding(item: Item): Boolean { + return mc.player!!.isHolding(item) + } + + fun normalize(slot: Int): Int { + return if (slot < 9) slot + 36 else slot + } + + fun find(range: IntRange, condition: (ItemStack) -> Boolean): Int { + var slot: Int = mc.player!!.inventory.selectedSlot + var count = 0 + + if (condition(mc.player!!.inventory.getStack(slot))) { + count = mc.player!!.inventory.getStack(slot).count + } else { + slot = -1 + } + + for (i in range) { + val stack: ItemStack = mc.player!!.inventory.getStack(i) + + if (condition(stack) && stack.count > count) { + slot = i + count = stack.count + } + } + + return slot + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/io/FileUtil.kt b/src/main/kotlin/com/paragon/util/io/FileUtil.kt new file mode 100644 index 0000000..809c26d --- /dev/null +++ b/src/main/kotlin/com/paragon/util/io/FileUtil.kt @@ -0,0 +1,66 @@ +package com.paragon.util.io + +import com.paragon.util.mc +import java.io.File +import java.io.IOException +import java.io.InputStream +import java.nio.file.Files + +/** + * @author aesthetical + * @since 02/20/23 + */ +object FileUtil { + + val PARAGON_PATH = mc.runDirectory.resolve("paragon") + + fun delete(file: File): Boolean { + if (!file.exists()) { + return false + } + + return file.deleteRecursively() + } + + fun write(file: File, content: String) { + val outputStream = Files.newOutputStream(file.toPath()) + try { + outputStream.write(content.toByteArray(), 0, content.length) + } catch (e: IOException) { + e.printStackTrace() + } finally { + try { + outputStream.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + fun read(file: File): String? { + return read(Files.newInputStream(file.toPath())) + } + + fun read(stream: InputStream?): String? { + val builder = StringBuilder() + try { + var i: Int + while (stream!!.read().also { i = it } != -1) { + builder.append(i.toChar()) + } + } catch (e: IOException) { + return null + } finally { + if (stream != null) { + try { + stream.close() + } catch (e: IOException) { + return null + } + } + } + + return builder.toString() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/player/PlayerUtil.kt b/src/main/kotlin/com/paragon/util/player/PlayerUtil.kt new file mode 100644 index 0000000..911fbe0 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/player/PlayerUtil.kt @@ -0,0 +1,16 @@ +package com.paragon.util.player + +import com.paragon.util.mc +import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket +import net.minecraft.util.Hand + +/** + * @author aesthetical + * @since 02/20/23 + */ +object PlayerUtil { + fun silentSwing(hand: Hand) { + mc.player!!.networkHandler.sendPacket(HandSwingC2SPacket(hand)) + mc.player!!.swingHand(Hand.MAIN_HAND, false) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/rendering/ColorUtil.kt b/src/main/kotlin/com/paragon/util/rendering/ColorUtil.kt new file mode 100644 index 0000000..74703ed --- /dev/null +++ b/src/main/kotlin/com/paragon/util/rendering/ColorUtil.kt @@ -0,0 +1,27 @@ +package com.paragon.util.rendering + +import java.awt.Color +import kotlin.math.abs + +/** + * @author aesthetical, linustouchtips + * @since 02/17/23 + */ +object ColorUtil { + + /** + * Creates a color gradient with HSB by cycling through the brightness + * (Credit to cosmos) + * @param c the base color + * @param min the minimum brightness value + * @param delay the delay between switching + * @return a color (brightness) gradient + */ + fun gradientRainbow(c: Color, min: Float, delay: Int): Color { + val hsb = Color.RGBtoHSB(c.red, c.green, c.blue, null) + var brightness = abs(((System.currentTimeMillis() % 2000L).toFloat() / 1000.0f + 50.0f / delay.toFloat() * 2.0f) % 2.0f - 1.0f) + brightness = (min + (1.0f - min) * brightness) % 2.0f + return Color.getHSBColor(hsb[0], hsb[1], brightness) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/rendering/NVGWrapper.kt b/src/main/kotlin/com/paragon/util/rendering/NVGWrapper.kt new file mode 100644 index 0000000..5ccc7a2 --- /dev/null +++ b/src/main/kotlin/com/paragon/util/rendering/NVGWrapper.kt @@ -0,0 +1,204 @@ +package com.paragon.util.rendering + +import com.mojang.blaze3d.systems.RenderSystem +import net.minecraft.client.MinecraftClient +import org.lwjgl.BufferUtils +import org.lwjgl.nanovg.NVGColor +import org.lwjgl.nanovg.NanoVG +import org.lwjgl.nanovg.NanoVGGL3 +import org.lwjgl.opengl.GL11.GL_ONE +import org.lwjgl.opengl.GL11.GL_SRC_ALPHA +import org.lwjgl.system.MemoryUtil +import java.awt.Color +import java.awt.Rectangle +import java.nio.ByteBuffer +import java.nio.channels.Channels +import java.util.function.Consumer + +/** + * @author surge + * @since 11/02/2023 + */ +object NVGWrapper { + + private var vg: Long = 0 + + private val fontNames = arrayOf("inter", "axiforma") + + private val fonts = HashMap() + + @JvmStatic + fun initialise() { + vg = NanoVGGL3.nvgCreate(NanoVGGL3.NVG_ANTIALIAS) + + for (font in fontNames) { + try { + val buffer = getResourceBytes("font/$font.ttf", 1024) + NanoVG.nvgCreateFontMem(vg, font, buffer, 0) + fonts[font] = buffer + } catch (exception: Exception) { + exception.printStackTrace() + } + } + } + + private fun beginFrame() { + NanoVG.nvgBeginFrame( + vg, + MinecraftClient.getInstance().window.width.toFloat(), + MinecraftClient.getInstance().window.height.toFloat(), + 1f + ) + } + + private fun endFrame() { + NanoVG.nvgEndFrame(vg) + } + + fun quad(rectangle: Rectangle, colour: Color) { + quad(rectangle.x.toFloat(), rectangle.y.toFloat(), rectangle.width.toFloat(), rectangle.height.toFloat(), colour) + } + + fun quad(x: Float, y: Float, width: Float, height: Float, colour: Color) { + val colourised = convert(colour) + + NanoVG.nvgBeginPath(vg) + + NanoVG.nvgRect(vg, x, y, width, height) + NanoVG.nvgFillColor(vg, colourised) + NanoVG.nvgFill(vg) + + NanoVG.nvgClosePath(vg) + + colourised.free() + } + + fun roundedQuad(x: Float, y: Float, width: Float, height: Float, radius: Float, colour: Color) { + roundedQuad(x, y, width, height, radius, radius, radius, radius, colour) + } + + fun roundedQuad(x: Float, y: Float, width: Float, height: Float, tl: Float, tr: Float, bl: Float, br: Float, colour: Color) { + val colourised = convert(colour) + + NanoVG.nvgBeginPath(vg) + + NanoVG.nvgRoundedRectVarying(vg, x, y, width, height, tl, tr, bl, br) + NanoVG.nvgFillColor(vg, colourised) + NanoVG.nvgFill(vg) + + NanoVG.nvgClosePath(vg) + + colourised.free() + } + + fun text(text: String, x: Float, y: Float, colour: Color = Color.WHITE, face: String = "inter", size: Float = 16f, shadow: Boolean = false, alignment: Int = NanoVG.NVG_ALIGN_LEFT or NanoVG.NVG_ALIGN_TOP) { + if (shadow) { + text(text, x + 1, y + 1, Color(0, 0, 0, 150), face, size, false) + } + + val colourised = convert(colour) + + NanoVG.nvgBeginPath(vg) + + NanoVG.nvgFillColor(vg, colourised) + NanoVG.nvgFontFace(vg, face) + NanoVG.nvgFontSize(vg, size) + NanoVG.nvgTextAlign(vg, alignment) + NanoVG.nvgText(vg, x, y, text) + + NanoVG.nvgClosePath(vg) + + colourised.free() + } + + fun textWidth(text: String, face: String = "inter", size: Float = 20f): Float { + val bounds = FloatArray(4) + + NanoVG.nvgSave(vg) + + NanoVG.nvgFontFace(vg, face) + NanoVG.nvgFontSize(vg, size) + NanoVG.nvgTextBounds(vg, 0f, 0f, text, bounds) + + NanoVG.nvgRestore(vg) + + return bounds[2] + } + + fun textHeight(face: String, size: Float): Float { + val ascender = FloatArray(1) + val descender = FloatArray(1) + val height = FloatArray(1) + + NanoVG.nvgFontFace(vg, face) + NanoVG.nvgFontSize(vg, size) + NanoVG.nvgTextMetrics(vg, ascender, descender, height) + + return height[0] + } + + fun scissor(x: Float, y: Float, width: Float, height: Float, block: Runnable) { + NanoVG.nvgSave(vg) + NanoVG.nvgIntersectScissor(vg, x, y, width, height) + block.run() + NanoVG.nvgRestore(vg) + } + + fun resetScissor() { + NanoVG.nvgResetScissor(vg) + } + + fun terminate() { + NanoVGGL3.nvgDelete(vg) + } + + fun scope(block: Consumer) { + RenderSystem.enableBlend() + RenderSystem.blendFunc(GL_SRC_ALPHA, GL_ONE) + + beginFrame() + block.accept(this) + endFrame() + + RenderSystem.disableBlend() + } + + private fun convert(colour: Color): NVGColor { + return NVGColor.calloc() + .r(colour.red / 255f) + .g(colour.green / 255f) + .b(colour.blue / 255f) + .a(colour.alpha / 255f) + } + + private fun resizeBuffer(buffer: ByteBuffer, newCapacity: Int): ByteBuffer { + val newBuffer = BufferUtils.createByteBuffer(newCapacity) + buffer.flip() + newBuffer.put(buffer) + return newBuffer + } + + fun getResourceBytes(resource: String, bufferSize: Int): ByteBuffer { + var buffer: ByteBuffer + val source = javaClass.getResourceAsStream("/assets/paragon/$resource") + val rbc = Channels.newChannel(source) + + buffer = BufferUtils.createByteBuffer(bufferSize) + + while (true) { + val bytes = rbc.read(buffer) + + if (bytes == -1) { + break + } + + if (buffer.remaining() == 0) { + buffer = resizeBuffer(buffer, buffer.capacity() * 3 / 2) // 50% + } + } + + buffer.flip() + return MemoryUtil.memSlice(buffer) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/rendering/Renderer.kt b/src/main/kotlin/com/paragon/util/rendering/Renderer.kt new file mode 100644 index 0000000..6f586fd --- /dev/null +++ b/src/main/kotlin/com/paragon/util/rendering/Renderer.kt @@ -0,0 +1,251 @@ +package com.paragon.util.rendering + +import com.mojang.blaze3d.systems.RenderSystem +import com.paragon.backend.setting.Colour +import com.paragon.util.mc +import net.minecraft.client.render.* +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.util.math.Box +import net.minecraft.util.math.MathHelper +import net.minecraft.util.math.Vec3d +import org.joml.Matrix4f +import org.lwjgl.opengl.GL11.* +import java.util.function.Consumer +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin + + +/** + * @author surge + * @since 12/02/2023 + */ +object Renderer { + + private val actions: MutableList = ArrayList() + + fun submit(action: Action): Renderer { + actions.add(action) + + return this + } + + fun submit(action: () -> Unit): Renderer { + actions.add(object : Action() { + override fun draw() { + action() + } + }) + + return this + } + + fun optional(submit: Boolean, action: Action): Renderer { + if (submit) { + submit(action) + } + + return this + } + + @JvmStatic + fun drawAndClear() { + actions.forEach(Consumer { obj: Action -> obj.draw() }) + actions.clear() + } + + fun line(matrices: MatrixStack, start: Vec3d, end: Vec3d, lineWidth: Float, colour: Colour, secondary: Colour = colour): Action { + return object : Action() { + override fun draw() { + lineImplementation(matrices, start, end, lineWidth, colour, secondary) + } + } + } + + fun box(matrices: MatrixStack, bb: Box, colour: Colour, mode: DrawMode) { + submit { + boxImplementation(matrices, bb, colour, mode) + } + } + + fun polygon(matrices: MatrixStack, center: Vec3d, radius: Double, colour: Colour, mode: DrawMode, sides: Int, outsideOffset: Double = 0.0) { + submit { + polygonImplementation(matrices, center, radius, colour, mode, sides, outsideOffset) + } + } + + private fun filledBBVertices(matrix: Matrix4f, builder: BufferBuilder, box: Box, colour: Colour) { + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.red / 255f, colour.green / 255f, colour.blue / 255f, colour.alpha / 255f).next() + } + + private fun outlineBBVertices(matrix: Matrix4f, builder: BufferBuilder, box: Box, colour: Colour) { + // the most comedic rendering + + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.minZ.toFloat()).color(0).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(0).next() + builder.vertex(matrix, box.maxX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(0).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(0).next() + builder.vertex(matrix, box.maxX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.minX.toFloat(), box.minY.toFloat(), box.maxZ.toFloat()).color(0).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(0).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.maxZ.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, box.minX.toFloat(), box.maxY.toFloat(), box.minZ.toFloat()).color(colour.rgb).next() + } + + private fun lineImplementation(matrices: MatrixStack, start: Vec3d, end: Vec3d, lineWidth: Float, colour: Colour, secondary: Colour) { + val camera: Vec3d = mc.gameRenderer.camera.pos + + val vecStart: Vec3d = start.subtract(camera) + val vecEnd: Vec3d = end.subtract(camera) + + val matrix: Matrix4f = matrices.peek().positionMatrix + val builder: BufferBuilder = Tessellator.getInstance().buffer + + RenderSystem.setShader { GameRenderer.getPositionColorProgram() } + RenderSystem.lineWidth(lineWidth) + RenderSystem.enableBlend() + RenderSystem.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + + builder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR) + + builder.vertex(matrix, vecStart.x.toFloat(), vecStart.y.toFloat(), vecStart.z.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, vecEnd.x.toFloat(), vecEnd.y.toFloat(), vecEnd.z.toFloat()).color(secondary.rgb).next() + + BufferRenderer.drawWithGlobalProgram(builder.end()) + } + + private fun boxImplementation(matrices: MatrixStack, bb: Box, colour: Colour, mode: DrawMode) { + val matrix: Matrix4f = matrices.peek().positionMatrix + val builder: BufferBuilder = Tessellator.getInstance().buffer + val cameraPos = mc.gameRenderer.camera.pos + val box = bb.offset(-cameraPos.x, -cameraPos.y, -cameraPos.z) + + RenderSystem.depthFunc(GL_ALWAYS) + RenderSystem.enableBlend() + RenderSystem.setShader { GameRenderer.getPositionColorProgram() } + + builder.begin(mode.mode, VertexFormats.POSITION_COLOR) + + mode.vertices(matrix, builder, box, colour) + + BufferRenderer.drawWithGlobalProgram(builder.end()) + + RenderSystem.disableBlend() + RenderSystem.depthFunc(GL_LEQUAL) + } + + private fun polygonImplementation(matrices: MatrixStack, center: Vec3d, radius: Double, colour: Colour, mode: DrawMode, sides: Int, outsideOffset: Double = 0.0) { + val matrix: Matrix4f = matrices.peek().positionMatrix + val builder: BufferBuilder = Tessellator.getInstance().buffer + val cameraPos = mc.gameRenderer.camera.pos + val center = Vec3d(center.x - cameraPos.x, center.y - cameraPos.y, center.z - cameraPos.z) + + RenderSystem.setShader { GameRenderer.getPositionColorProgram() } + + RenderSystem.disableCull() + RenderSystem.depthFunc(GL_ALWAYS) + RenderSystem.enableBlend() + + builder.begin(mode.mode, VertexFormats.POSITION_COLOR) + + val angleIncrement = 2.0 * PI / sides + var angle = 0.0 + + /* for (i in 0 until sides) { + builder.vertex(matrix, (center.x + radius * cos(angle)).toFloat(), center.y.toFloat(), (center.z + radius * sin(angle)).toFloat()).color(colour.rgb).next() + + if (mode == DrawMode.FILL) { + builder.vertex(matrix, center.x.toFloat(), center.y.toFloat(), center.z.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, (center.x + radius * cos(angle + angleIncrement)).toFloat(), center.y.toFloat(), (center.z + radius * sin(angle + angleIncrement)).toFloat()).color(colour.rgb).next() + builder.vertex(matrix, (center.x + radius * cos(angle)).toFloat(), center.y.toFloat(), (center.z + radius * sin(angle)).toFloat()).color(colour.rgb).next() + } + + angle += angleIncrement + } */ + + for (i in 0 until sides) { + builder.vertex(matrix, (center.x + radius * cos(angle)).toFloat(), center.y.toFloat() + outsideOffset.toFloat(), (center.z + radius * sin(angle)).toFloat()).color(colour.rgb).next() + + if (mode == DrawMode.FILL) { + builder.vertex(matrix, center.x.toFloat(), center.y.toFloat(), center.z.toFloat()).color(colour.rgb).next() + builder.vertex(matrix, (center.x + radius * cos(angle + angleIncrement)).toFloat(), center.y.toFloat() + outsideOffset.toFloat(), (center.z + radius * sin(angle + angleIncrement)).toFloat()).color(colour.rgb).next() + builder.vertex(matrix, (center.x + radius * cos(angle)).toFloat(), center.y.toFloat() + outsideOffset.toFloat(), (center.z + radius * sin(angle)).toFloat()).color(colour.rgb).next() + } + + angle += angleIncrement + } + + // Add final vertex to close the polygon + builder.vertex(matrix, (center.x + radius).toFloat(), center.y.toFloat() + outsideOffset.toFloat(), center.z.toFloat()).color(colour.rgb).next() + + BufferRenderer.drawWithGlobalProgram(builder.end()) + + RenderSystem.disableBlend() + RenderSystem.depthFunc(GL_LEQUAL) + RenderSystem.enableCull() + } + + fun crosshair(): Vec3d { + val camera: Camera = mc.gameRenderer.camera + + val yawRadius = Math.toRadians(-camera.yaw.toDouble()).toFloat() + val pitchRadius = Math.toRadians(-camera.pitch.toDouble()).toFloat() + val pitch: Float = -MathHelper.cos(pitchRadius) + + return Vec3d( + (MathHelper.sin((yawRadius - Math.PI).toFloat()) * pitch).toDouble(), + MathHelper.sin(pitchRadius).toDouble(), + (MathHelper.cos((yawRadius - Math.PI).toFloat()) * pitch).toDouble() + ).add(camera.pos) + } + + abstract class Action { + abstract fun draw() + } + + enum class DrawMode(val mode: VertexFormat.DrawMode, val vertices: (Matrix4f, BufferBuilder, Box, Colour) -> Unit) { + FILL(VertexFormat.DrawMode.QUADS, { matrix, builder, box, colour -> filledBBVertices(matrix, builder, box, colour) }), + LINES(VertexFormat.DrawMode.DEBUG_LINE_STRIP, { matrix, builder, box, colour -> outlineBBVertices(matrix, builder, box, colour) }) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/paragon/util/rendering/ui/Element.kt b/src/main/kotlin/com/paragon/util/rendering/ui/Element.kt new file mode 100644 index 0000000..d8e56aa --- /dev/null +++ b/src/main/kotlin/com/paragon/util/rendering/ui/Element.kt @@ -0,0 +1,50 @@ +package com.paragon.util.rendering.ui + +import com.paragon.backend.setting.Colour +import com.paragon.util.rendering.NVGWrapper + +/** + * @author surge + * @since 11/02/2023 + */ +abstract class Element(var x: Float = 0.0f, var y: Float = 0.0f, var width: Float = 0.0f, var height: Float = 0.0f) { + + abstract fun render(nvg: NVGWrapper, mouseX: Int, mouseY: Int, mouseDelta: Float) + + open fun mouseClick(mouseX: Int, mouseY: Int, button: Int): Boolean { + return false + } + + open fun mouseRelease(mouseX: Int, mouseY: Int, button: Int): Boolean { + return false + } + + open fun scroll(mouseX: Int, mouseY: Int, amount: Double): Boolean { + return false + } + + open fun keyTyped(keyCode: Int, scanCode: Int, modifiers: Int) {} + open fun charTyped(char: Char, modifiers: Int) {} + + open fun getOffset(): Float { + return height + } + + fun position(x: Float, y: Float): Element { + this.x = x + this.y = y + return this + } + + fun hovered(mouseX: Int, mouseY: Int): Boolean { + return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height + } + + fun hovered(mouseX: Int, mouseY: Int, w: Float = this.width, h: Float = this.height): Boolean { + return mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h + } + + protected val background = Colour(23, 23, 23, 255) + protected val hovered = Colour(26, 26, 26, 255) + +} \ No newline at end of file diff --git a/src/main/resources/assets/paragon/font/axiforma.ttf b/src/main/resources/assets/paragon/font/axiforma.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33267a1da0b5815db5726d4d7f612ed5859674ef GIT binary patch literal 128116 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/paragon/font/inter.ttf b/src/main/resources/assets/paragon/font/inter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8d4eebf20665d5ae746c622a2bd42274b54d2bf1 GIT binary patch literal 309828 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

    V7T@aTyAqtk8R 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

    NU^a~Y-YT{n`0xQzR2cZRm6M*N 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 JPDHLkV1h<27%Bh& literal 0 HcmV?d00001 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..3c17a5c --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,37 @@ +{ + "schemaVersion": 1, + "id": "paragon", + "version": "${version}", + + "name": "Paragon", + "description": "utility mod for minecraft 1.19", + "authors": [ + "surge", + "aesthetical", + "kassuk" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + + "license": "CC0-1.0", + "icon": "assets/paragon/textures/icon.png", + "accessWidener": "paragon.accesswidener", + + "environment": "client", + "entrypoints": { + "client": [ + "com.paragon.Paragon" + ] + }, + "mixins": [ + "paragon.mixins.json" + ], + + "depends": { + "fabricloader": ">=0.14.11", + "minecraft": "~1.19.3", + "java": ">=17" + } +} diff --git a/src/main/resources/paragon.accesswidener b/src/main/resources/paragon.accesswidener new file mode 100644 index 0000000..64fecde --- /dev/null +++ b/src/main/resources/paragon.accesswidener @@ -0,0 +1,6 @@ +accessWidener v1 named + +# PlayerInteractEntityC2SPacket I LOVE MOJANG!!!!! +accessible class net/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractType +accessible class net/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractAtHandler +accessible class net/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractTypeHandler \ No newline at end of file diff --git a/src/main/resources/paragon.mixins.json b/src/main/resources/paragon.mixins.json new file mode 100644 index 0000000..df95a53 --- /dev/null +++ b/src/main/resources/paragon.mixins.json @@ -0,0 +1,36 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.paragon.mixin.mixins", + "compatibilityLevel": "JAVA_17", + "client": [ + "MinecraftClientMixin", + "entity.MixinClientPlayerEntity", + "entity.MixinLivingEntity", + "input.MixinClientPlayerInteractionManager", + "input.MixinItemUsageContext", + "input.io.KeyboardMixin", + "input.io.MouseMixin", + "item.TridentItemMixin", + "math.MixinVec3d", + "net.MixinClientConnection", + "net.packet.c2s.IPlayerMoveC2SPacket", + "net.packet.c2s.MixinPlayerInteractEntityC2SPacket", + "net.packet.s2c.IEntityVelocityUpdateS2CPacket", + "net.packet.s2c.IExplosionS2CPacket", + "render.GameRendererMixin", + "render.MixinCamera", + "render.MixinLightmapTextureManager", + "render.MixinRenderTickCounter", + "render.WindowMixin", + "render.entity.MixinLivingEntityRenderer", + "render.entity.MixinPlayerEntityRenderer", + "render.gui.MixinInGameHud", + "render.gui.TitleScreenMixin", + "world.block.MixinAbstractBlockState", + "world.block.MixinBlock" + ], + "injectors": { + "defaultRequire": 1 + } +}