From 2677105788ea93c1d673465ca946953d856ebd23 Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 11:44:27 +0200 Subject: [PATCH 01/42] clean up build script a bit --- build.gradle | 96 +++++++++++++----------- gradle/wrapper/gradle-wrapper.properties | 5 +- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/build.gradle b/build.gradle index 2feba22..fc2599e 100644 --- a/build.gradle +++ b/build.gradle @@ -18,72 +18,84 @@ buildscript { repositories { jcenter() maven { - name = "forge" + name = "MinecraftForge" url = "http://files.minecraftforge.net/maven" } maven { - name = 'SpongePowered' - url = 'http://repo.spongepowered.org/maven' + name = "SpongePowered" + url = "http://repo.spongepowered.org/maven" } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT' - classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4' + classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT" + classpath "org.spongepowered:mixingradle:0.4-SNAPSHOT" + classpath "com.github.jengelman.gradle.plugins:shadow:1.2.4" } } apply plugin: "net.minecraftforge.gradle.forge" -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'com.github.johnrengelman.shadow' +apply plugin: "org.spongepowered.mixin" +apply plugin: "com.github.johnrengelman.shadow" + +ext { + //general things + javaVersion = "1.8" + pepsimodVersion = "1.11" + + //minecraft things + mcpmappingsVersion = "stable_39" + minecraftforgeVersion = "14.23.5.2836" + minecraftVersion = "1.12.2" + + //dependency things + guavaVersion = "21.0" + mixinVersion = "0.7.11-SNAPSHOT" + porklibVersion = "0.3.0-SNAPSHOT" +} -group = "net.daporkchop" -archivesBaseName = "pepsimod" +group "net.daporkchop" +version "v$pepsimodVersion-$minecraftVersion" -sourceCompatibility = targetCompatibility = '1.8' -compileJava { - sourceCompatibility = targetCompatibility = '1.8' -} +archivesBaseName = "pepsimod" +sourceCompatibility = targetCompatibility = "$javaVersion" configurations.all { resolutionStrategy { - force("com.google.guava:guava:21.0") + force("com.google.guava:guava:$guavaVersion") } } minecraft { - version = "1.12.2-14.23.5.2836" + version = "$minecraftVersion-$minecraftforgeVersion" runDir = "run" - mappings = "stable_39" + mappings = "$mcpmappingsVersion" makeObfSourceJar = false coreMod = "net.daporkchop.pepsimod.PepsimodMixinLoader" } -version = "v11.1-" + project.minecraft.version - repositories { mavenLocal() maven { - name = 'DaPorkchop_' - url = 'https://maven.daporkchop.net/' + name = "DaPorkchop_" + url = "https://maven.daporkchop.net/" } maven { - name = 'spongepowered-repo' - url = 'http://repo.spongepowered.org/maven/' + name = "spongepowered-repo" + url = "http://repo.spongepowered.org/maven/" } mavenCentral() } dependencies { - compile("org.spongepowered:mixin:0.7.11-SNAPSHOT") { - exclude module: 'launchwrapper' - exclude module: 'guava' - exclude module: 'gson' - exclude module: 'commons-io' - exclude module: 'log4j-core' + compile("org.spongepowered:mixin:$mixinVersion") { + exclude module: "launchwrapper" + exclude module: "guava" + exclude module: "gson" + exclude module: "commons-io" + exclude module: "log4j-core" } - compile "net.daporkchop.lib:common:0.3.0-SNAPSHOT" + compile "net.daporkchop.lib:common:$porklibVersion" } processResources { @@ -96,7 +108,7 @@ processResources { from(sourceSets.main.resources.srcDirs) { exclude "mcmod.info" } - rename '(.+_at.cfg)', 'META-INF/$1' + rename '(.+_at.cfg)', 'META-INF/$1' //i hate gradle for not letting me use double quotes here } mixin { @@ -106,20 +118,20 @@ mixin { reobf { shadowJar { - mappingType = 'SEARGE' + mappingType = "SEARGE" classpath = sourceSets.main.compileClasspath } } shadowJar { dependencies { - include(dependency('org.spongepowered:mixin')) + dependency("org.spongepowered:mixin") - include(dependency('net.daporkchop.lib:unsafe')) - include(dependency('net.daporkchop.lib:common')) + dependency("net.daporkchop.lib:unsafe") + dependency("net.daporkchop.lib:common") } - exclude 'dummyThing' - exclude 'LICENSE.txt' + exclude "dummyThing" + exclude "LICENSE.txt" classifier = null } @@ -128,12 +140,12 @@ build.dependsOn(shadowJar) jar { manifest { attributes( - "MixinConfigs": 'mixins.pepsimod.json', - "tweakClass": 'org.spongepowered.asm.launch.MixinTweaker', + "MixinConfigs": "mixins.pepsimod.json", + "tweakClass": "org.spongepowered.asm.launch.MixinTweaker", "TweakOrder": 0, - 'FMLCorePluginContainsFMLMod': 'true', - 'FMLCorePlugin': 'net.daporkchop.pepsimod.PepsimodMixinLoader', - 'ForceLoadAsMod': 'true' + "FMLCorePluginContainsFMLMod": "true", + "FMLCorePlugin": "net.daporkchop.pepsimod.PepsimodMixinLoader", + "ForceLoadAsMod": "true" ) } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e81ea2..6e2b9ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ # # Adapted from the Wizardry License # -# Copyright (c) 2017-2018 DaPorkchop_ +# Copyright (c) 2017-2019 DaPorkchop_ # # Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. # Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. @@ -13,9 +13,8 @@ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # -#Sat May 20 01:25:38 BST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip From 8e936ec3ebd41aa019274b5a29ed876c0e2305db Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 11:52:55 +0200 Subject: [PATCH 02/42] don't use shadow plugin for no reason --- build.gradle | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/build.gradle b/build.gradle index fc2599e..3a1c5bb 100644 --- a/build.gradle +++ b/build.gradle @@ -29,13 +29,11 @@ buildscript { dependencies { classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT" classpath "org.spongepowered:mixingradle:0.4-SNAPSHOT" - classpath "com.github.jengelman.gradle.plugins:shadow:1.2.4" } } apply plugin: "net.minecraftforge.gradle.forge" apply plugin: "org.spongepowered.mixin" -apply plugin: "com.github.johnrengelman.shadow" ext { //general things @@ -59,9 +57,12 @@ version "v$pepsimodVersion-$minecraftVersion" archivesBaseName = "pepsimod" sourceCompatibility = targetCompatibility = "$javaVersion" -configurations.all { - resolutionStrategy { - force("com.google.guava:guava:$guavaVersion") +configurations { + shade + all { + resolutionStrategy { + force("com.google.guava:guava:$guavaVersion") + } } } @@ -87,7 +88,7 @@ repositories { } dependencies { - compile("org.spongepowered:mixin:$mixinVersion") { + shade("org.spongepowered:mixin:$mixinVersion") { exclude module: "launchwrapper" exclude module: "guava" exclude module: "gson" @@ -95,7 +96,9 @@ dependencies { exclude module: "log4j-core" } - compile "net.daporkchop.lib:common:$porklibVersion" + shade "net.daporkchop.lib:common:$porklibVersion" + + compile configurations.shade.dependencies } processResources { @@ -116,28 +119,16 @@ mixin { add sourceSets.main, "mixins.pepsimod.refmap.json" } -reobf { - shadowJar { - mappingType = "SEARGE" - classpath = sourceSets.main.compileClasspath - } -} - -shadowJar { - dependencies { - dependency("org.spongepowered:mixin") - - dependency("net.daporkchop.lib:unsafe") - dependency("net.daporkchop.lib:common") - } - exclude "dummyThing" - exclude "LICENSE.txt" - classifier = null -} - -build.dependsOn(shadowJar) - jar { + from { + configurations.shade.collect { + zipTree(it) + } + } { + exclude "META-INF/*.SF" + exclude "META-INF/*.DSA" + exclude "META-INF/*.RSA" + } manifest { attributes( "MixinConfigs": "mixins.pepsimod.json", From c83d61d509e76bd8baa37558febf8354abdaccd7 Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 12:32:01 +0200 Subject: [PATCH 03/42] nuke basically everything --- build.gradle | 11 +- .../net/daporkchop/pepsimod/Pepsimod.java | 266 +------- .../pepsimod/command/BaseCommand.java | 35 - .../pepsimod/command/CommandRegistry.java | 103 --- .../pepsimod/command/api/Command.java | 40 -- .../pepsimod/command/impl/GoToCommand.java | 39 -- .../pepsimod/command/impl/HelpCommand.java | 41 -- .../pepsimod/command/impl/InvSeeCommand.java | 84 --- .../pepsimod/command/impl/ListCommand.java | 41 -- .../pepsimod/command/impl/PeekCommand.java | 119 ---- .../pepsimod/command/impl/ReloadCommand.java | 45 -- .../pepsimod/command/impl/SaveCommand.java | 36 - .../pepsimod/command/impl/SetRotCommand.java | 53 -- .../command/impl/SortModulesCommand.java | 80 --- .../pepsimod/command/impl/ToggleCommand.java | 67 -- .../pepsimod/event/GuiRenderHandler.java | 59 -- .../pepsimod/event/MiscEventHandler.java | 39 -- .../pepsimod/gui/clickgui/ClickGUI.java | 124 ---- .../pepsimod/gui/clickgui/Window.java | 324 --------- .../gui/clickgui/api/EntryImplBase.java | 47 -- .../pepsimod/gui/clickgui/api/IEntry.java | 51 -- .../pepsimod/gui/clickgui/entry/Button.java | 120 ---- .../gui/clickgui/entry/SubButton.java | 108 --- .../gui/clickgui/entry/SubSlider.java | 179 ----- .../gui/clickgui/window/WindowCombat.java | 27 - .../gui/clickgui/window/WindowMisc.java | 27 - .../gui/clickgui/window/WindowMovement.java | 27 - .../gui/clickgui/window/WindowPlayer.java | 27 - .../gui/clickgui/window/WindowRender.java | 27 - .../gui/mcleaks/GuiButtonMCLeaks.java | 59 -- .../gui/mcleaks/GuiScreenMCLeaks.java | 147 ----- .../gui/misc/GuiButtonTooBeeTooTee.java | 59 -- .../daporkchop/pepsimod/key/KeyRegistry.java | 33 - .../daporkchop/pepsimod/misc/TickRate.java | 76 --- .../pepsimod/misc/data/DataLoader.java | 255 -------- .../daporkchop/pepsimod/misc/data/Group.java | 81 --- .../daporkchop/pepsimod/misc/data/Groups.java | 57 -- .../pepsimod/misc/data/MainMenu.java | 60 -- .../pepsimod/mixin/block/MixinBlock.java | 92 --- .../mixin/block/MixinBlockLiquid.java | 65 -- .../pepsimod/mixin/block/MixinBlockSlab.java | 49 -- .../mixin/block/MixinBlockSoulSand.java | 42 -- .../pepsimod/mixin/client/MixinMinecraft.java | 229 ------- .../entity/MixinAbstractClientPlayer.java | 54 -- .../client/entity/MixinEntityPlayerSP.java | 127 ---- .../mixin/client/gui/MixinGuiBossOverlay.java | 109 ---- .../mixin/client/gui/MixinGuiChat.java | 76 --- .../mixin/client/gui/MixinGuiConnecting.java | 36 - .../client/gui/MixinGuiDisconnected.java | 88 --- .../mixin/client/gui/MixinGuiIngame.java | 52 -- .../mixin/client/gui/MixinGuiIngameMenu.java | 42 -- .../mixin/client/gui/MixinGuiMainMenu.java | 154 ----- .../mixin/client/gui/MixinGuiMultiplayer.java | 61 -- .../client/gui/MixinGuiPlayerTabOverlay.java | 149 ----- .../client/multiplayer/MixinWorldClient.java | 43 -- .../network/MixinNetHandlerLoginClient.java | 50 -- .../network/MixinNetHandlerPlayClient.java | 68 -- .../renderer/MixinBlockFluidRenderer.java | 47 -- .../renderer/MixinBlockModelRenderer.java | 63 -- .../client/renderer/MixinEntityRenderer.java | 196 ------ .../client/renderer/MixinItemRenderer.java | 49 -- .../client/renderer/chunk/MixinVisGraph.java | 41 -- .../client/renderer/entity/MixinRender.java | 118 ---- .../mixin/client/resources/MixinLocale.java | 48 -- .../client/settings/MixinGameSettings.java | 37 -- .../client/settings/MixinKeyBinding.java | 62 -- .../pepsimod/mixin/entity/MixinEntity.java | 132 ---- .../mixin/entity/MixinEntityAgeable.java | 38 -- .../mixin/entity/MixinEntityLivingBase.java | 87 --- .../entity/passive/MixinAbstractHorse.java | 46 -- .../mixin/entity/passive/MixinEntityPig.java | 101 --- .../pepsimod/mixin/item/MixinItemStack.java | 53 -- .../mixin/network/MixinNetworkManager.java | 97 --- .../play/client/MixinCPacketPlayer.java | 51 -- .../mixin/scoreboard/MixinScoreboard.java | 50 -- .../util/MixinMovementInputFromOptions.java | 61 -- .../mixin/util/MixinTabCompleter.java | 51 -- .../pepsimod/mixin/util/MixinTimer.java | 56 -- .../text/translation/MixinLanguageMap.java | 45 -- .../pepsimod/mixin/world/MixinWorld.java | 52 -- .../mixin/world/storage/MixinWorldInfo.java | 39 -- .../pepsimod/module/ModuleCategory.java | 27 - .../pepsimod/module/ModuleManager.java | 224 ------- .../pepsimod/module/api/Module.java | 403 ------------ .../module/api/ModuleLaunchState.java | 23 - .../pepsimod/module/api/ModuleOption.java | 80 --- .../pepsimod/module/api/ModuleSortType.java | 28 - .../module/api/OptionCompletions.java | 27 - .../pepsimod/module/api/TimeModule.java | 42 -- .../module/api/option/ExtensionBoolean.java | 24 - .../module/api/option/ExtensionMulti.java | 26 - .../module/api/option/ExtensionSlider.java | 34 - .../module/api/option/ExtensionType.java | 25 - .../module/api/option/OptionExtended.java | 21 - .../pepsimod/module/impl/BasicMod.java | 63 -- .../pepsimod/module/impl/combat/AuraMod.java | 316 --------- .../module/impl/combat/AutoArmorMod.java | 101 --- .../module/impl/combat/AutoTotemMod.java | 105 --- .../module/impl/combat/BedBomberMod.java | 175 ----- .../module/impl/combat/BowAimBotMod.java | 150 ----- .../module/impl/combat/CriticalsMod.java | 124 ---- .../module/impl/combat/CrystalAuraMod.java | 110 ---- .../module/impl/misc/AnnouncerMod.java | 262 -------- .../module/impl/misc/AntiHungerMod.java | 63 -- .../module/impl/misc/AutoFishMod.java | 179 ----- .../module/impl/misc/AutoToolMod.java | 100 --- .../module/impl/misc/ClickGuiMod.java | 81 --- .../pepsimod/module/impl/misc/FreecamMod.java | 137 ---- .../pepsimod/module/impl/misc/HUDMod.java | 370 ----------- .../pepsimod/module/impl/misc/NoFallMod.java | 64 -- .../module/impl/misc/NotificationsMod.java | 158 ----- .../pepsimod/module/impl/misc/TimerMod.java | 110 ---- .../module/impl/movement/AutoRespawnMod.java | 61 -- .../module/impl/movement/AutoWalkMod.java | 72 -- .../module/impl/movement/BoatFlyMod.java | 66 -- .../module/impl/movement/ElytraFlyMod.java | 223 ------- .../module/impl/movement/EntitySpeedMod.java | 219 ------- .../module/impl/movement/FlightMod.java | 74 --- .../impl/movement/HorseJumpPowerMod.java | 63 -- .../impl/movement/InventoryMoveMod.java | 63 -- .../module/impl/movement/JesusMod.java | 233 ------- .../module/impl/movement/NoClipMod.java | 82 --- .../module/impl/movement/NoSlowdownMod.java | 73 --- .../module/impl/movement/SafewalkMod.java | 123 ---- .../module/impl/movement/SpeedMod.java | 62 -- .../module/impl/movement/StepMod.java | 156 ----- .../module/impl/movement/VelocityMod.java | 92 --- .../module/impl/player/AntiAFKMod.java | 260 -------- .../module/impl/player/AutoEatMod.java | 147 ----- .../module/impl/player/AutoMineMod.java | 91 --- .../module/impl/player/FastPlaceMod.java | 63 -- .../module/impl/player/ScaffoldMod.java | 109 ---- .../module/impl/player/SpeedmineMod.java | 83 --- .../module/impl/player/SprintMod.java | 65 -- .../module/impl/render/AntiBlindMod.java | 62 -- .../module/impl/render/AntiInvisibleMod.java | 62 -- .../impl/render/AntiTotemAnimationMod.java | 62 -- .../pepsimod/module/impl/render/ESPMod.java | 171 ----- .../module/impl/render/FullbrightMod.java | 82 --- .../module/impl/render/HealthTagsMod.java | 62 -- .../module/impl/render/NameTagsMod.java | 70 -- .../module/impl/render/NoHurtCamMod.java | 62 -- .../module/impl/render/NoOverlayMod.java | 62 -- .../module/impl/render/NoWeatherMod.java | 95 --- .../module/impl/render/StorageESPMod.java | 205 ------ .../module/impl/render/TracersMod.java | 233 ------- .../module/impl/render/TrajectoriesMod.java | 199 ------ .../module/impl/render/UnfocusedCPUMod.java | 87 --- .../pepsimod/module/impl/render/XrayMod.java | 203 ------ .../pepsimod/module/impl/render/ZoomMod.java | 88 --- .../pepsimod/optimization/BlockID.java | 50 -- .../optimization/OverrideCounter.java | 32 - .../pepsimod/optimization/SizeSettable.java | 24 - .../the/wurst/pkg/name/BlockUtils.java | 552 ---------------- .../the/wurst/pkg/name/EntityUtils.java | 324 --------- .../the/wurst/pkg/name/RenderUtils.java | 177 ----- .../the/wurst/pkg/name/RotationUtils.java | 230 ------- .../pepsimod/the/wurst/pkg/name/WBlock.java | 58 -- .../pepsimod/the/wurst/pkg/name/WPlayer.java | 58 -- .../the/wurst/pkg/name/WPlayerController.java | 57 -- .../the/wurst/pkg/name/package-info.java | 399 ------------ .../pepsimod/util/AccountManager.java | 109 ---- .../pepsimod/util/BetterScaledResolution.java | 57 -- .../pepsimod/util/BossinfoCounted.java | 27 - .../pepsimod/util/EntityFakePlayer.java | 52 -- .../daporkchop/pepsimod/util/HTTPUtils.java | 249 ------- .../net/daporkchop/pepsimod/util/MCLeaks.java | 119 ---- .../pepsimod/util/PepsiConstants.java | 6 +- .../daporkchop/pepsimod/util/PepsiUtils.java | 613 ------------------ .../pepsimod/util/ReflectionStuff.java | 612 ----------------- .../daporkchop/pepsimod/util/RenderColor.java | 53 -- .../pepsimod/util/colors/ColorUtils.java | 50 -- .../util/colors/ColorizedElement.java | 22 - .../pepsimod/util/colors/ColorizedText.java | 28 - .../util/colors/FixedColorElement.java | 29 - .../pepsimod/util/colors/GradientText.java | 61 -- .../util/colors/PlainColorElement.java | 26 - .../util/colors/rainbow/ColorChangeType.java | 23 - .../util/colors/rainbow/RainbowCycle.java | 35 - .../util/colors/rainbow/RainbowText.java | 94 --- .../util/config/BaseImplTranslator.java | 39 -- .../pepsimod/util/config/Config.java | 118 ---- .../util/config/IConfigTranslator.java | 128 ---- .../util/config/NullConfigTranslator.java | 42 -- .../util/config/impl/AnnouncerTranslator.java | 62 -- .../util/config/impl/AntiAFKTranslator.java | 61 -- .../util/config/impl/AutoEatTranslator.java | 41 -- .../util/config/impl/BedBomberTranslator.java | 47 -- .../util/config/impl/ClickGUITranslator.java | 59 -- .../util/config/impl/CpuLimitTranslator.java | 41 -- .../util/config/impl/CriticalsTranslator.java | 41 -- .../config/impl/CrystalAuraTranslator.java | 44 -- .../util/config/impl/ESPTranslator.java | 77 --- .../util/config/impl/ElytraFlyTranslator.java | 62 -- .../config/impl/EntitySpeedTranslator.java | 43 -- .../util/config/impl/FlightTranslator.java | 41 -- .../util/config/impl/FreecamTranslator.java | 41 -- .../util/config/impl/FriendsTranslator.java | 70 -- .../util/config/impl/GeneralTranslator.java | 84 --- .../util/config/impl/HUDTranslator.java | 113 ---- .../util/config/impl/NameTagsTranslator.java | 42 -- .../util/config/impl/NoWeatherTranslator.java | 47 -- .../config/impl/NotificationsTranslator.java | 50 -- .../util/config/impl/SpeedmineTranslator.java | 41 -- .../util/config/impl/StepTranslator.java | 44 -- .../config/impl/TargettingTranslator.java | 96 --- .../util/config/impl/TimerTranslator.java | 44 -- .../util/config/impl/TracersTranslator.java | 67 -- .../util/config/impl/VelocityTranslator.java | 41 -- .../util/config/impl/XrayTranslator.java | 72 -- .../pepsimod/util/event/MoveEvent.java | 23 - .../pepsimod/util/misc/ITickListener.java | 21 - .../util/misc/IWurstRenderListener.java | 21 - .../util/misc/announcer/MessagePrefixes.java | 72 -- .../util/misc/announcer/QueuedTask.java | 29 - .../util/misc/announcer/TaskType.java | 26 - .../util/misc/announcer/impl/TaskBasic.java | 33 - .../util/misc/announcer/impl/TaskBlock.java | 36 - .../util/misc/announcer/impl/TaskMove.java | 49 -- .../misc/waypoints/DimensionWaypoints.java | 23 - .../util/misc/waypoints/ServerWaypoints.java | 23 - .../util/misc/waypoints/Waypoint.java | 53 -- .../pepsimod/util/render/Texture.java | 114 ---- .../pepsimod/util/render/WorldRenderer.java | 250 ------- src/main/resources/mixins.pepsimod.json | 47 +- 225 files changed, 40 insertions(+), 21020 deletions(-) delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/BaseCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/CommandRegistry.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/api/Command.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/GoToCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/HelpCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/InvSeeCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/ListCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/PeekCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/ReloadCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/SaveCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/SetRotCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/SortModulesCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/command/impl/ToggleCommand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/event/GuiRenderHandler.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/event/MiscEventHandler.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/ClickGUI.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/Window.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/EntryImplBase.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/IEntry.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/Button.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubButton.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubSlider.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowCombat.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMisc.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMovement.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowPlayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowRender.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiButtonMCLeaks.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiScreenMCLeaks.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/gui/misc/GuiButtonTooBeeTooTee.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/key/KeyRegistry.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/misc/TickRate.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/misc/data/DataLoader.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/misc/data/Group.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/misc/data/Groups.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/misc/data/MainMenu.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlock.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockLiquid.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSlab.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSoulSand.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinAbstractClientPlayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinEntityPlayerSP.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiBossOverlay.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiChat.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiConnecting.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiDisconnected.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngame.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngameMenu.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMultiplayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiPlayerTabOverlay.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/multiplayer/MixinWorldClient.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerLoginClient.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerPlayClient.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockFluidRenderer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockModelRenderer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinEntityRenderer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinItemRenderer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/chunk/MixinVisGraph.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/entity/MixinRender.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/resources/MixinLocale.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinGameSettings.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinKeyBinding.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntity.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityAgeable.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityLivingBase.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinAbstractHorse.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinEntityPig.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/item/MixinItemStack.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/network/MixinNetworkManager.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/network/play/client/MixinCPacketPlayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/scoreboard/MixinScoreboard.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/util/MixinMovementInputFromOptions.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTabCompleter.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTimer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/util/text/translation/MixinLanguageMap.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/world/MixinWorld.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/world/storage/MixinWorldInfo.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/ModuleCategory.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/ModuleManager.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/Module.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/ModuleLaunchState.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/ModuleOption.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/ModuleSortType.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/OptionCompletions.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/TimeModule.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionBoolean.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionMulti.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionSlider.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionType.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/api/option/OptionExtended.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/BasicMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/AuraMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoArmorMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoTotemMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/BedBomberMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/BowAimBotMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/CriticalsMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/combat/CrystalAuraMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/AnnouncerMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/AntiHungerMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoFishMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoToolMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/ClickGuiMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/FreecamMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/HUDMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/NoFallMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/NotificationsMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/misc/TimerMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoRespawnMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoWalkMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/BoatFlyMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/ElytraFlyMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/EntitySpeedMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/FlightMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/HorseJumpPowerMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/InventoryMoveMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/JesusMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoClipMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoSlowdownMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/SafewalkMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/SpeedMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/StepMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/movement/VelocityMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/AntiAFKMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoEatMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoMineMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/FastPlaceMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/ScaffoldMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/SpeedmineMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/player/SprintMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiBlindMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiInvisibleMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiTotemAnimationMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/ESPMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/FullbrightMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/HealthTagsMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/NameTagsMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/NoHurtCamMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/NoOverlayMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/NoWeatherMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/StorageESPMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/TracersMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/TrajectoriesMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/UnfocusedCPUMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/XrayMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/module/impl/render/ZoomMod.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/optimization/BlockID.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/optimization/OverrideCounter.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/optimization/SizeSettable.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/BlockUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/EntityUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RenderUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RotationUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WBlock.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayerController.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/package-info.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/AccountManager.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/BetterScaledResolution.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/BossinfoCounted.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/EntityFakePlayer.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/HTTPUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/MCLeaks.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/PepsiUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/ReflectionStuff.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/RenderColor.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/ColorUtils.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedElement.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedText.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/FixedColorElement.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/GradientText.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/PlainColorElement.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/ColorChangeType.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowCycle.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowText.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/BaseImplTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/Config.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/IConfigTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/NullConfigTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/AnnouncerTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/AntiAFKTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/AutoEatTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/BedBomberTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/ClickGUITranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/CpuLimitTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/CriticalsTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/CrystalAuraTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/ESPTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/ElytraFlyTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/EntitySpeedTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/FlightTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/FreecamTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/FriendsTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/GeneralTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/HUDTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/NameTagsTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/NoWeatherTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/NotificationsTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/SpeedmineTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/StepTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/TargettingTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/TimerTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/TracersTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/VelocityTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/config/impl/XrayTranslator.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/event/MoveEvent.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/ITickListener.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/IWurstRenderListener.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/MessagePrefixes.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/QueuedTask.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/TaskType.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBasic.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBlock.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskMove.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/DimensionWaypoints.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/ServerWaypoints.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/Waypoint.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/render/Texture.java delete mode 100644 src/main/java/net/daporkchop/pepsimod/util/render/WorldRenderer.java diff --git a/build.gradle b/build.gradle index 3a1c5bb..8af0e9d 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ apply plugin: "org.spongepowered.mixin" ext { //general things javaVersion = "1.8" - pepsimodVersion = "1.11" + pepsimodVersion = "11.1" //minecraft things mcpmappingsVersion = "stable_39" @@ -52,9 +52,8 @@ ext { } group "net.daporkchop" -version "v$pepsimodVersion-$minecraftVersion" +version "$pepsimodVersion" -archivesBaseName = "pepsimod" sourceCompatibility = targetCompatibility = "$javaVersion" configurations { @@ -102,11 +101,9 @@ dependencies { } processResources { - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version from(sourceSets.main.resources.srcDirs) { include "mcmod.info" - expand "version": project.version, "mcversion": project.minecraft.version + expand "version": "$pepsimodVersion-$minecraftVersion", "mcversion": "$minecraftVersion" } from(sourceSets.main.resources.srcDirs) { exclude "mcmod.info" @@ -120,6 +117,8 @@ mixin { } jar { + archiveName "pepsimod-v$pepsimodVersion-$minecraftVersion" + ".jar" + from { configurations.shade.collect { zipTree(it) diff --git a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java index b1f8f59..d0c96f5 100644 --- a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java +++ b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java @@ -16,278 +16,68 @@ package net.daporkchop.pepsimod; -import net.daporkchop.pepsimod.command.impl.ReloadCommand; -import net.daporkchop.pepsimod.gui.clickgui.ClickGUI; -import net.daporkchop.pepsimod.command.CommandRegistry; -import net.daporkchop.pepsimod.command.impl.GoToCommand; -import net.daporkchop.pepsimod.command.impl.HelpCommand; -import net.daporkchop.pepsimod.command.impl.InvSeeCommand; -import net.daporkchop.pepsimod.command.impl.ListCommand; -import net.daporkchop.pepsimod.command.impl.PeekCommand; -import net.daporkchop.pepsimod.command.impl.SaveCommand; -import net.daporkchop.pepsimod.command.impl.SetRotCommand; -import net.daporkchop.pepsimod.command.impl.SortModulesCommand; -import net.daporkchop.pepsimod.command.impl.ToggleCommand; -import net.daporkchop.pepsimod.event.GuiRenderHandler; -import net.daporkchop.pepsimod.event.MiscEventHandler; -import net.daporkchop.pepsimod.gui.clickgui.window.WindowCombat; -import net.daporkchop.pepsimod.gui.clickgui.window.WindowMisc; -import net.daporkchop.pepsimod.gui.clickgui.window.WindowMovement; -import net.daporkchop.pepsimod.gui.clickgui.window.WindowPlayer; -import net.daporkchop.pepsimod.gui.clickgui.window.WindowRender; -import net.daporkchop.pepsimod.key.KeyRegistry; -import net.daporkchop.pepsimod.misc.data.DataLoader; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.impl.combat.AuraMod; -import net.daporkchop.pepsimod.module.impl.combat.AutoArmorMod; -import net.daporkchop.pepsimod.module.impl.combat.AutoTotemMod; -import net.daporkchop.pepsimod.module.impl.combat.BedBomberMod; -import net.daporkchop.pepsimod.module.impl.combat.CriticalsMod; -import net.daporkchop.pepsimod.module.impl.combat.CrystalAuraMod; -import net.daporkchop.pepsimod.module.impl.misc.AnnouncerMod; -import net.daporkchop.pepsimod.module.impl.misc.AntiHungerMod; -import net.daporkchop.pepsimod.module.impl.misc.AutoFishMod; -import net.daporkchop.pepsimod.module.impl.misc.AutoToolMod; -import net.daporkchop.pepsimod.module.impl.misc.ClickGuiMod; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.misc.HUDMod; -import net.daporkchop.pepsimod.module.impl.misc.NoFallMod; -import net.daporkchop.pepsimod.module.impl.misc.NotificationsMod; -import net.daporkchop.pepsimod.module.impl.misc.TimerMod; -import net.daporkchop.pepsimod.module.impl.movement.AutoRespawnMod; -import net.daporkchop.pepsimod.module.impl.movement.AutoWalkMod; -import net.daporkchop.pepsimod.module.impl.movement.BoatFlyMod; -import net.daporkchop.pepsimod.module.impl.movement.ElytraFlyMod; -import net.daporkchop.pepsimod.module.impl.movement.EntitySpeedMod; -import net.daporkchop.pepsimod.module.impl.movement.FlightMod; -import net.daporkchop.pepsimod.module.impl.movement.HorseJumpPowerMod; -import net.daporkchop.pepsimod.module.impl.movement.InventoryMoveMod; -import net.daporkchop.pepsimod.module.impl.movement.JesusMod; -import net.daporkchop.pepsimod.module.impl.movement.NoClipMod; -import net.daporkchop.pepsimod.module.impl.movement.NoSlowdownMod; -import net.daporkchop.pepsimod.module.impl.movement.SafewalkMod; -import net.daporkchop.pepsimod.module.impl.movement.StepMod; -import net.daporkchop.pepsimod.module.impl.movement.VelocityMod; -import net.daporkchop.pepsimod.module.impl.player.AntiAFKMod; -import net.daporkchop.pepsimod.module.impl.player.AutoEatMod; -import net.daporkchop.pepsimod.module.impl.player.AutoMineMod; -import net.daporkchop.pepsimod.module.impl.player.FastPlaceMod; -import net.daporkchop.pepsimod.module.impl.player.ScaffoldMod; -import net.daporkchop.pepsimod.module.impl.player.SpeedmineMod; -import net.daporkchop.pepsimod.module.impl.player.SprintMod; -import net.daporkchop.pepsimod.module.impl.render.AntiBlindMod; -import net.daporkchop.pepsimod.module.impl.render.AntiInvisibleMod; -import net.daporkchop.pepsimod.module.impl.render.AntiTotemAnimationMod; -import net.daporkchop.pepsimod.module.impl.render.ESPMod; -import net.daporkchop.pepsimod.module.impl.render.FullbrightMod; -import net.daporkchop.pepsimod.module.impl.render.HealthTagsMod; -import net.daporkchop.pepsimod.module.impl.render.NameTagsMod; -import net.daporkchop.pepsimod.module.impl.render.NoHurtCamMod; -import net.daporkchop.pepsimod.module.impl.render.NoOverlayMod; -import net.daporkchop.pepsimod.module.impl.render.NoWeatherMod; -import net.daporkchop.pepsimod.module.impl.render.StorageESPMod; -import net.daporkchop.pepsimod.module.impl.render.TracersMod; -import net.daporkchop.pepsimod.module.impl.render.TrajectoriesMod; -import net.daporkchop.pepsimod.module.impl.render.UnfocusedCPUMod; -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.daporkchop.pepsimod.module.impl.render.ZoomMod; import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.config.Config; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; import net.minecraft.client.Minecraft; -import net.minecraft.util.Session; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.event.FMLConstructionEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.commons.io.IOUtils; -import org.lwjgl.input.Keyboard; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.TimerTask; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Mod( - modid = "pepsimod", - version = "v11.1", + modid = PepsiConstants.MOD_ID, useMetadata = true ) public class Pepsimod extends PepsiConstants { - public static final String VERSION; public static final String CHAT_PREFIX = "\u00A70\u00A7l[\u00A7c\u00A7lpepsi\u00A79\u00A7lmod\u00A70\u00A7l]\u00A7r"; - public static final String NAME_VERSION; - - static { - { - String version = Pepsimod.class.getAnnotation(Mod.class).version(); - if (version.indexOf('-') == -1) { - version += String.format("-%s", MinecraftForge.MC_VERSION); - } - VERSION = version; - } - NAME_VERSION = String.format("pepsimod %s", VERSION); - } - - public DataLoader data; - public boolean isMcLeaksAccount = false; - public Session originalSession = null; - public boolean hasInitializedModules = false; - public boolean isInitialized = false; - - { - PepsiConstants.pepsimod = this; - } @Mod.EventHandler public void construction(FMLConstructionEvent event) { mc = Minecraft.getMinecraft(); - pepsimod = this; - ReflectionStuff.init(); + ModContainer container = FMLCommonHandler.instance().findContainerFor(pepsimod = this); + VERSION = container.getVersion(); + if ("${version}".equals(VERSION)) { + VERSION = "dev"; + VERSION_FULL = "dev-" + MinecraftForge.MC_VERSION; + } else { + Matcher matcher = Pattern.compile("([.0-9]+)-([.0-9]+)").matcher(VERSION); + if (!matcher.find()) { + throw new IllegalStateException(String.format("Unparseable version: \"%s\"", VERSION)); + } + VERSION = matcher.group(1); + String mcVersion = matcher.group(2); + VERSION_FULL = String.format("%s-%s", VERSION, mcVersion); + if (!MinecraftForge.MC_VERSION.equals(mcVersion)) { + throw new IllegalStateException(String.format("pepsimod expected Minecraft %s, but found %s!", MinecraftForge.MC_VERSION, mcVersion)); + } + } - this.data = new DataLoader( + System.out.printf("Loading pepsimod %s...\n", VERSION_FULL); + System.exit(1); + + /*this.data = new DataLoader( "https://raw.githubusercontent.com/Team-Pepsi/pepsimod/master/resources/resources.json", new File(mc.gameDir, "pepsimod/resources/") - ); + );*/ } @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - mcStartedSuccessfully = true; - - MinecraftForge.EVENT_BUS.register(new KeyRegistry()); + //MinecraftForge.EVENT_BUS.register(new KeyRegistry()); } @Mod.EventHandler public void init(FMLInitializationEvent event) { - this.data.load(); - - new ClickGUI(); - ClickGUI.INSTANCE.setWindows( - new WindowRender(), - new WindowCombat(), - new WindowMisc(), - new WindowMovement(), - new WindowPlayer() - ); - - this.loadConfig(); - ModuleManager.registerModules( - new NoFallMod(), - new AntiHungerMod(), - new FullbrightMod(), - new CriticalsMod(), - new AuraMod(), - new VelocityMod(), - new TimerMod(), - new XrayMod(), - new AntiBlindMod(), - new StorageESPMod(), - new FreecamMod(), - new HealthTagsMod(), - new NameTagsMod(), - new NoHurtCamMod(), - new NoOverlayMod(), - new NoWeatherMod(), - new AntiInvisibleMod(), - new TrajectoriesMod(), - new TracersMod(), - new ClickGuiMod(false, Keyboard.KEY_RSHIFT), - new HUDMod(true, -1), - new ZoomMod(-1), - new ElytraFlyMod(), - new AutoWalkMod(), - new EntitySpeedMod(), - new SafewalkMod(), - new InventoryMoveMod(), - new HorseJumpPowerMod(), - new AutoTotemMod(), - new CrystalAuraMod(), - new AntiTotemAnimationMod(), - new AnnouncerMod(), - new AutoRespawnMod(), - new JesusMod(), - new SprintMod(), - new NoSlowdownMod(), - new FlightMod(), - new FastPlaceMod(), - new SpeedmineMod(), - new AutoEatMod(), - new StepMod(), - new AutoMineMod(), - new ScaffoldMod(), - new UnfocusedCPUMod(), - new ESPMod(), - new NoClipMod(), - new BoatFlyMod(), - new NotificationsMod(), - new BedBomberMod(), - new AutoFishMod(), - new AutoToolMod(), - new AutoArmorMod(), - new AntiAFKMod() - ); - - ClickGUI.INSTANCE.initWindows(); - HUDTranslator.INSTANCE.parseConfigLate(); - - CommandRegistry.registerCommands( - new HelpCommand(), - new SetRotCommand(), - new ToggleCommand(), - new SortModulesCommand(), - new SaveCommand(), - new ListCommand(), - new InvSeeCommand(), - new PeekCommand(), - new GoToCommand(), - new ReloadCommand() - ); } @Mod.EventHandler public void postInit(FMLPostInitializationEvent event) { - MinecraftForge.EVENT_BUS.register(new GuiRenderHandler()); - MinecraftForge.EVENT_BUS.register(new MiscEventHandler()); - PepsiUtils.timer.schedule(new TimerTask() { - @Override - public void run() { - PepsiConstants.pepsimod.saveConfig(); - } - }, 360000, 360000); - } - - public void loadConfig() { - String launcherJson = "{}"; - File file = new File(mc.gameDir, "pepsimodConf.json"); - try (InputStream in = new FileInputStream(file)) { - launcherJson = IOUtils.toString(in, "UTF-8"); - } catch (IOException e) { - e.printStackTrace(); - } - Config.loadConfig(launcherJson); - } - - public void saveConfig() { - String config = Config.saveConfig(); - try { - File file = new File(mc.gameDir, "pepsimodConf.json"); - if (!file.exists() && !file.createNewFile()) { - throw new IllegalStateException(String.format("Unable to create file: %s", file.getAbsolutePath())); - } - try (OutputStream out = new FileOutputStream(file)) { - out.write(config.getBytes("UTF-8")); - } - } catch (IOException e) { - e.printStackTrace(); - } } } diff --git a/src/main/java/net/daporkchop/pepsimod/command/BaseCommand.java b/src/main/java/net/daporkchop/pepsimod/command/BaseCommand.java deleted file mode 100644 index ebd2cbd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/BaseCommand.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command; - -import net.daporkchop.pepsimod.command.api.Command; - -public class BaseCommand extends Command { - public BaseCommand() { - super("delet_this"); - } - - @Override - public void execute(String cmd, String[] args) { - - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".delet_this"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/CommandRegistry.java b/src/main/java/net/daporkchop/pepsimod/command/CommandRegistry.java deleted file mode 100644 index 19ded59..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/CommandRegistry.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.command.api.Command; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.minecraft.util.text.TextComponentString; - -import java.util.HashMap; -import java.util.Map; - -public class CommandRegistry extends PepsiConstants { - /** - * All registered commands are here :P - */ - public static HashMap commandNames = new HashMap<>(); - - /** - * Gets a completion suggestion for a command - * - * @param input the current text input - * @return a suggestion, or "" if nothing could be recommended - */ - public static String getSuggestionFor(String input) { - if (input.length() == 1) { - return "." + commandNames.values().iterator().next().name; - } - String[] split = input.replace(" ", " \u0000").split("\\s+"); - for (int i = split.length - 1; i >= 0; i--) { - split[i] = split[i].replace("\u0000", ""); - } - try { - String commandName = split[0].substring(1); - Command command = commandNames.get(commandName); - if (command != null) { - return command.getSuggestion(input, split); - } - - for (Map.Entry entry : commandNames.entrySet()) { - if (entry.getKey().startsWith(commandName)) { - return "." + entry.getKey(); - } - } - } catch (StringIndexOutOfBoundsException e) { - } - return ""; - } - - /** - * Registers a command. - * - * @param command the command to register - */ - public static void registerCommand(Command command) { - if (!commandNames.values().contains(command)) { - for (String s : command.aliases()) { - commandNames.put(s, command); - } - } - } - - public static void registerCommands(Command... toRegister) { - for (Command command : toRegister) { - registerCommand(command); - } - } - - /** - * Runs a command - * - * @param command the command given in chat - */ - public static void runCommand(String command) { - try { - String split[] = command.split(" "), commandName = split[0].substring(1); - for (Map.Entry entry : commandNames.entrySet()) { - if (entry.getKey().equals(commandName)) { - entry.getValue().execute(command, split); - return; - } - } - - mc.player.sendMessage(new TextComponentString(Pepsimod.CHAT_PREFIX + PepsiUtils.COLOR_ESCAPE + "cUnknown command! Use .help for a list of commands!")); - } catch (ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) { - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/api/Command.java b/src/main/java/net/daporkchop/pepsimod/command/api/Command.java deleted file mode 100644 index 5aba071..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/api/Command.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.api; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.util.text.TextComponentString; - -public abstract class Command extends PepsiConstants { - public static void clientMessage(String toSend) { - mc.player.sendMessage(new TextComponentString(Pepsimod.CHAT_PREFIX + toSend)); - } - public String name; - - public Command(String name) { - this.name = name; - } - - public abstract void execute(String cmd, String[] args); - - public abstract String getSuggestion(String cmd, String[] args); - - public String[] aliases() { - return new String[]{this.name}; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/GoToCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/GoToCommand.java deleted file mode 100644 index 11a5229..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/GoToCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.minecraft.util.math.BlockPos; - -public class GoToCommand extends Command { - public static GoToCommand INSTANCE; - - public GoToCommand() { - super("goto"); - INSTANCE = this; - } - - @Override - public void execute(String cmd, String[] args) { - clientMessage("§cThe pathfinder is currently disabled."); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".goto"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/HelpCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/HelpCommand.java deleted file mode 100644 index 6db9090..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/HelpCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.CommandRegistry; -import net.daporkchop.pepsimod.command.api.Command; - -public class HelpCommand extends Command { - public HelpCommand() { - super("help"); - } - - @Override - public void execute(String cmd, String[] args) { - String toSend = ""; - for (String command : CommandRegistry.commandNames.keySet()) { - toSend += command + ", "; - } - toSend = toSend.substring(0, toSend.length() - 2); - clientMessage(toSend); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".help"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/InvSeeCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/InvSeeCommand.java deleted file mode 100644 index fa7249b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/InvSeeCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.minecraft.client.entity.EntityOtherPlayerMP; -import net.minecraft.client.gui.inventory.GuiInventory; -import net.minecraft.entity.Entity; - -public class InvSeeCommand extends Command { - public InvSeeCommand() { - super("invsee"); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length < 2) { - clientMessage("Usage: .invsee "); - return; - } - - for (Entity entity : mc.world.getLoadedEntityList()) { - if (entity instanceof EntityOtherPlayerMP) { - EntityOtherPlayerMP player = (EntityOtherPlayerMP) entity; - if (player.getName().equals(args[1])) { - clientMessage("Showing inventory of " + player.getName()); - mc.displayGuiScreen(new GuiInventory(player)); - return; - } - } - } - - clientMessage("Such player in range!"); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - switch (args.length) { - case 1: - String aName = this.getPlayerName(""); - if (aName == null) { - break; - } else { - return ".invsee " + aName; - } - case 2: - String bName = this.getPlayerName(args[1]); - if (bName == null) { - break; - } else { - return ".invsee " + bName; - } - } - - return ".invsee"; - } - - public String getPlayerName(String in) { - for (Entity e : mc.world.loadedEntityList) { - if (e instanceof EntityOtherPlayerMP) { - EntityOtherPlayerMP player = (EntityOtherPlayerMP) e; - if (player.getName().startsWith(in)) { - return player.getName(); - } - } - } - - return null; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/ListCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/ListCommand.java deleted file mode 100644 index 5a990ae..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/ListCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.util.PepsiUtils; - -public class ListCommand extends Command { - public ListCommand() { - super("list"); - } - - @Override - public void execute(String cmd, String[] args) { - String s = ""; - for (int i = 0; i < ModuleManager.AVALIBLE_MODULES.size(); i++) { - s += ModuleManager.AVALIBLE_MODULES.get(i).name + (i + 1 == ModuleManager.AVALIBLE_MODULES.size() ? "" : ", "); - } - clientMessage("Available modules: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".list"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/PeekCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/PeekCommand.java deleted file mode 100644 index 442bb8a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/PeekCommand.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.minecraft.block.Block; -import net.minecraft.client.gui.inventory.GuiChest; -import net.minecraft.init.Blocks; -import net.minecraft.inventory.InventoryBasic; -import net.minecraft.inventory.ItemStackHelper; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.NonNullList; - -public class PeekCommand extends Command { - public static Block[] SHULKERS; - - public static boolean isShulkerBox(Block block) { - for (Block b : SHULKERS) { - if (b == block) { - return true; - } - } - - return false; - } - - public static InventoryBasic getFromItemNBT(NBTTagCompound tag) { - NonNullList items = NonNullList.withSize(27, ItemStack.EMPTY); - String customName = "Shulker Box"; - - if (tag.hasKey("Items", 9)) { - ItemStackHelper.loadAllItems(tag, items); - } - - if (tag.hasKey("CustomName", 8)) { - customName = tag.getString("CustomName"); - } - - InventoryBasic inventoryBasic = new InventoryBasic(customName, true, items.size()); - for (int i = 0; i < items.size(); i++) { - inventoryBasic.setInventorySlotContents(i, items.get(i)); - } - return inventoryBasic; - } - - { - SHULKERS = new Block[]{ - Blocks.BLACK_SHULKER_BOX, - Blocks.BLUE_SHULKER_BOX, - Blocks.BROWN_SHULKER_BOX, - Blocks.CYAN_SHULKER_BOX, - Blocks.GRAY_SHULKER_BOX, - Blocks.GREEN_SHULKER_BOX, - Blocks.LIGHT_BLUE_SHULKER_BOX, - Blocks.LIME_SHULKER_BOX, - Blocks.MAGENTA_SHULKER_BOX, - Blocks.ORANGE_SHULKER_BOX, - Blocks.PINK_SHULKER_BOX, - Blocks.PURPLE_SHULKER_BOX, - Blocks.RED_SHULKER_BOX, - Blocks.SILVER_SHULKER_BOX, - Blocks.WHITE_SHULKER_BOX, - Blocks.YELLOW_SHULKER_BOX - }; - } - - public PeekCommand() { - super("peek"); - } - - @Override - public void execute(String cmd, String[] args) { - ItemStack stack = null; - if (!mc.player.getHeldItemOffhand().isEmpty()) { - stack = mc.player.getHeldItemOffhand(); - } - if (!mc.player.getHeldItemMainhand().isEmpty()) { - stack = mc.player.getHeldItemMainhand(); - } - if (stack != null && !stack.isEmpty()) { - if (stack.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) stack.getItem()).getBlock(); - if (isShulkerBox(block)) { - if (stack.hasTagCompound()) { - ItemStack wtf_java = stack; - - mc.displayGuiScreen(new GuiChest(mc.player.inventory, getFromItemNBT(wtf_java.getTagCompound().getCompoundTag("BlockEntityTag")))); - } else { - mc.displayGuiScreen(new GuiChest(new InventoryBasic("Shulker Box", true, 27), mc.player.inventory)); - } - return; - } - } - } - - clientMessage("Not holding a shulker box!"); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".peek"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/ReloadCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/ReloadCommand.java deleted file mode 100644 index 7441fd3..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/ReloadCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; - -public class ReloadCommand extends Command { - public ReloadCommand() { - super("reload"); - } - - @Override - public void execute(String cmd, String[] args) { - clientMessage("Reloading resources..."); - new Thread(() -> { - try { - pepsimod.data.load(); - } catch (Exception e) { - clientMessage("Error loading resources! See log for more info."); - e.printStackTrace(); - throw new RuntimeException(e); - } - clientMessage("Resources reloaded!"); - }).start(); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".reload"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/SaveCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/SaveCommand.java deleted file mode 100644 index 9a538a7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/SaveCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; - -public class SaveCommand extends Command { - public SaveCommand() { - super("save"); - } - - @Override - public void execute(String cmd, String[] args) { - pepsimod.saveConfig(); - clientMessage("Saved config!"); - } - - @Override - public String getSuggestion(String cmd, String[] args) { - return ".save"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/SetRotCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/SetRotCommand.java deleted file mode 100644 index 7c43de5..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/SetRotCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; - -public class SetRotCommand extends Command { - public SetRotCommand() { - super("setrot"); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length < 3) { - clientMessage("Usage: .setrot "); - return; - } - - try { - float yaw = Float.parseFloat(args[1]); - float pitch = Float.parseFloat(args[2]); - mc.player.setPositionAndRotation(mc.player.posX, mc.player.posY, mc.player.posZ, yaw, pitch); - clientMessage("Set rotation to yaw: " + yaw + " pitch: " + pitch); - } catch (NumberFormatException e) { - clientMessage("Invalid arguemnts!"); - } - } - - @Override - public String getSuggestion(String cmd, String[] args) { - switch (args.length) { - case 1: - return ".setrot 0 0"; - case 2: - return ".setrot " + args[1] + (args[1].length() == 0 ? "0 0" : " 0"); - } - return ".setrot"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/SortModulesCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/SortModulesCommand.java deleted file mode 100644 index 78fdeb7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/SortModulesCommand.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.ModuleSortType; - -public class SortModulesCommand extends Command { - public static final String[] MODES = new String[]{"alphabetical", "default", "size", "random"}; - - public SortModulesCommand() { - super("sortmodules"); - } - - @Override - public void execute(String cmd, String[] args) { - String resulttype = null; - for (int i = 0; i < MODES.length; i++) { - String toanalyze = MODES[i]; - if (toanalyze.startsWith(args[1])) { - resulttype = toanalyze; - break; - } - } - if (resulttype == null) { - clientMessage("Invalid type: " + args[1]); - clientMessage("Valid types are: alphabetical, default, size, random"); - } else { - switch (resulttype) { - case "alphabetical": - ModuleManager.sortModules(ModuleSortType.ALPHABETICAL); - break; - case "default": - ModuleManager.sortModules(ModuleSortType.DEFAULT); - break; - case "size": - ModuleManager.sortModules(ModuleSortType.SIZE); - break; - case "random": - ModuleManager.sortModules(ModuleSortType.RANDOM); - break; - } - clientMessage("Sorted modules according to: \u00A7l" + resulttype); - } - } - - @Override - public String getSuggestion(String cmd, String[] args) { - switch (args.length) { - case 1: - return ".sortmodules " + MODES[0]; - case 2: - if (args[1].isEmpty()) { - return ".sortmodules " + MODES[0]; - } - for (String mode : MODES) { - if (mode.startsWith(args[1])) { - return ".sortmodules " + mode; - } - } - } - - return ".sortmodules"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/command/impl/ToggleCommand.java b/src/main/java/net/daporkchop/pepsimod/command/impl/ToggleCommand.java deleted file mode 100644 index f8e2cef..0000000 --- a/src/main/java/net/daporkchop/pepsimod/command/impl/ToggleCommand.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.command.impl; - -import net.daporkchop.pepsimod.command.api.Command; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.util.PepsiUtils; - -public class ToggleCommand extends Command { - public ToggleCommand() { - super("toggle"); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length < 2) { - String s = ""; - for (int i = 0; i < ModuleManager.AVALIBLE_MODULES.size(); i++) { - s += ModuleManager.AVALIBLE_MODULES.get(i).name + (i + 1 == ModuleManager.AVALIBLE_MODULES.size() ? "" : ", "); - } - clientMessage("Available modules: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - return; - } - Module module = ModuleManager.getModuleByName(args[1]); - if (module == null) { - clientMessage("No module was found by the name: " + PepsiUtils.COLOR_ESCAPE + "o" + args[1]); - } else { - ModuleManager.toggleModule(module); - clientMessage("Toggled module: " + PepsiUtils.COLOR_ESCAPE + "o" + module.name); - } - } - - @Override - public String getSuggestion(String cmd, String[] args) { - switch (args.length) { - case 1: - return ".toggle " + ModuleManager.AVALIBLE_MODULES.get(0).name; - case 2: - if (args[1].isEmpty()) { - return ".toggle " + ModuleManager.AVALIBLE_MODULES.get(0).name; - } - for (Module module : ModuleManager.AVALIBLE_MODULES) { - if (module.name.startsWith(args[1])) { - return ".toggle " + module.name; - } - } - return ""; - } - - return ".toggle"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/event/GuiRenderHandler.java b/src/main/java/net/daporkchop/pepsimod/event/GuiRenderHandler.java deleted file mode 100644 index 32746a6..0000000 --- a/src/main/java/net/daporkchop/pepsimod/event/GuiRenderHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.event; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.util.BetterScaledResolution; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.client.gui.GuiIngame; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -public class GuiRenderHandler extends PepsiConstants { - public static GuiRenderHandler INSTANCE; - - { - INSTANCE = this; - new BetterScaledResolution(); - } - - @SubscribeEvent - public void onRenderGui(RenderGameOverlayEvent.Post event) { - if (event.getType() != RenderGameOverlayEvent.ElementType.HOTBAR) { - return; - } - - GuiIngame gui = mc.ingameGUI; - - BetterScaledResolution.INSTANCE.update(); - int width = BetterScaledResolution.INSTANCE.scaledWidth; - int height = BetterScaledResolution.INSTANCE.scaledHeight; - - for (Module module : ModuleManager.ENABLED_MODULES) { - module.onRenderGUI(event.getPartialTicks(), width, height, gui); - } - } - - @SubscribeEvent - public void onRenderWorld(RenderWorldLastEvent event) { - for (Module module : ModuleManager.ENABLED_MODULES) { - module.onRender(event.getPartialTicks()); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/event/MiscEventHandler.java b/src/main/java/net/daporkchop/pepsimod/event/MiscEventHandler.java deleted file mode 100644 index 922dd57..0000000 --- a/src/main/java/net/daporkchop/pepsimod/event/MiscEventHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.event; - -import net.daporkchop.pepsimod.module.impl.misc.HUDMod; -import net.daporkchop.pepsimod.module.impl.misc.NotificationsMod; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.network.FMLNetworkEvent; - -import java.awt.TrayIcon; - -public class MiscEventHandler extends PepsiConstants { - public static MiscEventHandler INSTANCE; - - @SubscribeEvent - public void onDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { - HUDMod.INSTANCE.serverBrand = ""; - System.out.println("[PEPSIMOD] Saving config..."); - pepsimod.saveConfig(); - System.out.println("[PEPSIMOD] Saved."); - NotificationsMod.sendNotification("Disconnected from server", TrayIcon.MessageType.WARNING); - NotificationsMod.INSTANCE.inQueue = false; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/ClickGUI.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/ClickGUI.java deleted file mode 100644 index a26a406..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/ClickGUI.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.impl.misc.ClickGuiMod; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.input.Mouse; - -import java.io.IOException; - -public class ClickGUI extends GuiScreen { - public static ClickGUI INSTANCE; - public Window[] windows; - - { - INSTANCE = this; - } - - public void setWindows(Window... windows) { - this.windows = windows; - } - - public void initWindows() { - for (Window window : this.windows) { - window.init(window.category); - } - } - - protected void keyTyped(char eventChar, int eventKey) { - if (eventKey == 1 || eventKey == ClickGuiMod.INSTANCE.keybind.getKeyCode()) { - ModuleManager.disableModule(ClickGuiMod.INSTANCE); - - this.mc.displayGuiScreen(null); - - if (this.mc.currentScreen == null) { - this.mc.setIngameFocus(); - } - } - } - - public synchronized void sendToFront(Window window) { - if (this.containsWindow(window)) { - int panelIndex = 0; - for (int i = 0; i < this.windows.length; i++) { - if (this.windows[i] == window) { - panelIndex = i; - break; - } - } - Window t = this.windows[0]; - this.windows[0] = this.windows[panelIndex]; - this.windows[panelIndex] = t; - } - } - - public void mouseClicked(int x, int y, int b) throws IOException { - for (Window window : this.windows) { - window.processMouseClick(x, y, b); - } - - super.mouseClicked(x, y, b); - } - - public void mouseReleased(int x, int y, int state) { - for (Window window : this.windows) { - window.processMouseRelease(x, y, state); - } - - super.mouseReleased(x, y, state); - } - - public void drawScreen(int x, int y, float ticks) { - for (Window window : this.windows) { - window.draw(x, y); - } - - super.drawScreen(x, y, ticks); - } - - @Override - public boolean doesGuiPauseGame() { - return false; - } - - public boolean containsWindow(Window window) { - for (Window window1 : this.windows) { - if (window == window1) { - return true; - } - } - - return false; - } - - @Override - public void handleMouseInput() throws IOException { - super.handleMouseInput(); - int dWheel = MathHelper.clamp(Mouse.getEventDWheel(), -1, 1); - if (dWheel != 0) { - dWheel *= -1; - int x = Mouse.getEventX() * this.width / this.mc.displayWidth; - int y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; - for (Window window : this.windows) { - window.handleScroll(dWheel, x, y); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/Window.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/Window.java deleted file mode 100644 index a4b5a76..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/Window.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui; - -import net.daporkchop.pepsimod.gui.clickgui.api.EntryImplBase; -import net.daporkchop.pepsimod.gui.clickgui.api.IEntry; -import net.daporkchop.pepsimod.gui.clickgui.entry.Button; -import net.daporkchop.pepsimod.gui.clickgui.entry.SubButton; -import net.daporkchop.pepsimod.gui.clickgui.entry.SubSlider; -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.BetterScaledResolution; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorUtils; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class Window extends EntryImplBase { - public final String text; - public List entries = Collections.synchronizedList(new ArrayList()); - public boolean isOpen = false; - public int modulesCounted = 0; - public int scroll = 0; - public ModuleCategory category; - private int renderYButton = 0; - private boolean isDragging = false; - private int dragX = 0, dragY = 0; - - public Window(int x, int y, String name, ModuleCategory category) { - super(x, y, 100, 12); - this.text = name; - this.category = category; - } - - public void processMouseClick(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.isMouseHovered()) { - ClickGUI.INSTANCE.sendToFront(this); - if (button == 0) { - //drag - this.isDragging = true; - this.dragX = mouseX - this.getX(); - this.dragY = mouseY - this.getY(); - } else if (button == 1) { - this.isOpen = !this.isOpen; - } else if (button == 2) { - //anything with a middle mouse button (unimplemented) - } - } - - for (IEntry entry : this.entries) { - if (entry.shouldRender()) { - entry.processMouseClick(mouseX, mouseY, button); - } - } - } - - public void processMouseRelease(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.isDragging) { - this.isDragging = false; - } - - for (IEntry entry : this.entries) { - if (entry.shouldRender()) { - entry.processMouseRelease(mouseX, mouseY, button); - } - } - } - - public void draw(int mouseX, int mouseY) { - if (this.isDragging) { - this.setX(mouseX - this.dragX); - this.setY(mouseY - this.dragY); - } - GL11.glPushMatrix(); - GL11.glPushAttrib(8256); - - this.scroll = Math.max(0, this.scroll); - this.scroll = Math.min(this.getDisplayableCount() - this.getModulesToDisplay(), this.scroll); - - this.updateIsMouseHovered(mouseX, mouseY); - this.renderYButton = this.getY(); - PepsiUtils.drawRect(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getDisplayedHeight(), this.getColor()); - GL11.glColor3f(0f, 0f, 0f); - drawString(this.getX() + 2, this.getY() + 2, this.text, Color.BLACK.getRGB()); - if (this.isOpen) { - if (this.shouldScroll()) { - int barHeight = this.getScrollbarHeight(); - int barY = this.getScrollbarY(); - barY = Math.min(barY, this.getScrollingModuleCount() * 13 - 1 - barHeight); - PepsiUtils.drawRect(this.getX() + 97, this.getY() + 13 + barY, this.getX() + 99, Math.min(this.getY() + 13 + barY + barHeight, this.getY() + this.getDisplayedHeight() - 1), HUDTranslator.INSTANCE.getColor()); - } else { - PepsiUtils.drawRect(this.getX() + 97, this.getY() + 13, this.getX() + 99, this.getDisplayedHeight() - 1, HUDTranslator.INSTANCE.getColor()); - } - this.modulesCounted = 0; - for (int i = this.getScroll(); i < this.getModulesToDisplay() + this.getScroll(); i++) { - IEntry entry = this.getNextEntry(); - this.modulesCounted++; - entry.draw(mouseX, mouseY); - } - } - - GL11.glPopMatrix(); - GL11.glPopAttrib(); - } - - public int getScrollbarHeight() { - double maxHeight = this.maxDisplayHeight(); - double maxAllowedModules = this.getScrollingModuleCount(); - double displayable = this.getDisplayableCount(); - int result = (int) Math.floor(maxHeight * (maxAllowedModules / displayable)); - return result; - } - - public int getScrollbarY() { - int displayable = this.getDisplayableCount(); - int rest = displayable - this.scroll; - int resultRaw = displayable - rest; - return resultRaw * 13; - } - - public int getX() { - return this.x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return this.y; - } - - public void setY(int y) { - this.y = y; - } - - public int getHeight() { - int i = this.height + 1; //+ - for (IEntry entry : this.entries) { - if (entry.shouldRender()) { - i += 13; - } - } - return i; - } - - public int getDisplayableCount() { - int i = 0; - for (IEntry entry : this.entries) { - if (entry.shouldRender()) { - i++; - } - } - return i; - } - - public int getWidth() { - return this.width; - } - - public int getColor() { - return ColorUtils.getColorForGuiEntry(ColorUtils.TYPE_WINDOW, this.isMouseHovered(), false); - } - - public Button addButton(Button b) { - this.entries.add(b); - return b; - } - - public SubButton addSubButton(SubButton b) { - this.entries.add(this.entries.indexOf(b.parent) + 1, b); - b.parent.subEntries.add(b); - return b; - } - - public SubSlider addSubSlider(SubSlider slider) { - this.entries.add(this.entries.indexOf(slider.parent) + 1, slider); - slider.parent.subEntries.add(slider); - return slider; - } - - public int getRenderYButton() { - return this.renderYButton += 13; - } - - public boolean shouldRender() { - return true; - } - - public void openGui() { - for (IEntry entry : this.entries) { - entry.openGui(); - } - } - - public int getScroll() { - if (this.shouldScroll()) { - return this.scroll; - } else { - return 0; - } - } - - public void init(ModuleCategory category) { - for (Module module : ModuleManager.AVALIBLE_MODULES) { - if (module.getCategory() != category) { - continue; - } - Button b = this.addButton(new Button(this, module)); - for (ModuleOption option : module.options) { - if (option.makeButton) { - if (option.extended == null) { - this.addSubButton(new SubButton(b, option)); - } else if (option.extended.getType() == ExtensionType.TYPE_SLIDER) { - this.addSubSlider(new SubSlider(b, option)); - } else { - throw new IllegalStateException("Option " + option.getName() + " uses an unsupported extension type!"); - } - } - } - } - } - - public String getName() { - return this.text; - } - - public boolean isOpen() { - return this.isOpen; - } - - public void setOpen(boolean val) { - this.isOpen = val; - } - - public int maxDisplayHeight() { - int height = BetterScaledResolution.INSTANCE.scaledHeight; - height = Math.floorDiv(height, 13); - height -= 1; - height *= 13; - return height; - } - - public int getScrollingModuleCount() { - int height = BetterScaledResolution.INSTANCE.scaledHeight; - height = Math.floorDiv(height, 13); - height -= 2; - return height; - } - - public int getModulesToDisplay() { - if (this.shouldScroll()) { - return this.getScrollingModuleCount(); - } else { - return this.getDisplayableCount(); - } - } - - public boolean shouldScroll() { - boolean val = this.getScrollingModuleCount() < this.getDisplayableCount(); - return val; - } - - public int getDisplayedHeight() { - int max = this.maxDisplayHeight(); - int normal = this.getHeight(); - int toReturn = Math.min(max, normal); - return toReturn; - } - - public IEntry getNextEntry() { - int a = 0; - int i = this.scroll; - for (; ; i++) { - IEntry entry = this.entries.get(i); - if (entry.shouldRender()) { - if (this.modulesCounted != 0) { - if (a < this.modulesCounted) { - a++; - continue; - } - } - return entry; - } - } - } - - public void handleScroll(int dWheel, int x, int y) { - this.updateIsMouseHoveredFull(x, y); - if (this.isMouseHovered() && this.shouldScroll()) { - this.scroll += dWheel; - } - } - - protected void updateIsMouseHoveredFull(int mouseX, int mouseY) { - int x = this.getX(), y = this.getY(); - int maxX = x + this.width, maxY = y + this.getDisplayedHeight(); - this.isHoveredCached = (x <= mouseX && mouseX <= maxX && y <= mouseY && mouseY <= maxY); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/EntryImplBase.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/EntryImplBase.java deleted file mode 100644 index 30b886f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/EntryImplBase.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.api; - -import net.daporkchop.pepsimod.util.PepsiConstants; - -public abstract class EntryImplBase extends PepsiConstants implements IEntry { - public static void drawString(int x, int y, String text, int color) { - mc.fontRenderer.drawString(text, x, y, color, false); - } - public final int width; - public final int height; - public int x; - public int y; - protected boolean isHoveredCached = false; - - public EntryImplBase(int x, int y, int width, int height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - public boolean isMouseHovered() { - return this.isHoveredCached; - } - - protected void updateIsMouseHovered(int mouseX, int mouseY) { - int x = this.getX(), y = this.getY(); - int maxX = x + this.width, maxY = y + this.height; - this.isHoveredCached = (x <= mouseX && mouseX <= maxX && y <= mouseY && mouseY <= maxY); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/IEntry.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/IEntry.java deleted file mode 100644 index d72d7de..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/api/IEntry.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.api; - -public interface IEntry { - boolean isMouseHovered(); - - void draw(int mouseX, int mouseY); - - void processMouseClick(int x, int y, int button); - - void processMouseRelease(int x, int y, int button); - - int getX(); - - void setX(int x); - - int getY(); - - void setY(int y); - - int getWidth(); - - int getHeight(); - - int getColor(); - - boolean shouldRender(); - - void openGui(); - - String getName(); - - boolean isOpen(); - - void setOpen(boolean val); -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/Button.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/Button.java deleted file mode 100644 index 112c7ed..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/Button.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.entry; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.gui.clickgui.api.EntryImplBase; -import net.daporkchop.pepsimod.gui.clickgui.api.IEntry; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorUtils; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class Button extends EntryImplBase { - public List subEntries = Collections.synchronizedList(new ArrayList()); - public boolean isOpen = false; - public Window window; - public Module module; - - public Button(Window window, Module module) { - super(window.getX() + 2, window.getY() + 2, window.getWidth() - 6, 12); - this.window = window; - this.module = module; - } - - public void processMouseClick(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.isMouseHovered()) { - if (button == 0) { - ModuleManager.toggleModule(this.module); - } else if (button == 1) { - this.isOpen = !this.isOpen; - } - } - } - - public void processMouseRelease(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - } - - public void draw(int mouseX, int mouseY) { - this.y = this.window.getRenderYButton(); - this.x = this.window.getX() + 2; - this.updateIsMouseHovered(mouseX, mouseY); - PepsiUtils.drawRect(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.height, this.getColor()); - GL11.glColor3f(0f, 0f, 0f); - drawString(this.getX() + 2, this.getY() + 2, this.module.nameFull, Color.BLACK.getRGB()); - } - - public int getX() { - return this.x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return this.y; - } - - public void setY(int y) { - this.y = y; - } - - public int getHeight() { - int i = this.height; - if (this.isOpen) { - i += 13 * this.subEntries.size(); //13 px for padding - } - return i; - } - - public int getWidth() { - return this.width; - } - - public int getColor() { - return ColorUtils.getColorForGuiEntry(ColorUtils.TYPE_BUTTON, this.isMouseHovered(), this.module.state.enabled); - } - - public boolean shouldRender() { - return this.window.isOpen; - } - - public void openGui() { - - } - - public String getName() { - return this.module.name; - } - - public boolean isOpen() { - return this.isOpen; - } - - public void setOpen(boolean val) { - this.isOpen = val; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubButton.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubButton.java deleted file mode 100644 index 54f38a6..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubButton.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.entry; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.gui.clickgui.api.EntryImplBase; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorUtils; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; - -public class SubButton extends EntryImplBase { - public final Button parent; - public Window window; - public ModuleOption option; - - public SubButton(Button parent, ModuleOption option) { - super(parent.window.getX() + 4, parent.getY() + 4, parent.window.getWidth() - 8, 12); - this.parent = parent; - this.window = parent.window; - this.option = option; - } - - public void processMouseClick(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.isMouseHovered()) { - if (button == 0) { - this.option.setValue(!((boolean) this.option.getValue())); - } - } - } - - public void processMouseRelease(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - } - - public void draw(int mouseX, int mouseY) { - this.y = this.window.getRenderYButton(); - this.x = this.window.getX() + 4; - this.updateIsMouseHovered(mouseX, mouseY); - PepsiUtils.drawRect(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.height, this.getColor()); - GL11.glColor3f(0f, 0f, 0f); - mc.fontRenderer.drawString(this.option.displayName, this.getX() + 2, this.getY() + 2, Color.BLACK.getRGB()); - } - - public int getX() { - return this.x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return this.y; - } - - public void setY(int y) { - this.y = y; - } - - public int getHeight() { - return this.height; - } - - public int getWidth() { - return this.width; - } - - public int getColor() { - return ColorUtils.getColorForGuiEntry(ColorUtils.TYPE_BUTTON, this.isMouseHovered(), (boolean) this.option.getValue()); - } - - public boolean shouldRender() { - return this.parent.isOpen && this.parent.shouldRender(); - } - - public void openGui() { - - } - - public String getName() { - return this.option.getName(); - } - - public boolean isOpen() { - return false; - } - - public void setOpen(boolean val) { - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubSlider.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubSlider.java deleted file mode 100644 index 1ed7306..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/entry/SubSlider.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.entry; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.gui.clickgui.api.EntryImplBase; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorUtils; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; - -public class SubSlider extends EntryImplBase { - public final Button parent; - public Window window; - public ModuleOption option; - public ExtensionSlider slider; - public int intValue; - public float floatValue; - public int currentWidth; - public boolean isFloat; - public boolean dragging = false; - - public SubSlider(Button parent, ModuleOption option) { - super(parent.window.getX() + 4, parent.getY() + 4, parent.window.getWidth() - 8, 12); - this.parent = parent; - this.window = parent.window; - this.slider = (ExtensionSlider) option.extended; - if (this.isFloat = this.slider.dataType == ExtensionType.VALUE_FLOAT) { - this.floatValue = (float) option.getValue(); - } else { - this.intValue = (int) (Object) option.getValue(); - } - this.option = option; - } - - public void processMouseClick(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.isMouseHovered()) { - if (button == 0) { - this.dragging = true; - } - } - } - - public void processMouseRelease(int mouseX, int mouseY, int button) { - this.updateIsMouseHovered(mouseX, mouseY); - if (this.dragging && button == 0) { - this.dragging = false; - this.getWidthFromValue(); - } - } - - public void draw(int mouseX, int mouseY) { - if (this.dragging) { - this.currentWidth = mouseX - this.getX(); - if (this.currentWidth < 0) { - this.currentWidth = 0; - } else if (this.currentWidth > 92) { - this.currentWidth = 92; - } - this.updateValueFromWidth(); - } - this.y = this.window.getRenderYButton(); - this.x = this.window.getX() + 4; - this.updateIsMouseHovered(mouseX, mouseY); - PepsiUtils.drawRect(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.height, ColorUtils.BACKGROUND); - PepsiUtils.drawRect(this.getX(), this.getY(), this.getX() + this.currentWidth, this.getY() + this.height, this.getColor()); - GL11.glColor3f(0f, 0f, 0f); - mc.fontRenderer.drawString(this.option.displayName + ": " + (this.isFloat ? PepsiUtils.roundFloatForSlider(this.floatValue) : this.intValue), this.getX() + 2, this.getY() + 2, Color.BLACK.getRGB()); - } - - public void updateValueFromWidth() { - float val = (this.currentWidth / 92f); - val *= (this.getMax() - this.getMin()); - val += this.getMin(); - val = PepsiUtils.round(val, this.getStep()); - val = PepsiUtils.ensureRange(val, this.getMin(), this.getMax()); - if (this.isFloat) { - this.floatValue = val; - this.option.setValue(val); - } else { - this.intValue = (int) val; - this.option.setValue((int) val); - } - } - - public float getMax() { - float val = this.isFloat ? (float) this.slider.max : ((int) this.slider.max) + 0.0f; - return val; - } - - public float getMin() { - float val = this.isFloat ? (float) this.slider.min : ((int) this.slider.min) + 0.0f; - return val; - } - - public float getStep() { - float val = this.isFloat ? (float) this.slider.step : ((int) this.slider.step) + 0.0f; - return val; - } - - public int getWidthFromValue() { - float val = this.isFloat ? this.floatValue : this.intValue + 0.0f; - val -= this.getMin(); - val /= (this.getMax() - this.getMin()); - val *= 92; - return this.currentWidth = PepsiUtils.ensureRange((int) val, 0, 92); - } - - public int getX() { - return this.x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return this.y; - } - - public void setY(int y) { - this.y = y; - } - - public int getHeight() { - return this.height; - } - - public int getWidth() { - return this.width; - } - - public int getColor() { - return ColorUtils.getColorForGuiEntry(ColorUtils.TYPE_SLIDER, this.isMouseHovered(), false); - } - - public boolean shouldRender() { - return this.parent.isOpen && this.parent.shouldRender(); - } - - public void openGui() { - if (this.isFloat) { - this.floatValue = (float) this.option.getValue(); - } else { - this.intValue = (int) (Object) this.option.getValue(); - } - this.getWidthFromValue(); - } - - public String getName() { - return this.option.getName(); - } - - public boolean isOpen() { - return false; - } - - public void setOpen(boolean val) { - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowCombat.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowCombat.java deleted file mode 100644 index 4b076b7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowCombat.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.window; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; - -public class WindowCombat extends Window { - - public WindowCombat() { - super(104, 2, "Combat", ModuleCategory.COMBAT); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMisc.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMisc.java deleted file mode 100644 index 4b0023f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMisc.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.window; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; - -public class WindowMisc extends Window { - - public WindowMisc() { - super(206, 2, "Misc", ModuleCategory.MISC); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMovement.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMovement.java deleted file mode 100644 index bf03225..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowMovement.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.window; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; - -public class WindowMovement extends Window { - - public WindowMovement() { - super(308, 2, "Movement", ModuleCategory.MOVEMENT); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowPlayer.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowPlayer.java deleted file mode 100644 index 9bad844..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowPlayer.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.window; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; - -public class WindowPlayer extends Window { - - public WindowPlayer() { - super(410, 2, "Player", ModuleCategory.PLAYER); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowRender.java b/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowRender.java deleted file mode 100644 index b4f20e9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/clickgui/window/WindowRender.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.clickgui.window; - -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; - -public class WindowRender extends Window { - - public WindowRender() { - super(2, 2, "Render", ModuleCategory.RENDER); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiButtonMCLeaks.java b/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiButtonMCLeaks.java deleted file mode 100644 index fa13d8f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiButtonMCLeaks.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.mcleaks; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.ResourceLocation; - -public class GuiButtonMCLeaks extends GuiButton { - private ResourceLocation location; - - public GuiButtonMCLeaks(int buttonId, int x, int y, int widthIn, int heightIn) { - super(buttonId, x, y, widthIn, heightIn, ""); - this.width = 20; - this.height = 20; - this.enabled = true; - this.visible = true; - this.id = buttonId; - this.x = x; - this.y = y; - this.width = widthIn; - this.height = heightIn; - this.location = null; - } - - @Override - public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) { - if (this.location == null) { - this.location = new ResourceLocation("pepsimod", "textures/gui/pepsibuttons.png"); - } - if (this.visible) { - mc.getTextureManager().bindTexture(this.location); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - int k = this.getHoverState(this.hovered); - GlStateManager.enableBlend(); - GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); - GlStateManager.blendFunc(770, 771); - this.drawTexturedModalRect(this.x, this.y, 0, (this.hovered ? 20 : 0), this.width, this.height); - this.drawTexturedModalRect(this.x + this.width, this.y, 200 - this.width, k * 20, this.width, this.height); - this.mouseDragged(mc, mouseX, mouseY); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiScreenMCLeaks.java b/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiScreenMCLeaks.java deleted file mode 100644 index b7e5d34..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/mcleaks/GuiScreenMCLeaks.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.mcleaks; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import net.daporkchop.pepsimod.util.AccountManager; -import net.daporkchop.pepsimod.util.HTTPUtils; -import net.daporkchop.pepsimod.util.MCLeaks; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.util.Session; -import org.lwjgl.input.Keyboard; - -import java.io.IOException; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -public class GuiScreenMCLeaks extends GuiScreen { - public Minecraft mc; - public GuiScreen prevScreen; - private GuiTextField tokenField; - - public GuiScreenMCLeaks(GuiScreen screen, Minecraft minecraft) { - this.mc = minecraft; - this.prevScreen = screen; - } - - public void updateScreen() { - this.tokenField.updateCursorCounter(); - } - - /** - * Adds the buttons (and other controls) to the screen in question. Called when the GUI is displayed and when the - * window resizes, the buttonList is cleared beforehand. - */ - public void initGui() { - Keyboard.enableRepeatEvents(true); - this.buttonList.clear(); - this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 18, "Log in")); - this.buttonList.add(new GuiButton(1, this.width / 2 + 2, this.height / 4 + 120 + 18, 98, 20, "Back")); - this.buttonList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 120 + 18, 98, 20, "Original")); - this.tokenField = new GuiTextField(1, this.fontRenderer, this.width / 2 - 100, 106, 200, 20); - this.tokenField.setMaxStringLength(128); - this.tokenField.setText(""); - this.buttonList.get(0).enabled = !this.tokenField.getText().isEmpty(); - } - - /** - * Called when the screen is unloaded. Used to disable keyboard repeat events - */ - public void onGuiClosed() { - Keyboard.enableRepeatEvents(false); - } - - /** - * Called by the controls from the buttonList when activated. (Mouse pressed for buttons) - */ - protected void actionPerformed(GuiButton button) throws IOException { - if (button.enabled) { - if (button.id == 1) { - this.mc.displayGuiScreen(this.prevScreen); - } else if (button.id == 0) { - MCLeaks.RedeemResponse response = MCLeaks.redeemToken(this.tokenField.getText()); - if (response.success) { - String idJson = HTTPUtils.performGetRequest(HTTPUtils.constantURL("https://api.mojang.com/users/profiles/minecraft/" + response.getName())); - JsonObject json = (new JsonParser()).parse(idJson).getAsJsonObject(); - String UUID = json.get("id").getAsString(); - - Session session = new Session(response.getName(), UUID, response.getSession(), "mojang"); - - try { - new AccountManager().setSession(session); - } catch (Exception e) { - e.printStackTrace(); - } - this.tokenField.setText(""); - } - - pepsimod.isMcLeaksAccount = true; - } else if (button.id == 2) { - if (pepsimod.originalSession != null) { - try { - new AccountManager().setSession(pepsimod.originalSession); - pepsimod.isMcLeaksAccount = false; - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - } - - /** - * Fired when a key is typed (except F11 which toggles full screen). This is the equivalent of - * KeyListener.keyTyped(KeyEvent e). Args : character (character on the key), keyCode (lwjgl Keyboard key code) - */ - protected void keyTyped(char typedChar, int keyCode) throws IOException //TODO: obfuscate password - { - this.tokenField.textboxKeyTyped(typedChar, keyCode); - - if (keyCode == 15) { - this.tokenField.setFocused(!this.tokenField.isFocused()); - } - - if (keyCode == 28 || keyCode == 156) { - this.actionPerformed(this.buttonList.get(0)); - } - } - - /** - * Called when the mouse is clicked. Args : mouseX, mouseY, clickedButton - */ - protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { - super.mouseClicked(mouseX, mouseY, mouseButton); - this.tokenField.mouseClicked(mouseX, mouseY, mouseButton); - } - - /** - * Draws the screen and all the components in it. - */ - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.buttonList.get(0).enabled = !this.tokenField.getText().isEmpty(); - this.drawDefaultBackground(); - this.drawCenteredString(this.fontRenderer, "\u00A79\u00A7lMCLeaks login", this.width / 2, 17, 16777215); - this.drawCenteredString(this.fontRenderer, "Username: " + this.mc.getSession().getUsername(), this.width / 2, 27, 10526880); - this.drawCenteredString(this.fontRenderer, "UUID: " + this.mc.getSession().getPlayerID(), this.width / 2, 37, 10526880); - this.tokenField.drawTextBox(); - super.drawScreen(mouseX, mouseY, partialTicks); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/gui/misc/GuiButtonTooBeeTooTee.java b/src/main/java/net/daporkchop/pepsimod/gui/misc/GuiButtonTooBeeTooTee.java deleted file mode 100644 index 6935243..0000000 --- a/src/main/java/net/daporkchop/pepsimod/gui/misc/GuiButtonTooBeeTooTee.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.gui.misc; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.ResourceLocation; - -public class GuiButtonTooBeeTooTee extends GuiButton { - private ResourceLocation location; - - public GuiButtonTooBeeTooTee(int buttonId, int x, int y, int widthIn, int heightIn) { - super(buttonId, x, y, widthIn, heightIn, ""); - this.width = 20; - this.height = 20; - this.enabled = true; - this.visible = true; - this.id = buttonId; - this.x = x; - this.y = y; - this.width = widthIn; - this.height = heightIn; - this.location = null; - } - - @Override - public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) { - if (this.location == null) { - this.location = new ResourceLocation("pepsimod", "textures/gui/pepsibuttons.png"); - } - if (this.visible) { - mc.getTextureManager().bindTexture(this.location); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - int k = this.getHoverState(this.hovered); - GlStateManager.enableBlend(); - GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); - GlStateManager.blendFunc(770, 771); - this.drawTexturedModalRect(this.x, this.y, 20, (this.hovered ? 20 : 0), this.width, this.height); - this.drawTexturedModalRect(this.x + this.width, this.y, 200 - this.width, k * 20, this.width, this.height); - this.mouseDragged(mc, mouseX, mouseY); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/key/KeyRegistry.java b/src/main/java/net/daporkchop/pepsimod/key/KeyRegistry.java deleted file mode 100644 index 2b78b18..0000000 --- a/src/main/java/net/daporkchop/pepsimod/key/KeyRegistry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.key; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; - -public class KeyRegistry { - @SubscribeEvent - public void onKeyPress(InputEvent.KeyInputEvent event) { - for (Module module : ModuleManager.AVALIBLE_MODULES) { - if (module.keybind != null && module.keybind.isPressed()) { - ModuleManager.toggleModule(module); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/misc/TickRate.java b/src/main/java/net/daporkchop/pepsimod/misc/TickRate.java deleted file mode 100644 index eb6e8b3..0000000 --- a/src/main/java/net/daporkchop/pepsimod/misc/TickRate.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.misc; - -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.SPacketTimeUpdate; - -import java.text.DecimalFormat; - -public class TickRate { - public static float TPS = 20.0f; - - public static long lastUpdate = -1; - - public static float[] tpsCounts = new float[10]; - - public static DecimalFormat format = new DecimalFormat("##.0#"); - - public static void update(Packet packet) { - if (!(packet instanceof SPacketTimeUpdate)) { - return; - } - - long currentTime = System.currentTimeMillis(); - - if (lastUpdate == -1) { - lastUpdate = currentTime; - return; - } - long timeDiff = currentTime - lastUpdate; - float tickTime = timeDiff / 20; - if (tickTime == 0) { - tickTime = 50; - } - float tps = 1000 / tickTime; - if (tps > 20.0f) { - tps = 20.0f; - } - System.arraycopy(tpsCounts, 0, tpsCounts, 1, tpsCounts.length - 1); - tpsCounts[0] = tps; - - double total = 0.0; - for (float f : tpsCounts) { - total += f; - } - total /= tpsCounts.length; - - if (total > 20.0) { - total = 20.0; - } - - TPS = Float.parseFloat(format.format(total)); - lastUpdate = currentTime; - } - - public static void reset() { - for (int i = 0; i < tpsCounts.length; i++) { - tpsCounts[i] = 20.0f; - } - TPS = 20.0f; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/misc/data/DataLoader.java b/src/main/java/net/daporkchop/pepsimod/misc/data/DataLoader.java deleted file mode 100644 index a02c5d9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/misc/data/DataLoader.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.misc.data; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.mojang.authlib.GameProfile; -import net.daporkchop.lib.common.function.io.IOConsumer; -import net.daporkchop.lib.common.function.io.IOFunction; -import net.daporkchop.lib.common.function.io.IOSupplier; -import net.daporkchop.pepsimod.PepsimodMixinLoader; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.render.Texture; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.entity.player.EntityPlayer; -import org.lwjgl.opengl.GLContext; - -import javax.swing.ImageIcon; -import javax.swing.JOptionPane; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -/** - * @author DaPorkchop_ - */ -public class DataLoader extends PepsiConstants { - protected final String resourcesUrl; - protected final File cache; - protected final JsonObject root; - protected IOFunction readerFunction; - - public Groups groups = new Groups(); - public final Map localeKeys = new HashMap<>(); - public MainMenu mainMenu = new MainMenu(); - - public DataLoader(String resourcesUrl, File cache) { - this.resourcesUrl = Objects.requireNonNull(resourcesUrl, "resourcesUrl"); - this.cache = cache; - - if (!cache.exists() && !cache.mkdirs()) { - throw new IllegalStateException(String.format("Unable to create directory: %s", cache.getAbsolutePath())); - } - - this.root = this.getResourcesRoot(); - { - String baseurl = this.root.get("baseurl").getAsString(); - this.readerFunction = PepsimodMixinLoader.isObfuscatedEnvironment ? - s -> new URL(String.format("%s%s", baseurl, s)).openStream() : - s -> new BufferedInputStream(new FileInputStream(new File(String.format("../resources/%s", s)))); - } - } - - public void load() { - JsonObject data = this.root.get("data").getAsJsonObject(); - if (data.has("groups")) { - JsonObject json = this.readJson(data.get("groups").getAsString()); - - Groups groups = new Groups(); - StreamSupport.stream(json.getAsJsonArray("groups").spliterator(), false) - .map(JsonElement::getAsString) - .map((IOFunction) this::readJson) - .forEach((IOConsumer) object -> { - int color = 0x000000; - if (object.has("color")) { - JsonObject colorJson = object.getAsJsonObject("color"); - color = (colorJson.get("r").getAsInt() << 16) | - (colorJson.get("g").getAsInt() << 8) | - (colorJson.get("b").getAsInt()); - } - groups.addGroup(new Group( - object.get("id").getAsString(), - object.has("name") ? object.get("name").getAsString() : null, - StreamSupport.stream(object.getAsJsonArray("members").spliterator(), false) - .map(JsonElement::getAsString) - .map(UUID::fromString) - .collect(Collectors.toSet()), - color, - object.has("cape") ? this.readTexture(object.get("cape").getAsString()) : null, - object.has("icon") ? this.readTexture(object.get("icon").getAsString()) : null - )); - }); - - Groups oldGroups = this.groups; - this.groups = groups; - oldGroups.close(); - } - - if (data.has("lang")) { - JsonObject json = this.readJson(data.get("lang").getAsString()); - Map internalMap = ReflectionStuff.getLanguageMapMap(); - Map ourMap = new HashMap<>(); - for (Map.Entry entry : json.getAsJsonObject("translations").entrySet()) { - ourMap.put(entry.getKey(), entry.getValue().getAsString()); - } - this.localeKeys.forEach(internalMap::remove); - internalMap.putAll(ourMap); - this.localeKeys.clear(); - this.localeKeys.putAll(ourMap); - } - - if (data.has("mainmenu")) { - JsonObject json = this.readJson(data.get("mainmenu").getAsString()); - this.mainMenu.setup( - StreamSupport.stream(json.getAsJsonArray("splashes").spliterator(), false) - .map(JsonElement::getAsString) - .toArray(String[]::new), - this.readTexture(json.get("banner").getAsString()) - ); - } - } - - public Group getGroup(EntityPlayer entity) { - return this.getGroup(entity.getGameProfile()); - } - - public Group getGroup(NetworkPlayerInfo info) { - return this.getGroup(info.getGameProfile()); - } - - public Group getGroup(GameProfile profile) { - return this.getGroup(profile.getId()); - } - - public Group getGroup(UUID uuid) { - return this.groups.playerToGroup.get(uuid); - } - - protected JsonObject getResourcesRoot() { - if (PepsimodMixinLoader.isObfuscatedEnvironment) { - return this.readJson(this.read( - "/resources.json", - () -> new URL(this.resourcesUrl).openStream(), - new File(this.cache, "resources.json") - )); - } else { - return this.readJson(this.read( - "/resources.json", - () -> new BufferedInputStream(new FileInputStream(new File("../resources/resources.json"))), - new File(this.cache, "resources.json") - )); - } - } - - protected byte[] read(String path) { - return this.read(path, () -> this.readerFunction.apply(path), new File(this.cache, path.replace('/', File.separatorChar))); - } - - protected byte[] read(String path, IOSupplier inSupplier, File cached) { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (InputStream in = inSupplier.get()) { - int i; - while ((i = in.read()) != -1) { - baos.write(i); - } - } catch (IOException e) { - if (cached.exists()) { - //attempt to load from cache if error occurred while loading - baos.reset(); - try (InputStream in = new BufferedInputStream(new FileInputStream(cached))) { - int i; - while ((i = in.read()) != -1) { - baos.write(i); - } - } catch (IOException e1) { - throw new RuntimeException(e1); - } - } else { - throw new RuntimeException(e); - } - } - byte[] b = baos.toByteArray(); - try { - //write to cache - if (!cached.exists()) { - File parent = cached.getParentFile(); - if (!parent.exists() && !parent.mkdirs()) { - throw new IllegalStateException(String.format("Unable to create directory: %s", parent.getAbsolutePath())); - } else if (!cached.createNewFile()) { - throw new IllegalStateException(String.format("Unable to create file: %s", cached.getAbsolutePath())); - } - } - try (OutputStream out = new FileOutputStream(cached)) { - out.write(b); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return b; - } catch (RuntimeException e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - null, - String.format("Unable to load resource: \"%s\"", path), - "pepsimod load error", - JOptionPane.ERROR_MESSAGE, - new ImageIcon(PepsiUtils.PEPSI_LOGO) - ); - throw e; - } - } - - protected JsonObject readJson(byte[] in) { - try { - return new JsonParser().parse(new InputStreamReader(new ByteArrayInputStream(in), "UTF-8")).getAsJsonObject(); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("go buy a computer that isn't shit", e); - } - } - - protected JsonObject readJson(String path) { - return this.readJson(this.read(path)); - } - - protected Texture readTexture(String path) { - try { - return new Texture(this.read(path)); - } catch (IOException e) { - throw new RuntimeException(String.format("Unable to parse texture: %s", path), e); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/misc/data/Group.java b/src/main/java/net/daporkchop/pepsimod/misc/data/Group.java deleted file mode 100644 index b45662d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/misc/data/Group.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.misc.data; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.render.Texture; - -import java.util.Collections; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -/** - * A single group of players. A group may set some additional attributes about a player, such as their background color in the tab list, an icon - * next to their player name, or their cape/elytra texture. - * - * @author DaPorkchop_ - */ -public class Group extends PepsiConstants implements AutoCloseable { - public final String id; - public final String name; - public final Set members; - public final int color; - public final AtomicReference cape = new AtomicReference<>(null); - public final AtomicReference icon = new AtomicReference<>(null); - - public Group(String id, String name, Set members, int color, Texture cape, Texture icon) { - this.id = Objects.requireNonNull(id, "id"); - this.name = name == null ? id : name; - this.members = Collections.unmodifiableSet(Objects.requireNonNull(members, "members")); - this.color = color & 0xFFFFFF; - this.cape.set(cape); - this.icon.set(icon); - } - - public void doWithCapeIfPresent(Consumer callback) { - Texture cape = this.cape.get(); - if (cape != null) { - callback.accept(cape); - } - } - - public void doWithIconIfPresent(Consumer callback) { - Texture icon = this.icon.get(); - if (icon != null) { - callback.accept(icon); - } - } - - @Override - public void close() { - this.cape.updateAndGet(loc -> { - if (loc != null) { - loc.close(); - } - return null; - }); - this.icon.updateAndGet(loc -> { - if (loc != null) { - loc.close(); - } - return null; - }); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/misc/data/Groups.java b/src/main/java/net/daporkchop/pepsimod/misc/data/Groups.java deleted file mode 100644 index af5641b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/misc/data/Groups.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.misc.data; - -import net.daporkchop.pepsimod.util.PepsiConstants; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.UUID; - -/** - * @author DaPorkchop_ - */ -public class Groups extends PepsiConstants implements AutoCloseable { - protected Map playerToGroup = Collections.emptyMap(); - protected Collection groups = Collections.emptyList(); - - public void addGroup(Group group) { - if (this.groups.isEmpty()) { - this.groups = new HashSet<>(); - } - this.groups.add(group); - group.members.forEach(uuid -> this.addPlayerMapping(uuid, group)); - } - - public void addPlayerMapping(UUID uuid, Group group) { - if (this.playerToGroup.isEmpty()) { - this.playerToGroup = new HashMap<>(); - } - this.playerToGroup.put(uuid, group); - } - - @Override - public void close() { - this.groups.forEach(Group::close); - - this.playerToGroup.clear(); - this.groups.clear(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/misc/data/MainMenu.java b/src/main/java/net/daporkchop/pepsimod/misc/data/MainMenu.java deleted file mode 100644 index f53caaa..0000000 --- a/src/main/java/net/daporkchop/pepsimod/misc/data/MainMenu.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.misc.data; - -import net.daporkchop.pepsimod.util.render.Texture; - -import java.util.Objects; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; - -/** - * Contains additional data injected by pepsimod into Minecraft's main menu - * - * @author DaPorkchop_ - */ -public class MainMenu implements AutoCloseable { - protected String[] splashes; - public Texture banner; - - public void setup(String[] splashes, Texture banner) { - if (this.banner != null) { - this.close(); - } - this.splashes = Objects.requireNonNull(splashes, "splashes"); - this.banner = Objects.requireNonNull(banner, "banner"); - } - - public String getRandomSplash() { - Random r = ThreadLocalRandom.current(); - String[] colors = { - "\u00A71", - "\u00A79", - "\u00A7a", - "\u00A7b", - "\u00A7c", - "\u00A7f", - }; - return colors[r.nextInt(colors.length)] + this.splashes[r.nextInt(this.splashes.length)]; - } - - @Override - public void close() { - this.banner.close(); - this.splashes = null; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlock.java b/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlock.java deleted file mode 100644 index c8b9685..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlock.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.block; - -import net.daporkchop.pepsimod.module.impl.misc.AnnouncerMod; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.movement.NoClipMod; -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.daporkchop.pepsimod.optimization.BlockID; -import net.daporkchop.pepsimod.util.config.impl.XrayTranslator; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(Block.class) -public abstract class MixinBlock extends net.minecraftforge.registries.IForgeRegistryEntry.Impl implements BlockID { - public int pepsimod_id = 0; - - @Override - public int getBlockId() { - return this.pepsimod_id; - } - - @Override - public void internal_setBlockId(int id) { - this.pepsimod_id = id; - } - - @Inject( - method = "Lnet/minecraft/block/Block;isFullCube(Lnet/minecraft/block/state/IBlockState;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsFullCube(IBlockState state, CallbackInfoReturnable callbackInfoReturnable) { - if (pepsimod.hasInitializedModules) { - if (XrayMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(XrayTranslator.INSTANCE.isTargeted(this)); - } else if (FreecamMod.INSTANCE.state.enabled || NoClipMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - } - } - } - - @Inject( - method = "Lnet/minecraft/block/Block;shouldSideBeRendered(Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumFacing;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preShouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side, CallbackInfoReturnable callbackInfo) { - if (pepsimod.hasInitializedModules) { - if (XrayMod.INSTANCE.state.enabled) { - callbackInfo.setReturnValue(true); - callbackInfo.cancel(); - } - } - //vanilla code follows - } - - @Inject( - method = "Lnet/minecraft/block/Block;onPlayerDestroy(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/state/IBlockState;)V", - at = @At("HEAD") - ) - public void preOnPlayerDestroy(World worldIn, BlockPos pos, IBlockState state, CallbackInfo callbackInfo) { - if (worldIn.isRemote) { - AnnouncerMod.INSTANCE.onBreakBlock(state); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockLiquid.java b/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockLiquid.java deleted file mode 100644 index 66bf573..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockLiquid.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.block; - -import net.daporkchop.pepsimod.module.impl.movement.JesusMod; -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.minecraft.block.Block; -import net.minecraft.block.BlockLiquid; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -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; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(BlockLiquid.class) -public abstract class MixinBlockLiquid extends Block { - protected MixinBlockLiquid() { - super(null); - } - - @Inject( - method = "Lnet/minecraft/block/BlockLiquid;isPassable(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/util/math/BlockPos;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsPassable(IBlockAccess worldIn, BlockPos pos, CallbackInfoReturnable callbackInfoReturnable) { - if (pepsimod.hasInitializedModules) { - if (XrayMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(true); - } - } - } - - @Inject( - method = "Lnet/minecraft/block/BlockLiquid;getCollisionBoundingBox(Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/math/AxisAlignedBB;", - at = @At("HEAD"), - cancellable = true - ) - public void preGetCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos, CallbackInfoReturnable callbackInfoReturnable) { - if (pepsimod.hasInitializedModules) { - if (JesusMod.INSTANCE.shouldBeSolid()) { - callbackInfoReturnable.setReturnValue(FULL_BLOCK_AABB); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSlab.java b/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSlab.java deleted file mode 100644 index 5ed396b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSlab.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.block; - -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.minecraft.block.Block; -import net.minecraft.block.BlockSlab; -import net.minecraft.block.state.IBlockState; -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.CallbackInfoReturnable; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(BlockSlab.class) -public abstract class MixinBlockSlab extends Block { - protected MixinBlockSlab() { - super(null); - } - - @Inject( - method = "Lnet/minecraft/block/BlockSlab;isFullCube(Lnet/minecraft/block/state/IBlockState;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsFullCube(IBlockState state, CallbackInfoReturnable callbackInfoReturnable) { - if (pepsimod.hasInitializedModules) { - if (FreecamMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSoulSand.java b/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSoulSand.java deleted file mode 100644 index 6af4983..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/block/MixinBlockSoulSand.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.block; - -import net.daporkchop.pepsimod.module.impl.movement.NoSlowdownMod; -import net.minecraft.block.BlockSoulSand; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(BlockSoulSand.class) -public abstract class MixinBlockSoulSand { - @ModifyConstant( - method = "Lnet/minecraft/block/BlockSoulSand;onEntityCollision(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/entity/Entity;)V", - constant = @Constant( - doubleValue = 0.4d - )) - public double changeSpeed(double oldMultiplier) { - return NoSlowdownMod.INSTANCE.state.enabled ? 1.0d : oldMultiplier; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java deleted file mode 100644 index 5db3530..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.PepsimodMixinLoader; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.impl.render.UnfocusedCPUMod; -import net.daporkchop.pepsimod.module.impl.render.ZoomMod; -import net.daporkchop.pepsimod.util.config.impl.CpuLimitTranslator; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.multiplayer.PlayerControllerMP; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.fml.common.FMLLog; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.Display; -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; - -import javax.imageio.ImageIO; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; -import static net.daporkchop.pepsimod.util.PepsiConstants.mcStartedSuccessfully; -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(Minecraft.class) -public abstract class MixinMinecraft { - @Shadow - public EntityPlayerSP player; - - @Shadow - private ByteBuffer readImageToBuffer(InputStream imageStream) throws IOException { - return null; - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;shutdown()V", - at = @At("HEAD") - ) - public void saveSettingsOnShutdown(CallbackInfo ci) { - if (mcStartedSuccessfully) { - System.out.println("[PEPSIMOD] Saving config..."); - pepsimod.saveConfig(); - System.out.println("[PEPSIMOD] Saved."); - - if (ZoomMod.INSTANCE.state.enabled) { - ModuleManager.disableModule(ZoomMod.INSTANCE); - mc.gameSettings.fovSetting = ZoomMod.INSTANCE.fov; - } - } - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;runGameLoop()V", - at = @At("RETURN") - ) - public void postOnClientPreTick(CallbackInfo callbackInfo) { - if (mcStartedSuccessfully && mc.player != null && mc.player.movementInput != null) { // is ingame - for (Module module : ModuleManager.AVALIBLE_MODULES) { - if (module.shouldTick()) { - module.tick(); - } - } - } - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;runTickMouse()V", - at = @At( - value = "INVOKE_ASSIGN", - target = "Lorg/lwjgl/input/Mouse;getEventButton()I" - )) - public void onMouseClick(CallbackInfo ci) { - try { - if (Mouse.getEventButtonState()) { - int buttonID = Mouse.getEventButton(); - switch (buttonID) { - case 2: - if (Minecraft.getMinecraft().objectMouseOver != null) { - RayTraceResult result = Minecraft.getMinecraft().objectMouseOver; - if (result.typeOfHit == RayTraceResult.Type.ENTITY && result.entityHit instanceof EntityPlayer) { - if (FriendsTranslator.INSTANCE.isFriend(result.entityHit)) { - this.player.sendMessage(new TextComponentString(Pepsimod.CHAT_PREFIX + "Removed \u00A7c" + result.entityHit.getName() + "\u00A7r as a friend")); - FriendsTranslator.INSTANCE.friends.remove(result.entityHit.getUniqueID()); - } else { - this.player.sendMessage(new TextComponentString(Pepsimod.CHAT_PREFIX + "Added \u00A79" + result.entityHit.getName() + "\u00A7r as a friend")); - FriendsTranslator.INSTANCE.friends.add(result.entityHit.getUniqueID()); - } - } - FMLLog.log.info(result.entityHit.getClass().getCanonicalName()); - } - break; - } - } - } catch (NullPointerException e) { - //wtf who cares - } - } - - @Redirect( - method = "Lnet/minecraft/client/Minecraft;createDisplay()V", - at = @At( - value = "INVOKE", - target = "Lorg/lwjgl/opengl/Display;setTitle(Ljava/lang/String;)V" - )) - public void changeWindowTitle(String title) { - Display.setTitle(Pepsimod.NAME_VERSION + (PepsimodMixinLoader.isObfuscatedEnvironment ? "" : " (dev environment)")); - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;setWindowIcon()V", - at = @At("HEAD"), - cancellable = true - ) - public void preSetWindowIcon(CallbackInfo callbackInfo) { - try { - BufferedImage img = ImageIO.read(Pepsimod.class.getResourceAsStream("/pepsilogo.png")); - List sizes = new ArrayList<>(); - int w = img.getWidth(); - do { - BufferedImage tmp = new BufferedImage(w, w, img.getType()); - tmp.createGraphics().drawImage(img, 0, 0, w, w, null); - sizes.add(this.convertImageToBuffer(tmp)); - w >>= 1; - } while (w >= 8); - Display.setIcon(sizes.toArray(new ByteBuffer[sizes.size()])); - callbackInfo.cancel(); - } catch (IOException e) { - e.printStackTrace(); - //thonk - } - - //in case of exception vanilla code will run - } - - @Inject(method = "displayGuiScreen", at = @At("HEAD")) - public void preDisplayGuiScreen(GuiScreen guiScreen, CallbackInfo callbackInfo) { - if (mcStartedSuccessfully && ZoomMod.INSTANCE.state.enabled) { - ModuleManager.disableModule(ZoomMod.INSTANCE); - mc.gameSettings.fovSetting = ZoomMod.INSTANCE.fov; - } - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;getLimitFramerate()I", - at = @At("HEAD"), - cancellable = true - ) - public void preGetLimitFramerate(CallbackInfoReturnable callbackInfoReturnable) { - try { - if (UnfocusedCPUMod.INSTANCE.state.enabled && !Display.isActive()) { - callbackInfoReturnable.setReturnValue(CpuLimitTranslator.INSTANCE.limit); - } - } catch (NullPointerException e) { - } - } - - @Inject( - method = "Lnet/minecraft/client/Minecraft;processKeyBinds()V", - at = @At("HEAD") - ) - public void preProcessKeyBinds(CallbackInfo ci) { - // If . is typed open GuiChat - // Bypass the keybind system because the command prefix is not configurable - if (mcStartedSuccessfully && mc.currentScreen == null && Keyboard.getEventCharacter() == '.') { - mc.displayGuiScreen(new GuiChat(".")); - } - } - - @Redirect( - method = "Lnet/minecraft/client/Minecraft;clickMouse()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/multiplayer/PlayerControllerMP;attackEntity(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/entity/Entity;)V" - )) - public void preventAttackingRiddenEntity(PlayerControllerMP controller, EntityPlayer attacker, Entity attacked) { - if (!attacked.isPassenger(attacker)) { - controller.attackEntity(attacker, attacked); - } - } - - - private ByteBuffer convertImageToBuffer(BufferedImage bufferedimage) throws IOException { - int[] aint = bufferedimage.getRGB(0, 0, bufferedimage.getWidth(), bufferedimage.getHeight(), null, 0, bufferedimage.getWidth()); - ByteBuffer bytebuffer = ByteBuffer.allocate(4 * aint.length); - - for (int i : aint) { - bytebuffer.putInt(i << 8 | i >> 24 & 255); - } - - bytebuffer.flip(); - return bytebuffer; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinAbstractClientPlayer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinAbstractClientPlayer.java deleted file mode 100644 index dda0e26..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinAbstractClientPlayer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.entity; - -import net.daporkchop.pepsimod.misc.data.Group; -import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.ResourceLocation; -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.CallbackInfoReturnable; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(AbstractClientPlayer.class) -public abstract class MixinAbstractClientPlayer extends EntityPlayer { - public MixinAbstractClientPlayer() { - super(null, null); - } - - @Shadow - protected abstract NetworkPlayerInfo getPlayerInfo(); - - @Inject( - method = "Lnet/minecraft/client/entity/AbstractClientPlayer;getLocationCape()Lnet/minecraft/util/ResourceLocation;", - at = @At("HEAD"), - cancellable = true - ) - public void preGetLocationCape(CallbackInfoReturnable callbackInfo) { - if (this.getPlayerInfo() != null) { - Group group = pepsimod.data.getGroup(this.getPlayerInfo()); - if (group != null) { - group.doWithCapeIfPresent(tex -> callbackInfo.setReturnValue(tex.texture)); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinEntityPlayerSP.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinEntityPlayerSP.java deleted file mode 100644 index 4b782a9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/entity/MixinEntityPlayerSP.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.entity; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.misc.HUDMod; -import net.daporkchop.pepsimod.module.impl.movement.FlightMod; -import net.daporkchop.pepsimod.module.impl.movement.NoSlowdownMod; -import net.daporkchop.pepsimod.module.impl.movement.StepMod; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RotationUtils; -import net.daporkchop.pepsimod.util.event.MoveEvent; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.entity.Entity; -import net.minecraft.entity.MoverType; -import net.minecraft.network.play.client.CPacketEntityAction; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.util.math.AxisAlignedBB; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -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; - -@Mixin(EntityPlayerSP.class) -public abstract class MixinEntityPlayerSP extends AbstractClientPlayer { - @Shadow - @Final - public NetHandlerPlayClient connection; - @Shadow - protected Minecraft mc; - - public MoveEvent event = new MoveEvent(); - - public MixinEntityPlayerSP() { - super(null, null); - } - - @Overwrite - public void move(MoverType type, double x, double y, double z) { - this.event.x = x; - this.event.y = y; - this.event.z = z; - for (Module module : ModuleManager.ENABLED_MODULES) { - module.onPlayerMove(this.event); - } - super.move(type, this.event.x, this.event.y, this.event.z); - } - - @Redirect( - method = "Lnet/minecraft/client/entity/EntityPlayerSP;onLivingUpdate()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/Entity;isRiding()Z" - )) - public boolean fixNoSlowdown(Entity entity) { - return entity.isRiding() && NoSlowdownMod.INSTANCE.state.enabled; - } - - @Shadow - protected boolean isCurrentViewEntity() { - return false; - } - - @Inject( - method = "Lnet/minecraft/client/entity/EntityPlayerSP;isAutoJumpEnabled()Z", - at = @At("HEAD"), - cancellable = true - ) - public void preisAutoJumpEnabled(CallbackInfoReturnable callbackInfoReturnable) { - if (StepMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - } - } - - @Inject( - method = "Lnet/minecraft/client/entity/EntityPlayerSP;setServerBrand(Ljava/lang/String;)V", - at = @At("HEAD") - ) - public void setHUDBrand(String brand, CallbackInfo callbackInfo) { - HUDMod.INSTANCE.serverBrand = brand; - } - - //pepsimod: prevent guis from being impossible to open while in a portal - @Redirect( - method = "Lnet/minecraft/client/entity/EntityPlayerSP;onLivingUpdate()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/entity/EntityPlayerSP;closeScreen()V", - ordinal = 0 - )) - public void fixPortalGUIs_1(EntityPlayerSP player) { - } - - @Redirect( - method = "Lnet/minecraft/client/entity/EntityPlayerSP;onLivingUpdate()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V", - ordinal = 0 - )) - public void fixPortalGUIs_2(Minecraft mc, GuiScreen screen) { - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiBossOverlay.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiBossOverlay.java deleted file mode 100644 index 0db1396..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiBossOverlay.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.util.BossinfoCounted; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.BossInfoClient; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiBossOverlay; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.network.play.server.SPacketUpdateBossInfo; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.BossInfo; -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.callback.CallbackInfo; - -import java.util.ArrayList; -import java.util.Map; -import java.util.UUID; - -/** - * I made this for Future! - * of course i added it here :P - */ -@Mixin(GuiBossOverlay.class) -public abstract class MixinGuiBossOverlay extends Gui { - private final ArrayList counted_cache = new ArrayList<>(); - public ResourceLocation GUI_BARS_TEXTURES_ALT = new ResourceLocation("textures/gui/bars.png"); - @Shadow - @Final - private Map mapBossInfos; - @Shadow - @Final - private Minecraft client; - - @Inject( - method = "Lnet/minecraft/client/gui/GuiBossOverlay;renderBossHealth()V", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderBossHealth(CallbackInfo callbackInfo) { - if (!this.mapBossInfos.isEmpty()) { - ScaledResolution scaledresolution = new ScaledResolution(this.client); - int i = scaledresolution.getScaledWidth(); - int j = 12; - for (BossinfoCounted counted : this.counted_cache) { - int k = i / 2 - 91; - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.client.getTextureManager().bindTexture(this.GUI_BARS_TEXTURES_ALT); - this.render(k, j, counted.info); - String s = counted.info.getName().getFormattedText() + (counted.count > 1 ? " (x" + counted.count + ')' : ""); - this.client.fontRenderer.drawStringWithShadow(s, (float) (i / 2 - this.client.fontRenderer.getStringWidth(s) / 2), (float) (j - 9), 16777215); - j += 10 + this.client.fontRenderer.FONT_HEIGHT; - - if (j >= scaledresolution.getScaledHeight() / 3) { - break; - } - } - } - callbackInfo.cancel(); - } - - @Shadow - private void render(int x, int y, BossInfo info) { - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiBossOverlay;read(Lnet/minecraft/network/play/server/SPacketUpdateBossInfo;)V", - at = @At("HEAD") - ) - public void read(SPacketUpdateBossInfo packetIn, CallbackInfo callbackInfo) { - this.counted_cache.clear(); - ArrayList known = new ArrayList<>(); - for (BossInfoClient infoLerping : this.mapBossInfos.values()) { - if (known.contains(infoLerping.getName().getFormattedText())) { - continue; - } - String formattedText = infoLerping.getName().getFormattedText(); - BossinfoCounted counted = new BossinfoCounted(); - counted.info = infoLerping; - for (BossInfoClient infoLerping2 : this.mapBossInfos.values()) { - if (infoLerping2.getName().getFormattedText().equals(formattedText)) { - counted.count++; - } - } - known.add(formattedText); - this.counted_cache.add(counted); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiChat.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiChat.java deleted file mode 100644 index 5aca0a1..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiChat.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.command.CommandRegistry; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.GuiTextField; -import org.lwjgl.opengl.GL11; -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; - -@Mixin(GuiChat.class) -public abstract class MixinGuiChat extends GuiScreen { - - public String prevText = ""; - public String prevSuggestion = ""; - - @Shadow - protected GuiTextField inputField; - - @Inject( - method = "Lnet/minecraft/client/gui/GuiChat;drawScreen(IIF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiTextField;drawTextBox()V" - )) - public void drawSemiTransparentText(CallbackInfo ci) { - if (this.inputField.getText().startsWith(".")) { - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - int x = this.inputField.x; - int y = this.inputField.y; - if (!this.prevText.equals(this.inputField.getText())) { - this.prevText = this.inputField.getText(); - this.prevSuggestion = CommandRegistry.getSuggestionFor(this.prevText); - } - this.fontRenderer.drawString(this.prevSuggestion, x, y, 0x5FFFFFFF, false); - GL11.glDisable(GL11.GL_BLEND); - GL11.glPopMatrix(); - } - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiChat;keyTyped(CI)V", - at = @At("HEAD"), - cancellable = true - ) - public void checkIfIsCommandAndProcess(char typedChar, int keyCode, CallbackInfo ci) { - if (keyCode == 28 || keyCode == 156) { - if (this.inputField.getText().startsWith(".")) { - this.mc.ingameGUI.getChatGUI().addToSentMessages(this.inputField.getText()); - this.mc.displayGuiScreen(null); - CommandRegistry.runCommand(this.inputField.getText()); - ci.cancel(); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiConnecting.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiConnecting.java deleted file mode 100644 index 9ef5a5a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiConnecting.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.minecraft.client.multiplayer.GuiConnecting; -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; - -@Mixin(GuiConnecting.class) -public abstract class MixinGuiConnecting { - @Inject( - method = "Lnet/minecraft/client/multiplayer/GuiConnecting;connect(Ljava/lang/String;I)V", - at = @At("HEAD") - ) - public void preConnect(String ip, int port, CallbackInfo callbackInfo) { - PepsiUtils.lastIp = ip; - PepsiUtils.lastPort = port; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiDisconnected.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiDisconnected.java deleted file mode 100644 index 77ae0be..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiDisconnected.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.impl.render.ZoomMod; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiDisconnected; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.util.text.ITextComponent; -import net.minecraftforge.fml.client.FMLClientHandler; -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.callback.CallbackInfo; - -@Mixin(GuiDisconnected.class) -public abstract class MixinGuiDisconnected extends GuiScreen { - - @Shadow - private int textHeight; - - @Inject( - method = "Lnet/minecraft/client/gui/GuiDisconnected;drawScreen(IIF)V", - at = @At("HEAD") - ) - public void preDrawScreen(int mouseX, int mouseY, float partialTicks, CallbackInfo callbackInfo) { - if (ZoomMod.INSTANCE.state.enabled) { - ModuleManager.disableModule(ZoomMod.INSTANCE); - this.mc.gameSettings.fovSetting = ZoomMod.INSTANCE.fov; - } - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiDisconnected;initGui()V", - at = @At("RETURN") - ) - public void postInitGui(CallbackInfo callbackInfo) { - PepsiUtils.autoReconnectWaitTime = 5; - this.buttonList.add(PepsiUtils.reconnectButton = new GuiButton(1, this.width / 2 - 100, Math.min(this.height / 2 + this.textHeight / 2 + this.fontRenderer.FONT_HEIGHT + 22, this.height - 30 + 22), "Reconnect")); - this.buttonList.add(PepsiUtils.autoReconnectButton = new GuiButton(2, this.width / 2 - 100, Math.min(this.height / 2 + this.textHeight / 2 + this.fontRenderer.FONT_HEIGHT + 44, this.height - 30 + 44), "AutoReconnect")); - if (!GeneralTranslator.INSTANCE.autoReconnect) { - PepsiUtils.autoReconnectButton.displayString = "AutoReconnect (\u00A7cDisabled\u00A7r)"; - } - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiDisconnected;actionPerformed(Lnet/minecraft/client/gui/GuiButton;)V", - at = @At("HEAD"), - cancellable = true - ) - public void preActionPerformed(GuiButton button, CallbackInfo callbackInfo) { - if (button.id == 1) { - ServerData data = new ServerData("", PepsiUtils.lastIp + ':' + PepsiUtils.lastPort, false); - data.setResourceMode(ServerData.ServerResourceMode.PROMPT); - FMLClientHandler.instance().connectToServer(this.mc.currentScreen, data); - callbackInfo.cancel(); - } else if (button.id == 2) { - GeneralTranslator.INSTANCE.autoReconnect = !GeneralTranslator.INSTANCE.autoReconnect; - if (GeneralTranslator.INSTANCE.autoReconnect) { - PepsiUtils.autoReconnectWaitTime = 5; - PepsiUtils.autoReconnectButton.displayString = "AutoReconnect (\u00A7a" + PepsiUtils.autoReconnectWaitTime + "\u00A7r)"; - } else { - PepsiUtils.autoReconnectButton.displayString = "AutoReconnect (\u00A7cDisabled\u00A7r)"; - } - callbackInfo.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngame.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngame.java deleted file mode 100644 index b12f846..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngame.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.module.impl.render.NoOverlayMod; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiIngame; -import net.minecraft.client.gui.ScaledResolution; -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; - -@Mixin(GuiIngame.class) -public abstract class MixinGuiIngame extends Gui { - @Inject( - method = "Lnet/minecraft/client/gui/GuiIngame;renderPumpkinOverlay(Lnet/minecraft/client/gui/ScaledResolution;)V", - at = @At("HEAD"), - cancellable = true - ) - protected void preRenderPumpkinOverlay(ScaledResolution scaledRes, CallbackInfo callbackInfo) { - if (NoOverlayMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiIngame;renderPotionEffects(Lnet/minecraft/client/gui/ScaledResolution;)V", - at = @At("HEAD"), - cancellable = true - ) - public void prerenderPotionEffects(ScaledResolution resolution, CallbackInfo callbackInfo) { - if (!HUDTranslator.INSTANCE.effects) { - callbackInfo.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngameMenu.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngameMenu.java deleted file mode 100644 index 8ab01bc..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiIngameMenu.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.impl.render.ZoomMod; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiIngameMenu; -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; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; - -@Mixin(GuiIngameMenu.class) -public abstract class MixinGuiIngameMenu { - @Inject( - method = "Lnet/minecraft/client/gui/GuiIngameMenu;actionPerformed(Lnet/minecraft/client/gui/GuiButton;)V", - at = @At("HEAD") - ) - public void preActionPerformed(GuiButton button, CallbackInfo callbackInfo) { - if (ZoomMod.INSTANCE.state.enabled) { - ModuleManager.disableModule(ZoomMod.INSTANCE); - mc.gameSettings.fovSetting = ZoomMod.INSTANCE.fov; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java deleted file mode 100644 index 463b0f5..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorizedText; -import net.daporkchop.pepsimod.util.colors.rainbow.RainbowText; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.GuiMainMenu; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.MinecraftForge; -import org.spongepowered.asm.lib.Opcodes; -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 java.awt.*; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mcStartedSuccessfully; -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(GuiMainMenu.class) -public abstract class MixinGuiMainMenu extends GuiScreen { - public ColorizedText PEPSIMOD_TEXT_GRADIENT; - public ColorizedText PEPSIMOD_AUTHOR_GRADIENT; - @Shadow - private String splashText; - - @Inject( - method = "Lnet/minecraft/client/gui/GuiMainMenu;()V", - at = @At("RETURN") - ) - public void postConstructor(CallbackInfo callbackInfo) { - if (mcStartedSuccessfully) { - this.PEPSIMOD_TEXT_GRADIENT = PepsiUtils.getGradientFromStringThroughColor(Pepsimod.NAME_VERSION + " for Minecraft " + MinecraftForge.MC_VERSION, new Color(255, 0, 0), new Color(0, 0, 255), new Color(255, 255, 255)); - this.PEPSIMOD_AUTHOR_GRADIENT = new RainbowText("Made by DaPorkchop_"); - - this.splashText = pepsimod.data.mainMenu.getRandomSplash(); - } - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiMainMenu;initGui()V", - at = @At("RETURN") - ) - public void addPepsiIconAndChangeSplash(CallbackInfo ci) { - if (mcStartedSuccessfully) { - pepsimod.isInitialized = true; - if (!pepsimod.hasInitializedModules) { - for (Module module : ModuleManager.AVALIBLE_MODULES) { - module.doInit(); - } - PepsiUtils.setBlockIdFields(); - pepsimod.hasInitializedModules = true; - } - ModuleManager.sortModules(GeneralTranslator.INSTANCE.sortType); - } - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;initGui()V", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/gui/GuiMainMenu;splashText:Ljava/lang/String;", - opcode = Opcodes.PUTFIELD - )) - public void preventSettingSplashInInitGui(GuiMainMenu menu, String val) { - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/gui/GuiMainMenu;splashText:Ljava/lang/String;", - opcode = Opcodes.PUTFIELD - )) - public void preventSettingSplashInDrawScreen(GuiMainMenu menu, String val) { - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/texture/TextureManager;bindTexture(Lnet/minecraft/util/ResourceLocation;)V", - ordinal = 0 - )) - public void removeMenuLogoInit(TextureManager textureManager, ResourceLocation resource) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - pepsimod.data.mainMenu.banner.render(this.width / 2 - 150, 10, 300, 100); - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiMainMenu;drawTexturedModalRect(IIIIII)V" - )) - public void removeMenuLogoRendering(GuiMainMenu guiMainMenu, int x, int y, int textureX, int textureY, int width, int height) { - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiMainMenu;drawModalRectWithCustomSizedTexture(IIFFIIFF)V" - )) - public void removeSubLogoRendering(int x, int y, float a, float b, int c, int d, float e, float f) { - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiMainMenu;drawString(Lnet/minecraft/client/gui/FontRenderer;Ljava/lang/String;III)V" - )) - public void removeAllDrawStrings(GuiMainMenu guiMainMenu, FontRenderer fontRenderer1, String string, int i1, int i2, int i3) { - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", - at = @At("RETURN") - ) - public void addDrawPepsiStuff(int mouseX, int mouseY, float partialTicks, CallbackInfo ci) { - this.drawString(this.fontRenderer, PepsiUtils.COLOR_ESCAPE + "cCopyright Mojang AB. Do not distribute!", this.width - this.fontRenderer.getStringWidth("Copyright Mojang AB. Do not distribute!") - 2, this.height - 10, -1); - if (this.PEPSIMOD_TEXT_GRADIENT != null && this.PEPSIMOD_AUTHOR_GRADIENT != null) { - this.PEPSIMOD_TEXT_GRADIENT.drawAtPos(this, 2, this.height - 20); - this.PEPSIMOD_AUTHOR_GRADIENT.drawAtPos(this, 2, this.height - 10); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMultiplayer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMultiplayer.java deleted file mode 100644 index efa6735..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMultiplayer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.gui.mcleaks.GuiButtonMCLeaks; -import net.daporkchop.pepsimod.gui.mcleaks.GuiScreenMCLeaks; -import net.daporkchop.pepsimod.gui.misc.GuiButtonTooBeeTooTee; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiMainMenu; -import net.minecraft.client.gui.GuiMultiplayer; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.client.FMLClientHandler; -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; - -@Mixin(GuiMultiplayer.class) -public abstract class MixinGuiMultiplayer extends GuiScreen { - - @Inject( - method = "Lnet/minecraft/client/gui/GuiMultiplayer;createButtons()V", - at = @At("RETURN") - ) - public void createButtons(CallbackInfo ci) { - this.buttonList.add(new GuiButtonMCLeaks(9, 6, 6, 20, 20)); - this.buttonList.add(new GuiButtonTooBeeTooTee(10, this.width - 26, 6, 20, 20)); - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiMultiplayer;actionPerformed(Lnet/minecraft/client/gui/GuiButton;)V", - at = @At("HEAD"), - cancellable = true - ) - public void actionPerformed(GuiButton button, CallbackInfo ci) { - if (button.id == 9) { - GuiScreenMCLeaks mcLeaks = new GuiScreenMCLeaks(this, Minecraft.getMinecraft()); - Minecraft.getMinecraft().displayGuiScreen(mcLeaks); - ci.cancel(); - } else if (button.id == 10) { - FMLClientHandler.instance().connectToServer(new GuiMainMenu(), PepsiUtils.TOOBEETOOTEE_DATA); - ci.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiPlayerTabOverlay.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiPlayerTabOverlay.java deleted file mode 100644 index ffca2ad..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiPlayerTabOverlay.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.gui; - -import net.daporkchop.pepsimod.misc.data.Group; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiPlayerTabOverlay; -import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.scoreboard.ScoreObjective; -import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.util.ResourceLocation; -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.Constant; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.List; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -/** - * @author DaPorkchop_ - */ -@Mixin(GuiPlayerTabOverlay.class) -public abstract class MixinGuiPlayerTabOverlay extends Gui { - @Shadow - @Final - private Minecraft mc; - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - at = @At( - value = "INVOKE", - target = "Ljava/lang/Math;min(II)I", - ordinal = 0 - )) - public int preventTabClamping(int listSize, int theNumber_80) { - return HUDTranslator.INSTANCE.clampTabList ? Math.min(listSize, theNumber_80) : listSize; - } - - @ModifyConstant( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - constant = @Constant( - intValue = 20, - ordinal = 0 - )) - public int modifyMaxRows(int old) { - int maxRows = HUDTranslator.INSTANCE.maxTabRows; - return maxRows > 0 ? maxRows : old; - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/Minecraft;isIntegratedServerRunning()Z" - )) - public boolean alwaysRenderPlayerIcons(Minecraft mc) { - return true; - } - - @ModifyConstant( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - constant = @Constant( - intValue = 9, - ordinal = 0 - )) - public int changePlayerBoxWidthIncrease(int old) { - return old + 9; - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;drawRect(IIIII)V", - ordinal = 2 - ), - locals = LocalCapture.CAPTURE_FAILHARD - ) - public void drawPlayerBoxBackgroundCustom(int width, Scoreboard scoreboardIn, ScoreObjective scoreObjectiveIn, - CallbackInfo ci, - NetHandlerPlayClient nethandlerplayclient, List list, int i, int j, int l3, int i4, int j4, boolean flag, int l, int i1, int j1, int k1, int l1, List list1, List list2, int k4, int l4, int i5, int j2, int k2) { - int color = 553648126; - if (k4 < list.size()) { - Group group = pepsimod.data.getGroup(list.get(k4)); - if (group != null && group.color != 0) { - color = group.color | 0x80000000; - } - } - drawRect(j2, k2, j2 + i1, k2 + 8, color); - } - - @ModifyConstant( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", - constant = @Constant( - intValue = 553648127 - )) - public int changePlayerBoxBackgroundColor(int old) { - return 0; - } - - @Redirect( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;drawPing(IIILnet/minecraft/client/network/NetworkPlayerInfo;)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/texture/TextureManager;bindTexture(Lnet/minecraft/util/ResourceLocation;)V" - )) - public void preventExtraPingTextureBind(TextureManager manager, ResourceLocation location) { - } - - @Inject( - method = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;drawPing(IIILnet/minecraft/client/network/NetworkPlayerInfo;)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/GuiPlayerTabOverlay;drawTexturedModalRect(IIIIII)V" - )) - public void drawIconIfPossible(int p_175245_1_, int p_175245_2_, int p_175245_3_, NetworkPlayerInfo info, CallbackInfo callbackInfo) { - Group group = pepsimod.data.getGroup(info); - if (group != null) { - group.doWithIconIfPresent(tex -> tex.render(p_175245_2_ + p_175245_1_ - 11 - 9, p_175245_3_, 8, 8)); - } - this.mc.getTextureManager().bindTexture(ICONS); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/multiplayer/MixinWorldClient.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/multiplayer/MixinWorldClient.java deleted file mode 100644 index 4b9407d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/multiplayer/MixinWorldClient.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.multiplayer; - -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.world.World; -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; - -@Mixin(WorldClient.class) -public abstract class MixinWorldClient extends World { - public MixinWorldClient() { - super(null, null, null, null, false); - } - - @Inject( - method = "Lnet/minecraft/client/multiplayer/WorldClient;doVoidFogParticles(III)V", - at = @At("HEAD"), - cancellable = true - ) - public void preDoVoidFogParticles(int posX, int posY, int posZ, CallbackInfo callbackInfo) { - if (FreecamMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerLoginClient.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerLoginClient.java deleted file mode 100644 index 44f002a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerLoginClient.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.network; - -import net.daporkchop.pepsimod.util.MCLeaks; -import net.minecraft.client.network.NetHandlerLoginClient; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.login.INetHandlerLoginClient; -import net.minecraft.network.login.server.SPacketEncryptionRequest; -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.callback.CallbackInfo; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(NetHandlerLoginClient.class) -public abstract class MixinNetHandlerLoginClient implements INetHandlerLoginClient { - @Shadow - @Final - private NetworkManager networkManager; - - @Inject( - method = "Lnet/minecraft/client/network/NetHandlerLoginClient;handleEncryptionRequest(Lnet/minecraft/network/login/server/SPacketEncryptionRequest;)V", - at = @At("HEAD"), - cancellable = true - ) - public void handleEncryptionRequest(SPacketEncryptionRequest packetIn, CallbackInfo ci) { - if (pepsimod.isMcLeaksAccount) { - MCLeaks.joinServerStuff(packetIn, this.networkManager); - ci.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerPlayClient.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerPlayClient.java deleted file mode 100644 index 9829f5a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/network/MixinNetHandlerPlayClient.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.network; - -import com.google.common.collect.Maps; -import net.daporkchop.pepsimod.module.impl.misc.AnnouncerMod; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.server.SPacketPlayerListItem; -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 java.util.Map; -import java.util.UUID; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; - -@Mixin(NetHandlerPlayClient.class) -public abstract class MixinNetHandlerPlayClient { - @Shadow - private final Map playerInfoMap = Maps.newHashMap(); - - @Inject( - method = "Lnet/minecraft/client/network/NetHandlerPlayClient;handlePlayerListItem(Lnet/minecraft/network/play/server/SPacketPlayerListItem;)V", - at = @At("HEAD") - ) - public void preHandlePlayerListItem(SPacketPlayerListItem listItem, CallbackInfo callbackInfo) { - try { - if (listItem.getEntries().size() == 1) { - if (listItem.getAction() == SPacketPlayerListItem.Action.ADD_PLAYER) { - for (SPacketPlayerListItem.AddPlayerData data : listItem.getEntries()) { - if (!data.getProfile().getId().equals(mc.player.getGameProfile().getId())) { - AnnouncerMod.INSTANCE.onPlayerJoin(data.getProfile().getName()); - } - } - } else if (listItem.getAction() == SPacketPlayerListItem.Action.REMOVE_PLAYER) { - for (SPacketPlayerListItem.AddPlayerData data : listItem.getEntries()) { - if (!data.getProfile().getId().equals(mc.player.getGameProfile().getId())) { - AnnouncerMod.INSTANCE.onPlayerLeave(this.playerInfoMap.get(data.getProfile().getId()).getGameProfile().getName()); - } - } - - } - } - } catch (NullPointerException e) { - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockFluidRenderer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockFluidRenderer.java deleted file mode 100644 index fbbdd38..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockFluidRenderer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer; - -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.daporkchop.pepsimod.util.config.impl.XrayTranslator; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.BlockFluidRenderer; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -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(BlockFluidRenderer.class) -public abstract class MixinBlockFluidRenderer { - @Inject( - method = "Lnet/minecraft/client/renderer/BlockFluidRenderer;renderFluid(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/renderer/BufferBuilder;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderFluid(IBlockAccess blockAccess, IBlockState blockStateIn, BlockPos blockPosIn, BufferBuilder worldRendererIn, CallbackInfoReturnable callbackInfoReturnable) { - if (XrayMod.INSTANCE.state.enabled) { - if (!XrayTranslator.INSTANCE.isTargeted(blockStateIn.getBlock())) { - callbackInfoReturnable.setReturnValue(false); - callbackInfoReturnable.cancel(); - } - } - //vanilla code follows - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockModelRenderer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockModelRenderer.java deleted file mode 100644 index b3b9112..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinBlockModelRenderer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer; - -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.daporkchop.pepsimod.util.config.impl.XrayTranslator; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.BlockModelRenderer; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -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(BlockModelRenderer.class) -public abstract class MixinBlockModelRenderer { - @Inject( - method = "Lnet/minecraft/client/renderer/BlockModelRenderer;renderModel(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/client/renderer/block/model/IBakedModel;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/renderer/BufferBuilder;Z)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderModel(IBlockAccess blockAccessIn, IBakedModel modelIn, IBlockState blockStateIn, BlockPos blockPosIn, BufferBuilder buffer, boolean checkSides, CallbackInfoReturnable callbackInfoReturnable) { - if (XrayMod.INSTANCE.state.enabled) { - if (!XrayTranslator.INSTANCE.isTargeted(blockStateIn.getBlock())) { - callbackInfoReturnable.setReturnValue(false); - callbackInfoReturnable.cancel(); - } - } - //vanilla code follows - } - - @Inject( - method = "Lnet/minecraft/client/renderer/BlockModelRenderer;renderModelSmooth(Lnet/minecraft/world/IBlockAccess;Lnet/minecraft/client/renderer/block/model/IBakedModel;Lnet/minecraft/block/state/IBlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/renderer/BufferBuilder;ZJ)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderQuadsSmooth(IBlockAccess access, IBakedModel model, IBlockState stateIn, BlockPos pos, BufferBuilder bufferBuilder, boolean idk, long ok, CallbackInfoReturnable returnable) { - if (XrayMod.INSTANCE.state.enabled) { - if (!XrayTranslator.INSTANCE.isTargeted(stateIn.getBlock())) { - returnable.setReturnValue(false); - returnable.cancel(); - } - } - //vanilla code follows - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinEntityRenderer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinEntityRenderer.java deleted file mode 100644 index f65c913..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinEntityRenderer.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer; - -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.impl.render.AntiBlindMod; -import net.daporkchop.pepsimod.module.impl.render.AntiTotemAnimationMod; -import net.daporkchop.pepsimod.module.impl.render.FullbrightMod; -import net.daporkchop.pepsimod.module.impl.render.NoHurtCamMod; -import net.daporkchop.pepsimod.module.impl.render.NoOverlayMod; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RotationUtils; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.render.WorldRenderer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.Entity; -import net.minecraft.init.MobEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.util.glu.Project; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import static org.lwjgl.opengl.GL11.glPopMatrix; -import static org.lwjgl.opengl.GL11.glPushMatrix; - -@Mixin(EntityRenderer.class) -public abstract class MixinEntityRenderer { - @Shadow - protected abstract void setupCameraTransform(float partialTicks, int pass); - - @Shadow - @Final - private Minecraft mc; - - @Inject( - method = "Lnet/minecraft/client/renderer/EntityRenderer;renderWorldPass(IFJ)V", - at = @At( - value = "INVOKE_ASSIGN", - target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V", - ordinal = 19 - )) - public void preRenderHand(CallbackInfo ci, int pass, float partialTicks, long finishTimeNano) { - PepsiUtils.toRemoveWurstRenderListeners.forEach(PepsiUtils.wurstRenderListeners::remove); - PepsiUtils.toRemoveWurstRenderListeners.clear(); - PepsiUtils.wurstRenderListeners.forEach(listener -> listener.render(partialTicks)); - } - - @Inject( - method = "Lnet/minecraft/client/renderer/EntityRenderer;renderWorldPass(IFJ)V", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/renderer/EntityRenderer;renderHand:Z", - shift = At.Shift.BEFORE - )) - public void renderLines(int pass, float partialTicks, long finishTimeNano, CallbackInfo ci) { - if (this.mc.gameSettings.viewBobbing) { - this.mc.gameSettings.viewBobbing = false; - - glPushMatrix(); - this.setupCameraTransform(partialTicks, pass); - try (WorldRenderer renderer = new WorldRenderer(RotationUtils.getClientLookVec(), PepsiUtils.getPlayerPos(partialTicks), partialTicks)) { - for (Module module : ModuleManager.ENABLED_MODULES) { - module.renderOverlay(renderer); - } - } - glPopMatrix(); - - this.mc.gameSettings.viewBobbing = true; - - glPushMatrix(); - this.setupCameraTransform(partialTicks, pass); - try (WorldRenderer renderer = new WorldRenderer(RotationUtils.getClientLookVec(), PepsiUtils.getPlayerPos(partialTicks), partialTicks)) { - for (Module module : ModuleManager.ENABLED_MODULES) { - module.renderWorld(renderer); - } - } - glPopMatrix(); - } else { - try (WorldRenderer renderer = new WorldRenderer(RotationUtils.getClientLookVec(), PepsiUtils.getPlayerPos(partialTicks), partialTicks)) { - for (Module module : ModuleManager.ENABLED_MODULES) { - module.renderOverlay(renderer); - module.renderWorld(renderer); - } - } - } - } - - @ModifyConstant( - method = "Lnet/minecraft/client/renderer/EntityRenderer;setupCameraTransform(FI)V", - constant = { - @Constant(intValue = 20), - @Constant(intValue = 7) - }) - public int preventNauseaEffect(int orig) { - return AntiBlindMod.INSTANCE.state.enabled ? 0 : orig; - } - - @Inject( - method = "Lnet/minecraft/client/renderer/EntityRenderer;hurtCameraEffect(F)V", - at = @At("HEAD"), - cancellable = true - ) - public void preHurtCameraEffect(float partialTicks, CallbackInfo callbackInfo) { - if (NoHurtCamMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } - - @Redirect( - method = "Lnet/minecraft/client/renderer/EntityRenderer;setupFog(IF)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/GlStateManager;setFogDensity(F)V" - )) - public void changeFog(float density) { - if (NoOverlayMod.INSTANCE.state.enabled) { - GlStateManager.setFogDensity(0.01f); - } else { - GlStateManager.setFogDensity(density); - } - } - - @Inject( - method = "Lnet/minecraft/client/renderer/EntityRenderer;displayItemActivation(Lnet/minecraft/item/ItemStack;)V", - at = @At("HEAD"), - cancellable = true - ) - public void preDisplayItemActivation(ItemStack stack, CallbackInfo callbackInfo) { - if (AntiTotemAnimationMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/client/renderer/EntityRenderer;renderItemActivation(IIF)V", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderItemActivation(int a, int b, float c, CallbackInfo callbackInfo) { - if (AntiTotemAnimationMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } - - @Redirect( - method = "Lnet/minecraft/client/renderer/EntityRenderer;updateLightmap(F)V", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/settings/GameSettings;gammaSetting:F" - )) - public float redirectGammaSetting(GameSettings settings) { - return Math.max(FullbrightMod.INSTANCE.level * 0.5f, settings.gammaSetting); - } - - @Redirect( - method = "Lnet/minecraft/client/renderer/EntityRenderer;getMouseOver(F)V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/Entity;getEntityBoundingBox()Lnet/minecraft/util/math/AxisAlignedBB;", - ordinal = 1 - )) - public AxisAlignedBB preventMousingOverRiddenEntity(Entity possiblyRidden) { - if (possiblyRidden.isPassenger(this.mc.getRenderViewEntity())) { - return new AxisAlignedBB(0, 0, 0, 0, 0, 0); - } else { - return possiblyRidden.getEntityBoundingBox(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinItemRenderer.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinItemRenderer.java deleted file mode 100644 index d0bb31e..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/MixinItemRenderer.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer; - -import net.daporkchop.pepsimod.module.impl.render.NoOverlayMod; -import net.minecraft.client.renderer.ItemRenderer; -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; - -@Mixin(ItemRenderer.class) -public abstract class MixinItemRenderer { - @Inject( - method = "Lnet/minecraft/client/renderer/ItemRenderer;renderWaterOverlayTexture(F)V", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderWaterOverlayTexture(float partialTicks, CallbackInfo callbackInfo) { - if (NoOverlayMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/client/renderer/ItemRenderer;renderFireInFirstPerson()V", - at = @At("HEAD"), - cancellable = true - ) - public void preRenderFireInFirstPerson(CallbackInfo callbackInfo) { - if (NoOverlayMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/chunk/MixinVisGraph.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/chunk/MixinVisGraph.java deleted file mode 100644 index 8063264..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/chunk/MixinVisGraph.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer.chunk; - -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.render.XrayMod; -import net.minecraft.client.renderer.chunk.VisGraph; -import net.minecraft.util.math.BlockPos; -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; - -@Mixin(VisGraph.class) -public abstract class MixinVisGraph { - @Inject( - method = "Lnet/minecraft/client/renderer/chunk/VisGraph;setOpaqueCube(Lnet/minecraft/util/math/BlockPos;)V", - at = @At("HEAD"), - cancellable = true - ) - public void preSetOpaqueCube(BlockPos pos, CallbackInfo callbackInfo) { - if (XrayMod.INSTANCE.state.enabled || FreecamMod.INSTANCE.state.enabled) { - callbackInfo.cancel(); - } - //vanilla code follows - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/entity/MixinRender.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/entity/MixinRender.java deleted file mode 100644 index c5d2296..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/renderer/entity/MixinRender.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.renderer.entity; - -import net.daporkchop.pepsimod.misc.data.DataLoader; -import net.daporkchop.pepsimod.misc.data.Group; -import net.daporkchop.pepsimod.module.impl.render.ESPMod; -import net.daporkchop.pepsimod.module.impl.render.HealthTagsMod; -import net.daporkchop.pepsimod.module.impl.render.NameTagsMod; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.RenderColor; -import net.daporkchop.pepsimod.util.config.impl.ESPTranslator; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.daporkchop.pepsimod.util.config.impl.NameTagsTranslator; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -@Mixin(Render.class) -public abstract class MixinRender { - @Shadow - @Final - protected RenderManager renderManager; - - @Shadow - public FontRenderer getFontRendererFromRenderManager() { - return null; - } - - @Overwrite - protected void renderLivingLabel(T entityIn, String str, double x, double y, double z, int maxDistance) { - double d0 = entityIn.getDistanceSq(this.renderManager.renderViewEntity); - - if (d0 <= (double) (maxDistance * maxDistance)) { - boolean flag = entityIn.isSneaking(); - float f = this.renderManager.playerViewY; - float f1 = this.renderManager.playerViewX; - boolean flag1 = this.renderManager.options.thirdPersonView == 2; - float f2 = entityIn.height + 0.5F - (flag ? 0.25F : 0.0F); - int i = "deadmau5".equals(str) ? -10 : 0; - - if (entityIn instanceof EntityLivingBase) { - if (entityIn instanceof EntityPlayer && FriendsTranslator.INSTANCE.isFriend(entityIn)) { - str = PepsiUtils.COLOR_ESCAPE + "b" + str; - } - - if (HealthTagsMod.INSTANCE.state.enabled) { - str += " "; - int health = (int) ((EntityLivingBase) entityIn).getHealth(); - if (health <= 5) { - str += "\u00A74"; - } else if (health <= 10) { - str += "\u00A76"; - } else if (health <= 15) { - str += "\u00A7e"; - } else { - str += "\u00A7a"; - } - str += health; - } - } - - if (NameTagsMod.INSTANCE.state.enabled) { - PepsiUtils.drawNameplateNoScale(this.getFontRendererFromRenderManager(), str, (float) x, (float) y, (float) z, i, f, f1, flag1, f2, NameTagsTranslator.INSTANCE.scale); - } else { - EntityRenderer.drawNameplate(this.getFontRendererFromRenderManager(), str, (float) x, (float) y + f2, (float) z, i, f, f1, flag1, flag); - } - } - } - - @ModifyConstant( - method = "Lnet/minecraft/client/renderer/entity/Render;getTeamColor(Lnet/minecraft/entity/Entity;)I", - constant = @Constant( - intValue = 16777215 // 0xFFFFFF - )) - public int changeDefaultTeamColor(int old, Entity entity) { - if (entity instanceof EntityPlayer) { - Group group = pepsimod.data.getGroup((EntityPlayer) entity); - if (group != null && group.color != 0) { - return group.color; - } - } - if (ESPMod.INSTANCE.state.enabled && !ESPTranslator.INSTANCE.box) { - RenderColor color = ESPMod.INSTANCE.chooseColor(entity); - if (color != null) { - return color.getIntColor(); - } - } - return old; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/resources/MixinLocale.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/resources/MixinLocale.java deleted file mode 100644 index 504d585..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/resources/MixinLocale.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.resources; - -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.client.resources.Locale; -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 java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.List; - -@Mixin(Locale.class) -public abstract class MixinLocale { - @Shadow - private void loadLocaleData(InputStream inputStreamIn) throws IOException { - } - - @Inject( - method = "Lnet/minecraft/client/resources/Locale;loadLocaleDataFiles(Lnet/minecraft/client/resources/IResourceManager;Ljava/util/List;)V", - at = @At("RETURN") - ) - public void postLoad(IResourceManager resourceManager, List languageList, CallbackInfo callbackInfo) { - try (InputStream in = new URL("https://gist.githubusercontent.com/DaMatrix/f7106cad11fa86495915941d6c308f5e/raw/273c86250f74f3258c39789d5b0984e539609888/en_US.lang").openStream()) { - this.loadLocaleData(in); - } catch (IOException e) { - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinGameSettings.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinGameSettings.java deleted file mode 100644 index 8a2a7d9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinGameSettings.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.settings; - -import net.daporkchop.pepsimod.module.impl.render.ZoomMod; -import net.minecraft.client.settings.GameSettings; -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; - -@Mixin(GameSettings.class) -public abstract class MixinGameSettings { - @Inject( - method = "Lnet/minecraft/client/settings/GameSettings;setOptionFloatValue(Lnet/minecraft/client/settings/GameSettings$Options;F)V", - at = @At("HEAD") - ) - public void preSetOptionFloatValue(GameSettings.Options settingsOption, float value, CallbackInfo callbackInfo) { - if (settingsOption == GameSettings.Options.FOV) { - ZoomMod.INSTANCE.fov = value; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinKeyBinding.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinKeyBinding.java deleted file mode 100644 index 8099038..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/client/settings/MixinKeyBinding.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.client.settings; - -import net.daporkchop.pepsimod.optimization.OverrideCounter; -import net.minecraft.client.settings.KeyBinding; -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.Redirect; - -/** - * @author DaPorkchop_ - */ -@Mixin(KeyBinding.class) -public abstract class MixinKeyBinding implements OverrideCounter { - @Shadow - private boolean pressed; - - public int overrideCounter = 0; - - @Override - public void incrementOverride() { - this.overrideCounter++; - } - - @Override - public void decrementOverride() { - if (--this.overrideCounter < 0) { - this.overrideCounter = 0; - } - } - - @Override - public int getOverride() { - return this.overrideCounter; - } - - @Redirect( - method = "Lnet/minecraft/client/settings/KeyBinding;isKeyDown()Z", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/client/settings/KeyBinding;pressed:Z" - )) - public boolean modifyIsKeyDown(KeyBinding binding) { - return this.pressed || this.isOverriden(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntity.java b/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntity.java deleted file mode 100644 index 5b4f375..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntity.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.entity; - -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.movement.NoClipMod; -import net.daporkchop.pepsimod.module.impl.movement.VelocityMod; -import net.daporkchop.pepsimod.module.impl.render.AntiInvisibleMod; -import net.daporkchop.pepsimod.module.impl.render.ESPMod; -import net.daporkchop.pepsimod.util.config.impl.ESPTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.MoverType; -import net.minecraft.entity.monster.EntityGolem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.math.AxisAlignedBB; -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 net.daporkchop.pepsimod.util.PepsiConstants.mc; - -@Mixin(Entity.class) -public abstract class MixinEntity { - @Shadow - public double motionX; - @Shadow - public double motionY; - @Shadow - public double motionZ; - @Shadow - private AxisAlignedBB boundingBox; - - @Shadow - public abstract void resetPositionToBB(); - - @Inject( - method = "Lnet/minecraft/entity/Entity;setVelocity(DDD)V", - at = @At("HEAD"), - cancellable = true - ) - public void preSetVelocity(double x, double y, double z, CallbackInfo callbackInfo) { - float strength = 1.0f; - if (Entity.class.cast(this) == mc.player) { - strength = VelocityMod.INSTANCE.getVelocity(); - } - this.motionX = x * strength; - this.motionY = y * strength; - this.motionZ = z * strength; - callbackInfo.cancel(); - } - - @Inject( - method = "Lnet/minecraft/entity/Entity;move(Lnet/minecraft/entity/MoverType;DDD)V", - at = @At("HEAD"), - cancellable = true - ) - public void preMove(MoverType type, double x, double y, double z, CallbackInfo callbackInfo) { - Entity thisAsEntity = Entity.class.cast(this); - if ((FreecamMod.INSTANCE.state.enabled || NoClipMod.INSTANCE.state.enabled) && thisAsEntity instanceof EntityPlayer) { - this.boundingBox = this.boundingBox.offset(x, y, z); - this.resetPositionToBB(); - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/entity/Entity;isInvisibleToPlayer(Lnet/minecraft/entity/player/EntityPlayer;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsInvisibleToPlayer(EntityPlayer player, CallbackInfoReturnable callbackInfoReturnable) { - if (AntiInvisibleMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - callbackInfoReturnable.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/entity/Entity;isGlowing()Z", - at = @At("HEAD"), - cancellable = true - ) - public void preisGlowing(CallbackInfoReturnable callbackInfoReturnable) { - if (ESPMod.INSTANCE.state.enabled && !ESPTranslator.INSTANCE.box) { - Entity this_ = Entity.class.cast(this); - if (this_.isInvisible()) { - if (!ESPTranslator.INSTANCE.invisible) { - return; - } - } - if (ESPTranslator.INSTANCE.animals && this_ instanceof EntityAnimal) { - callbackInfoReturnable.setReturnValue(true); - } else if (ESPTranslator.INSTANCE.monsters && this_ instanceof EntityMob) { - callbackInfoReturnable.setReturnValue(true); - } else if (ESPTranslator.INSTANCE.players && this_ instanceof EntityPlayer) { - callbackInfoReturnable.setReturnValue(true); - } else if (ESPTranslator.INSTANCE.golems && this_ instanceof EntityGolem) { - callbackInfoReturnable.setReturnValue(true); - } - } - } - - @Inject( - method = "Lnet/minecraft/entity/Entity;isInWater()Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsInWater(CallbackInfoReturnable callbackInfoReturnable) { - if (FreecamMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityAgeable.java b/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityAgeable.java deleted file mode 100644 index 94c972d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityAgeable.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.entity; - -import net.daporkchop.pepsimod.optimization.SizeSettable; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.EntityCreature; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; - -/** - * @author DaPorkchop_ - */ -@Mixin(EntityAgeable.class) -public abstract class MixinEntityAgeable extends EntityCreature implements SizeSettable { - public MixinEntityAgeable() { - super(null); - } - - @Override - public void forceSetSize(float width, float height) { - super.setSize(width, height); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityLivingBase.java b/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityLivingBase.java deleted file mode 100644 index 01db465..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/entity/MixinEntityLivingBase.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.entity; - -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.module.impl.movement.ElytraFlyMod; -import net.daporkchop.pepsimod.module.impl.render.AntiBlindMod; -import net.daporkchop.pepsimod.util.config.impl.ElytraFlyTranslator; -import net.daporkchop.pepsimod.util.config.impl.FreecamTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.init.MobEffects; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.SoundEvent; -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 net.daporkchop.pepsimod.util.PepsiConstants.mc; - -@Mixin(EntityLivingBase.class) -public abstract class MixinEntityLivingBase extends Entity { - @Shadow - public float jumpMovementFactor; - @Shadow - public float prevLimbSwingAmount; - @Shadow - public float limbSwingAmount; - @Shadow - public float limbSwing; - - public MixinEntityLivingBase() { - super(null); - } - - @Inject( - method = "Lnet/minecraft/entity/EntityLivingBase;isPotionActive(Lnet/minecraft/potion/Potion;)Z", - at = @At("HEAD"), - cancellable = true - ) - public void preIsPotionActive(Potion potionIn, CallbackInfoReturnable callbackInfoReturnable) { - if (potionIn == MobEffects.BLINDNESS && AntiBlindMod.INSTANCE.state.enabled) { - callbackInfoReturnable.setReturnValue(false); - callbackInfoReturnable.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/entity/EntityLivingBase;onLivingUpdate()V", - at = @At("HEAD") - ) - public void preOnLivingUpdate(CallbackInfo callbackInfo) { - EntityLivingBase thisAsEntity = EntityLivingBase.class.cast(this); - if (thisAsEntity == mc.player && ElytraFlyMod.INSTANCE.state.enabled && ElytraFlyTranslator.INSTANCE.mode == ElytraFlyTranslator.ElytraFlyMode.PACKET) { - this.motionY = 0; - } - } - - @Inject( - method = "Lnet/minecraft/entity/EntityLivingBase;travel(FFF)V", - at = @At("HEAD") - ) - public void preTravel(float x, float y, float z, CallbackInfo callbackInfo) { - EntityLivingBase thisAsEntity = EntityLivingBase.class.cast(this); - if (thisAsEntity == mc.player && ElytraFlyMod.INSTANCE.state.enabled && ElytraFlyTranslator.INSTANCE.mode == ElytraFlyTranslator.ElytraFlyMode.PACKET) { - this.motionY = 0; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinAbstractHorse.java b/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinAbstractHorse.java deleted file mode 100644 index bbe1019..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinAbstractHorse.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.entity.passive; - -import net.daporkchop.pepsimod.module.impl.movement.EntitySpeedMod; -import net.minecraft.entity.passive.AbstractHorse; -import net.minecraft.entity.passive.EntityAnimal; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(AbstractHorse.class) -public abstract class MixinAbstractHorse extends EntityAnimal { - public MixinAbstractHorse() { - super(null); - } - - @Shadow - protected abstract boolean getHorseWatchableBoolean(int p_110233_1_); - - @Shadow - public abstract boolean isTame(); - - @Overwrite - public boolean isHorseSaddled() { - if (this.world.isRemote) { - return this.getHorseWatchableBoolean(4) || (this.isTame() && EntitySpeedMod.INSTANCE.state.enabled); //make the horse be controllable even without a saddle - } else { - return this.getHorseWatchableBoolean(4); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinEntityPig.java b/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinEntityPig.java deleted file mode 100644 index c5e7707..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/entity/passive/MixinEntityPig.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.entity.passive; - -import net.daporkchop.pepsimod.module.impl.movement.EntitySpeedMod; -import net.daporkchop.pepsimod.optimization.SizeSettable; -import net.daporkchop.pepsimod.util.config.impl.EntitySpeedTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.util.math.AxisAlignedBB; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -import javax.annotation.Nullable; - -@Mixin(EntityPig.class) -public abstract class MixinEntityPig extends EntityAnimal implements SizeSettable { - public int riddenTicks = 0; - - public MixinEntityPig() { - super(null); - } - - @Shadow - @Nullable - public abstract Entity getControllingPassenger(); - - @Overwrite - public boolean canBeSteered() { - Entity entity = this.getControllingPassenger(); - - if (!(entity instanceof EntityPlayer)) { - return false; - } else { - EntityPlayer entityplayer = (EntityPlayer) entity; - return (this.world.isRemote && EntitySpeedMod.INSTANCE.state.enabled) || entityplayer.getHeldItemMainhand().getItem() == Items.CARROT_ON_A_STICK || entityplayer.getHeldItemOffhand().getItem() == Items.CARROT_ON_A_STICK; - } - } - - @Override - public void onLivingUpdate() { - this.forceSetSize(0.9f, 0.9f); - if (this.world.isRemote && this.isBeingRidden()) { - if (this.riddenTicks++ >= 2) { - if (this.riddenTicks > 1000) { - this.riddenTicks = 1000; - } - AxisAlignedBB bb = EntitySpeedMod.getMergedBBs(this, this.getEntityBoundingBox()); - this.forceSetSize((float) Math.max(bb.maxX - bb.minX, bb.maxZ - bb.minZ), (float) (bb.maxY - bb.minY)); - } - } else { - this.riddenTicks = 0; - } - super.onLivingUpdate(); - } - - @Override - public double getMountedYOffset() { - return 0.9d * 0.75d; - } - - @ModifyConstant( - method = "Lnet/minecraft/entity/passive/EntityPig;travel(FFF)V", - constant = @Constant( - floatValue = 1.0f, - ordinal = 0 - )) - public float modifyStepHeight(float orig) { - return this.world.isRemote && EntitySpeedMod.INSTANCE.state.enabled ? EntitySpeedMod.INSTANCE.fakedStepHeight : orig; - } - - @ModifyConstant( - method = "Lnet/minecraft/entity/passive/EntityPig;travel(FFF)V", - constant = @Constant( - floatValue = 1.0f, - ordinal = 1 - )) - public float modifyIdleSpeed(float orig) { - return this.world.isRemote && EntitySpeedMod.INSTANCE.state.enabled ? EntitySpeedTranslator.INSTANCE.idleSpeed : orig; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/item/MixinItemStack.java b/src/main/java/net/daporkchop/pepsimod/mixin/item/MixinItemStack.java deleted file mode 100644 index 509e89a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/item/MixinItemStack.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.item; - -import net.daporkchop.pepsimod.module.impl.combat.BedBomberMod; -import net.daporkchop.pepsimod.module.impl.misc.AnnouncerMod; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBed; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -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(ItemStack.class) -public abstract class MixinItemStack { - @Inject( - method = "Lnet/minecraft/item/ItemStack;onItemUse(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumHand;Lnet/minecraft/util/EnumFacing;FFF)Lnet/minecraft/util/EnumActionResult;", - at = @At("HEAD") - ) - public void preOnItemUse(EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ, CallbackInfoReturnable callbackInfo) { - if (worldIn.isRemote) { - ItemStack this_ = ItemStack.class.cast(this); - if (this_.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock) this_.getItem()).getBlock(); - AnnouncerMod.INSTANCE.onPlaceBlock(block); - } else if (this_.getItem() instanceof ItemBed) { - BedBomberMod.INSTANCE.onPlaceBed(); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/network/MixinNetworkManager.java b/src/main/java/net/daporkchop/pepsimod/mixin/network/MixinNetworkManager.java deleted file mode 100644 index 94f3636..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/network/MixinNetworkManager.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.network; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; -import net.daporkchop.pepsimod.misc.TickRate; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.util.text.ITextComponent; -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; - -import javax.annotation.Nullable; - -/** - * inspired by fr1kin's PacketListener - */ -@Mixin(NetworkManager.class) -public abstract class MixinNetworkManager { - @Inject( - method = "Lnet/minecraft/network/NetworkManager;dispatchPacket(Lnet/minecraft/network/Packet;[Lio/netty/util/concurrent/GenericFutureListener;)V", - at = @At("HEAD"), - cancellable = true - ) - public void preSend(final Packet inPacket, @Nullable final GenericFutureListener>[] futureListeners, CallbackInfo callbackInfo) { - if (ModuleManager.preSendPacket(inPacket)) { - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/network/NetworkManager;dispatchPacket(Lnet/minecraft/network/Packet;[Lio/netty/util/concurrent/GenericFutureListener;)V", - at = @At("RETURN") - ) - public void postSend(final Packet inPacket, @Nullable final GenericFutureListener>[] futureListeners, CallbackInfo callbackInfo) { - ModuleManager.postSendPacket(inPacket); - } - - @Inject( - method = "Lnet/minecraft/network/NetworkManager;channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", - at = @At("HEAD"), - cancellable = true - ) - public void preProcess(ChannelHandlerContext p_channelRead0_1_, Packet p_channelRead0_2_, CallbackInfo callbackInfo) { - TickRate.update(p_channelRead0_2_); - if (ModuleManager.preRecievePacket(p_channelRead0_2_)) { - callbackInfo.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/network/NetworkManager;channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", - at = @At("RETURN") - ) - public void postProcess(ChannelHandlerContext p_channelRead0_1_, Packet p_channelRead0_2_, CallbackInfo callbackInfo) { - ModuleManager.postRecievePacket(p_channelRead0_2_); - } - - @Inject( - method = "Lnet/minecraft/network/NetworkManager;closeChannel(Lnet/minecraft/util/text/ITextComponent;)V", - at = @At("HEAD") - ) - public void preCloseChannel(ITextComponent message, CallbackInfo callbackInfo) { - TickRate.reset(); - if (FreecamMod.INSTANCE.state.enabled) { - ModuleManager.disableModule(FreecamMod.INSTANCE); - } - } - - @Inject( - method = "Lnet/minecraft/network/NetworkManager;exceptionCaught(Lio/netty/channel/ChannelHandlerContext;Ljava/lang/Throwable;)V", - at = @At("RETURN") - ) - public void postExceptionCaught(ChannelHandlerContext p_exceptionCaught_1_, Throwable p_exceptionCaught_2_, CallbackInfo callbackInfo) { - p_exceptionCaught_2_.printStackTrace(System.out); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/network/play/client/MixinCPacketPlayer.java b/src/main/java/net/daporkchop/pepsimod/mixin/network/play/client/MixinCPacketPlayer.java deleted file mode 100644 index 1f4b0b5..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/network/play/client/MixinCPacketPlayer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.network.play.client; - -import net.daporkchop.pepsimod.module.impl.misc.AntiHungerMod; -import net.daporkchop.pepsimod.module.impl.misc.NoFallMod; -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.client.CPacketPlayer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.io.IOException; - -@Mixin(CPacketPlayer.class) -public abstract class MixinCPacketPlayer { - @Shadow - protected boolean onGround; - - @Overwrite - public void writePacketData(PacketBuffer buf) throws IOException { - if (NoFallMod.NO_FALL && AntiHungerMod.ANTI_HUNGER) { - buf.writeByte(this.onGround ? 0 : 1); - /* - * This inverts the value sent to the server - * If the player is falling, it says that it's on the ground - * And antihunger will run while the player's on the ground (it says it's not on the ground) - */ - } else if (NoFallMod.NO_FALL) { - buf.writeByte(1); //on ground - } else if (AntiHungerMod.ANTI_HUNGER) { - buf.writeByte(0); //on ground - } else { - buf.writeByte(this.onGround ? 1 : 0); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/scoreboard/MixinScoreboard.java b/src/main/java/net/daporkchop/pepsimod/mixin/scoreboard/MixinScoreboard.java deleted file mode 100644 index c3c5083..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/scoreboard/MixinScoreboard.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.scoreboard; - -import com.google.common.collect.Maps; -import net.minecraft.scoreboard.ScorePlayerTeam; -import net.minecraft.scoreboard.Scoreboard; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Map; - -@Mixin(Scoreboard.class) -public abstract class MixinScoreboard { - @Shadow - private final Map teamMemberships = Maps.newHashMap(); - - @Overwrite - public void removePlayerFromTeam(String username, ScorePlayerTeam playerTeam) { - try { - if (this.getPlayersTeam(username) != playerTeam) { - throw new IllegalStateException("Player is either on another team or not on any team. Cannot remove from team '" + playerTeam.getName() + "'."); - } else { - this.teamMemberships.remove(username); - playerTeam.getMembershipCollection().remove(username); - } - } catch (NullPointerException e) { - } - } - - @Shadow - public ScorePlayerTeam getPlayersTeam(String username) { - return null; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinMovementInputFromOptions.java b/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinMovementInputFromOptions.java deleted file mode 100644 index c6da88f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinMovementInputFromOptions.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.util; - -import net.daporkchop.pepsimod.gui.clickgui.ClickGUI; -import net.daporkchop.pepsimod.module.impl.movement.InventoryMoveMod; -import net.daporkchop.pepsimod.optimization.OverrideCounter; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.client.gui.GuiIngameMenu; -import net.minecraft.client.renderer.InventoryEffectRenderer; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.MovementInput; -import net.minecraft.util.MovementInputFromOptions; -import org.lwjgl.input.Keyboard; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; - -@Mixin(MovementInputFromOptions.class) -public abstract class MixinMovementInputFromOptions extends MovementInput { - @Redirect( - method = "Lnet/minecraft/util/MovementInputFromOptions;updatePlayerMoveState()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/settings/KeyBinding;isKeyDown()Z" - )) - public boolean redirectIsKeyDown(KeyBinding binding) { - if (((OverrideCounter) binding).isOverriden()) { - return true; - } - if (InventoryMoveMod.INSTANCE.state.enabled && mc.currentScreen != null) { - if (mc.currentScreen instanceof InventoryEffectRenderer) { - return Keyboard.isKeyDown(binding.getKeyCode()) || ReflectionStuff.getPressed(binding); - } else if (mc.world.isRemote && mc.currentScreen instanceof GuiIngameMenu) { - return Keyboard.isKeyDown(binding.getKeyCode()) || ReflectionStuff.getPressed(binding); - } else if (mc.currentScreen instanceof ClickGUI) { - return Keyboard.isKeyDown(binding.getKeyCode()) || ReflectionStuff.getPressed(binding); - } else if (mc.currentScreen instanceof GuiChat) { - return ReflectionStuff.getPressed(binding); - } - } - return binding.isKeyDown(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTabCompleter.java b/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTabCompleter.java deleted file mode 100644 index 75210e1..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTabCompleter.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.util; - -import net.daporkchop.pepsimod.command.CommandRegistry; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.util.TabCompleter; -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.callback.CallbackInfo; - -@Mixin(TabCompleter.class) -public abstract class MixinTabCompleter { - @Shadow - @Final - protected GuiTextField textField; - - @Inject( - method = "Lnet/minecraft/util/TabCompleter;complete()V", - at = @At("HEAD"), - cancellable = true - ) - public void preComplete(CallbackInfo callbackInfo) { - if (this.textField.getText().startsWith(".")) { - String completed = CommandRegistry.getSuggestionFor(this.textField.getText()); - if (completed == null || completed.isEmpty() || completed.length() <= this.textField.getText().length()) { - return; - //run vanilla code - } - this.textField.setText(completed); - callbackInfo.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTimer.java b/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTimer.java deleted file mode 100644 index a314f7d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/util/MixinTimer.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.util; - -import net.daporkchop.pepsimod.module.impl.misc.TimerMod; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Timer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(Timer.class) -public abstract class MixinTimer { - @Shadow - public int elapsedTicks; - - @Shadow - public float renderPartialTicks; - - @Shadow - public float elapsedPartialTicks; - - @Shadow - private long lastSyncSysClock; - - @Shadow - private float tickLength; - - @Overwrite - public void updateTimer() { - float timerSpeed = (TimerMod.INSTANCE == null ? - 1.0f : - TimerMod.INSTANCE.getMultiplier()); - - long i = Minecraft.getSystemTime(); - this.elapsedPartialTicks = (float) (i - this.lastSyncSysClock) / this.tickLength * timerSpeed; - this.lastSyncSysClock = i; - this.renderPartialTicks += this.elapsedPartialTicks; - this.elapsedTicks = (int) this.renderPartialTicks; - this.renderPartialTicks -= this.elapsedTicks; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/util/text/translation/MixinLanguageMap.java b/src/main/java/net/daporkchop/pepsimod/mixin/util/text/translation/MixinLanguageMap.java deleted file mode 100644 index b8443e5..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/util/text/translation/MixinLanguageMap.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.util.text.translation; - -import net.minecraft.util.text.translation.LanguageMap; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Map; - -import static net.daporkchop.pepsimod.util.PepsiConstants.pepsimod; - -/** - * @author DaPorkchop_ - */ -@Mixin(LanguageMap.class) -public abstract class MixinLanguageMap { - @Redirect( - method = "Lnet/minecraft/util/text/translation/LanguageMap;replaceWith(Ljava/util/Map;)V", - at = @At( - value = "INVOKE", - target = "Ljava/util/Map;putAll(Ljava/util/Map;)V" - )) - private static void postReplaceWith(Map languageList, Map newMap) { - languageList.putAll(newMap); - if (pepsimod != null) { - languageList.putAll(pepsimod.data.localeKeys); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/world/MixinWorld.java b/src/main/java/net/daporkchop/pepsimod/mixin/world/MixinWorld.java deleted file mode 100644 index 4c597aa..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/world/MixinWorld.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.world; - -import net.daporkchop.pepsimod.module.impl.render.NoWeatherMod; -import net.daporkchop.pepsimod.util.config.impl.NoWeatherTranslator; -import net.minecraft.world.World; -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(World.class) -public abstract class MixinWorld { - @Inject( - method = "Lnet/minecraft/world/World;getCelestialAngle(F)F", - at = @At("HEAD"), - cancellable = true - ) - public void preGetCelestialAngle(float partialTicks, CallbackInfoReturnable callbackInfoReturnable) { - if (NoWeatherMod.INSTANCE.state.enabled && NoWeatherTranslator.INSTANCE.changeTime) { - callbackInfoReturnable.setReturnValue(NoWeatherTranslator.INSTANCE.time + 0.0f); - callbackInfoReturnable.cancel(); - } - } - - @Inject( - method = "Lnet/minecraft/world/World;getRainStrength(F)F", - at = @At("HEAD"), - cancellable = true - ) - public void preGetRainStrength(float partialTicks, CallbackInfoReturnable callbackInfoReturnable) { - if (NoWeatherMod.INSTANCE.state.enabled && NoWeatherTranslator.INSTANCE.disableRain) { - callbackInfoReturnable.setReturnValue(0.0f); - callbackInfoReturnable.cancel(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/world/storage/MixinWorldInfo.java b/src/main/java/net/daporkchop/pepsimod/mixin/world/storage/MixinWorldInfo.java deleted file mode 100644 index a98799a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/mixin/world/storage/MixinWorldInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.mixin.world.storage; - -import net.daporkchop.pepsimod.module.impl.render.NoWeatherMod; -import net.daporkchop.pepsimod.util.config.impl.NoWeatherTranslator; -import net.minecraft.world.storage.WorldInfo; -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(WorldInfo.class) -public abstract class MixinWorldInfo { - @Inject( - method = "Lnet/minecraft/world/storage/WorldInfo;getWorldTime()J", - at = @At("HEAD"), - cancellable = true - ) - public void preGetWorldTime(CallbackInfoReturnable callbackInfoReturnable) { - if (NoWeatherMod.INSTANCE.state.enabled && NoWeatherTranslator.INSTANCE.changeTime) { - callbackInfoReturnable.setReturnValue((long) NoWeatherTranslator.INSTANCE.time); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/ModuleCategory.java b/src/main/java/net/daporkchop/pepsimod/module/ModuleCategory.java deleted file mode 100644 index 0af0a46..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/ModuleCategory.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module; - -public enum ModuleCategory { - RENDER, - COMBAT, - MISC, - MOVEMENT, - PLAYER, - - PLACEHOLDER -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/ModuleManager.java b/src/main/java/net/daporkchop/pepsimod/module/ModuleManager.java deleted file mode 100644 index c48b22d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/ModuleManager.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module; - -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleSortType; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.minecraft.network.Packet; - -import java.util.ArrayList; -import java.util.concurrent.ThreadLocalRandom; - -public class ModuleManager { - - /** - * All modules that are registered - */ - public static ArrayList AVALIBLE_MODULES = new ArrayList<>(); - - /** - * All modules that are currently enabled - */ - public static ArrayList ENABLED_MODULES = new ArrayList<>(); - - /** - * Adds a module to the registry - * - * @param toRegister the Module to register - * @return the Module passed to the function - */ - public static Module registerModule(Module toRegister) { - if (toRegister.shouldRegister()) { - AVALIBLE_MODULES.add(toRegister); - if (toRegister.state.enabled) { - enableModule(toRegister); - } else { - disableModule(toRegister); - } - } - return toRegister; - } - - public static void registerModules(Module... toRegister) { - for (Module module : toRegister) { - registerModule(module); - } - } - - public static void unRegister(Module module) { - if (AVALIBLE_MODULES.contains(module)) { - AVALIBLE_MODULES.remove(module); - ENABLED_MODULES.remove(module); - } - } - - /** - * Enables a module - * - * @param toEnable the module to enable - * @return the enabled module - */ - public static Module enableModule(Module toEnable) { - if (!ENABLED_MODULES.contains(toEnable)) { - if (AVALIBLE_MODULES.contains(toEnable)) { - ENABLED_MODULES.add(toEnable); - toEnable.setEnabled(true); - } else { - throw new IllegalStateException("Attempted to enable an unregistered Module!"); - } - } - return toEnable; - } - - /** - * Disables a module - * - * @param toDisable the module to disable - * @return the disabled module - */ - public static Module disableModule(Module toDisable) { - if (toDisable.state.enabled && ENABLED_MODULES.contains(toDisable)) { - if (AVALIBLE_MODULES.contains(toDisable)) { - ENABLED_MODULES.remove(toDisable); - toDisable.setEnabled(false); - } else { - throw new IllegalStateException("Attempted to disable an unregistered Module!"); - } - } - return toDisable; - } - - /** - * Toggles a module - * - * @param toToggle the module to toggle - * @return the toggled module - */ - public static Module toggleModule(Module toToggle) { - if (toToggle.state.enabled) { - disableModule(toToggle); - } else { - enableModule(toToggle); - } - return toToggle; - } - - /** - * Gets a module by it's name - * - * @param name the module's name - * @return a module, or null if nothing was found - */ - public static Module getModuleByName(String name) { - for (Module module : AVALIBLE_MODULES) { - if (module.name.equals(name)) { - return module; - } - } - - return null; - } - - @SuppressWarnings("unchecked") - public static void sortModules(ModuleSortType type) { - GeneralTranslator.INSTANCE.sortType = type; - switch (type) { - case ALPHABETICAL: - ArrayList tempArrayList = (ArrayList) ENABLED_MODULES.clone(); - ArrayList newArrayList = new ArrayList<>(); - ESCAPE: - for (Module module : tempArrayList) { - for (int i = 0; i < newArrayList.size(); i++) { - if (module.name.compareTo(newArrayList.get(i).name) < 0) { - newArrayList.add(i, module); - continue ESCAPE; - } - } - newArrayList.add(module); - } - ENABLED_MODULES = newArrayList; - break; - case DEFAULT: //hehe do nothing lol - break; - case SIZE: - ArrayList tempArrayList1 = (ArrayList) ENABLED_MODULES.clone(); - ArrayList newArrayList1 = new ArrayList<>(); - ESCAPE: - for (Module module : tempArrayList1) { - if (module.text == null) { - return; - } - for (int i = 0; i < newArrayList1.size(); i++) { - Module existingModule = newArrayList1.get(i); - if (module.text.width() > existingModule.text.width()) { - newArrayList1.add(i, module); - continue ESCAPE; - } else if (module.text.width() == existingModule.text.width()) { - if (module.name.compareTo(existingModule.name) < 0) { - newArrayList1.add(i, module); - continue ESCAPE; - } - } - } - newArrayList1.add(module); - } - ENABLED_MODULES = newArrayList1; - break; - case RANDOM: - ArrayList tempArrayList2 = (ArrayList) ENABLED_MODULES.clone(); - ArrayList newArrayList2 = new ArrayList<>(); - for (Module module : tempArrayList2) { - newArrayList2.add(ThreadLocalRandom.current().nextInt(newArrayList2.size()), module); - } - ENABLED_MODULES = newArrayList2; - } - } - - public static boolean preRecievePacket(Packet packetIn) { - boolean cancel = false; - for (Module module : ENABLED_MODULES) { - if (module.preRecievePacket(packetIn)) { - cancel = true; - } - } - return cancel; - } - - public static void postRecievePacket(Packet packetIn) { - for (Module module : ENABLED_MODULES) { - module.postRecievePacket(packetIn); - } - } - - public static boolean preSendPacket(Packet packetIn) { - boolean cancel = false; - for (Module module : ENABLED_MODULES) { - if (module.preSendPacket(packetIn)) { - cancel = true; - } - } - return cancel; - } - - public static void postSendPacket(Packet packetIn) { - for (Module module : ENABLED_MODULES) { - module.postSendPacket(packetIn); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/Module.java b/src/main/java/net/daporkchop/pepsimod/module/api/Module.java deleted file mode 100644 index 1b4eb02..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/Module.java +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -import net.daporkchop.pepsimod.command.CommandRegistry; -import net.daporkchop.pepsimod.command.api.Command; -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorizedText; -import net.daporkchop.pepsimod.util.colors.rainbow.RainbowText; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import net.daporkchop.pepsimod.util.event.MoveEvent; -import net.daporkchop.pepsimod.util.misc.ITickListener; -import net.daporkchop.pepsimod.util.render.WorldRenderer; -import net.minecraft.client.gui.GuiIngame; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.network.Packet; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import org.lwjgl.input.Keyboard; - -import java.util.ArrayList; - -/** - * hehe this is actually a command - * but it's a module - * gl understanding my overly complicated class heirachy - */ -public abstract class Module extends Command implements ITickListener { - public static boolean shouldBeEnabled(boolean in, ModuleLaunchState state) { - if (state == ModuleLaunchState.ENABLED) { - return true; - } else if (state == ModuleLaunchState.DISABLED) { - return false; - } else { - return in; - } - } - public KeyBinding keybind; - public ColorizedText text; - public ModuleOption[] options; - public String nameFull; - public String[] completionOptions; - public GeneralTranslator.ModuleState state; - - public Module(String name) { - this(false, name, -1, false); - } - - public Module(boolean def, String name, int keybind, boolean hide) { - super(name.toLowerCase()); - this.nameFull = name; - this.options = this.getDefaultOptions(); - this.registerKeybind(name, keybind); - this.state = GeneralTranslator.INSTANCE.getState(name, new GeneralTranslator.ModuleState(def, hide)); - if (this.state == null) { - GeneralTranslator.INSTANCE.states.put(name, this.state = new GeneralTranslator.ModuleState(def, hide)); - } - } - - /** - * Toggles a Module - * - * @return the new status - */ - public boolean toggle() { - this.state.enabled = !this.state.enabled; - if (this.state.enabled) { - this.onEnable(); - } else { - this.onDisable(); - } - return this.state.enabled; - } - - /** - * Enables or disables a Module - * - * @return the given argument - */ - public boolean setEnabled(boolean enabled) { - this.state.enabled = enabled; - if (this.state.enabled) { - this.onEnable(); - } else { - this.onDisable(); - } - return this.state.enabled; - } - - /** - * Handles base initialization logic after minecraft is started - */ - public final void doInit() { - this.init(); - if (this.hasModeInName()) { - this.updateName(); - } else { - this.text = new RainbowText(this.nameFull); - } - CommandRegistry.registerCommand(this); - ArrayList temp = new ArrayList<>(); - for (ModuleOption option : this.options) { - temp.add(option.getName()); - } - //temp.add("list"); is this really needed? get opinions - this.completionOptions = temp.toArray(new String[temp.size()]); - } - - /** - * Gets a ModuleOption by name - * - * @param name the name to search for - * @return a ModuleOption by the given name, null if there was nothing with the name - */ - public ModuleOption getOptionByName(String name) { - for (ModuleOption moduleOption : this.options) { - if (moduleOption.getName().equals(name)) { - return moduleOption; - } - } - - return null; - } - - public boolean shouldTick() { - return this.state.enabled; - } - - /** - * Called when the Module is enabled - */ - public abstract void onEnable(); - - /** - * Called when the Module is disabled - */ - public abstract void onDisable(); - - /** - * Called when minecraft is started - */ - public abstract void init(); - - /** - * Module specific module settings - */ - protected abstract ModuleOption[] getDefaultOptions(); - - /** - * Called directly after a packet is recieved, before it's processed - * - * @return if true, the packet will be ignored by vanilla - */ - public boolean preRecievePacket(Packet packetIn) { - return false; - } - - /** - * Called after a packet is recieved, after it's been processed - */ - public void postRecievePacket(Packet packetIn) { - } - - /** - * Called right before a packet is sent - * - * @return if true, the packet will not be sent - */ - public boolean preSendPacket(Packet packetIn) { - return false; - } - - /** - * Called after a packet is sent - */ - public void postSendPacket(Packet packetIn) { - } - - /** - * Whether or not extra info should show in the name - * e.g. - * Criticals [Packet] - */ - public boolean hasModeInName() { - return false; - } - - /** - * Whether or not extra info should show in the name - * e.g. - * Criticals [Packet] - *

- * This method returned "Packet" - */ - public String getModeForName() { - return ""; - } - - /** - * Updates the module's name - * Does nothing if the module has no custom name - */ - public void updateName() { - if (pepsimod.isInitialized && this.hasModeInName()) { - if (HUDTranslator.INSTANCE.rainbow) { - this.text = new RainbowText(this.nameFull + PepsiUtils.COLOR_ESCAPE + "customa8a8a8 [" + this.getModeForName() + "]"); - } else { - this.text = new RainbowText(this.nameFull + PepsiUtils.COLOR_ESCAPE + "7 [" + this.getModeForName() + "]"); - } - } - } - - public String getSuggestion(String cmd, String[] args) { - switch (args.length) { - case 1: - return "." + this.name + " " + (this.completionOptions.length == 0 ? "" : this.completionOptions[0]); - case 2: - if (args[1].isEmpty()) { - return "." + this.name + " " + (this.completionOptions.length == 0 ? "" : this.completionOptions[0]); - } - for (String mode : this.completionOptions) { - if (mode.equals(args[1])) { - ModuleOption option = this.getOptionByName(args[1]); - if (option == null) { - return ""; - } else { - return args[0] + " " + args[1] + " " + option.getDefaultValue(); - } - } else if (mode.startsWith(args[1])) { - return "." + this.name + " " + mode; - } - } - return ""; - case 3: - if (args[2].isEmpty()) { - ModuleOption option = this.getOptionByName(args[1].trim()); - if (option == null) { - return ""; - } else { - return args[0] + " " + args[1] + " " + option.getDefaultValue(); - } - } - ModuleOption option = this.getOptionByName(args[1]); - if (option == null) { - return ""; - } else { - if (option.getDefaultValue().toString().startsWith(args[2])) { - return args[0] + " " + args[1] + " " + option.getDefaultValue(); - } else { - for (String s : option.defaultCompletions()) { - if (s.startsWith(args[2])) { - return args[0] + " " + args[1] + " " + s; - } - } - return ""; - } - } - } - - return "." + this.name; - } - - public void execute(String cmd, String[] args) { - switch (args.length) { - case 1: - String commands = ""; - for (int i = 0; i < this.completionOptions.length; i++) { - commands += PepsiUtils.COLOR_ESCAPE + "o" + this.completionOptions[i] + PepsiUtils.COLOR_ESCAPE + "r" + (i + 1 == this.completionOptions.length ? "" : ", "); - } - clientMessage(commands); - break; - case 2: - if (args[1].isEmpty()) { - String cmds = ""; - for (int i = 0; i < this.completionOptions.length; i++) { - cmds += PepsiUtils.COLOR_ESCAPE + "o" + this.completionOptions[i] + PepsiUtils.COLOR_ESCAPE + "r" + (i + 1 == this.completionOptions.length ? "" : ", "); - } - clientMessage(cmds); - break; - } - ModuleOption option = this.getOptionByName(args[1]); - if (option == null) { - clientMessage("Unknown option: " + PepsiUtils.COLOR_ESCAPE + "o" + args[1]); - break; - } else { - clientMessage(args[1] + ": " + option.getValue()); - break; - } - case 3: - if (args[2].isEmpty()) { - ModuleOption opt = this.getOptionByName(args[1]); - if (opt == null) { - clientMessage("Unknown option: " + PepsiUtils.COLOR_ESCAPE + "o" + args[1]); - break; - } else { - clientMessage(args[1] + ": " + opt.getValue()); - break; - } - } - ModuleOption opt = this.getOptionByName(args[1]); - if (opt == null) { - clientMessage("Unknown option: " + PepsiUtils.COLOR_ESCAPE + "o" + args[1]); - break; - } else { - try { - switch (opt.getValue().getClass().getCanonicalName()) { - case "java.lang.String": - opt.setValue(args[2]); - break; - case "java.lang.Boolean": - opt.setValue(Boolean.parseBoolean(args[2])); - break; - case "java.lang.Byte": - opt.setValue(Byte.parseByte(args[2])); - break; - case "java.lang.Double": - opt.setValue(Double.parseDouble(args[2])); - break; - case "java.lang.Float": - opt.setValue(Float.parseFloat(args[2])); - break; - case "java.lang.Integer": - opt.setValue(Integer.parseInt(args[2])); - break; - case "java.lang.Short": - opt.setValue(Short.parseShort(args[2])); - break; - default: - clientMessage("Unknown value type: " + PepsiUtils.COLOR_ESCAPE + "o" + opt.getValue().getClass().getCanonicalName() + PepsiUtils.COLOR_ESCAPE + "r. Please report to devs!"); - return; - } - - switch (args[1]) { - case "hidden": - this.state.hidden = (boolean) opt.getValue(); - break; - case "enabled": - if ((boolean) opt.getValue()) { - ModuleManager.enableModule(this); - } else { - ModuleManager.disableModule(this); - } - break; - } - clientMessage("Set " + PepsiUtils.COLOR_ESCAPE + "o" + args[1] + PepsiUtils.COLOR_ESCAPE + "r to " + PepsiUtils.COLOR_ESCAPE + "o" + opt.getValue()); - } catch (NumberFormatException e) { - clientMessage("Invalid number: " + PepsiUtils.COLOR_ESCAPE + "o" + args[2]); - } - } - } - } - - /** - * called every frame - */ - public void onRender(float partialTicks) { - } - - public void onRenderGUI(float partialTicks, int width, int height, GuiIngame gui) { - } - - public void renderOverlay(WorldRenderer renderer) { - } - - public void renderWorld(WorldRenderer renderer) { - } - - @Deprecated - public ModuleLaunchState getLaunchState() { - return ModuleLaunchState.AUTO; - } - - public void registerKeybind(String name, int key) { - this.keybind = new KeyBinding(name, key == -1 ? Keyboard.KEY_NONE : key, "key.categories.pepsimod"); - ClientRegistry.registerKeyBinding(this.keybind); - } - - public abstract ModuleCategory getCategory(); - - public void onPlayerMove(MoveEvent e) { - - } - - public boolean shouldRegister() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleLaunchState.java b/src/main/java/net/daporkchop/pepsimod/module/api/ModuleLaunchState.java deleted file mode 100644 index aa60927..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleLaunchState.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -public enum ModuleLaunchState { - ENABLED, - DISABLED, - AUTO -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleOption.java b/src/main/java/net/daporkchop/pepsimod/module/api/ModuleOption.java deleted file mode 100644 index d063e06..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleOption.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -import net.daporkchop.pepsimod.module.api.option.OptionExtended; - -import java.util.function.Function; -import java.util.function.Supplier; - -public class ModuleOption { - public final Function SET; - public final Supplier GET; - private final String[] DEFAULT_COMPLETIONS; - private final T DEFAULT_VALUE; - public String displayName; - public boolean makeButton = true; - public OptionExtended extended = null; - private T value; - private String name; - - public ModuleOption(T defaultValue, String name, String[] defaultCompletions, Function set, Supplier get, String displayName, OptionExtended extended, boolean makeWindow) { - this(defaultValue, name, defaultCompletions, set, get, displayName, makeWindow); - this.extended = extended; - } - - public ModuleOption(T defaultValue, String name, String[] defaultCompletions, Function set, Supplier get, String displayName, OptionExtended extended) { - this(defaultValue, name, defaultCompletions, set, get, displayName); - this.extended = extended; - } - - public ModuleOption(T defaultValue, String name, String[] defaultCompletions, Function set, Supplier get, String displayName, boolean makeButton) { - this(defaultValue, name, defaultCompletions, set, get, displayName); - this.makeButton = makeButton; - } - - public ModuleOption(T defaultValue, String name, String[] defaultCompletions, Function set, Supplier get, String displayName) { - this.DEFAULT_COMPLETIONS = defaultCompletions; - this.DEFAULT_VALUE = defaultValue; - this.SET = set; - this.GET = get; - this.value = defaultValue; - this.name = name; - this.displayName = displayName; - } - - public String getName() { - return this.name == null ? this.displayName.toLowerCase() : this.name; - } - - public boolean setValue(T value) { - return this.SET.apply(value); - } - - public T getValue() { - T toReturn = this.GET.get(); - return toReturn == null ? this.getDefaultValue() : toReturn; - } - - public T getDefaultValue() { - return this.DEFAULT_VALUE; - } - - public String[] defaultCompletions() { - return this.DEFAULT_COMPLETIONS; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleSortType.java b/src/main/java/net/daporkchop/pepsimod/module/api/ModuleSortType.java deleted file mode 100644 index adc7a0a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/ModuleSortType.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -public enum ModuleSortType { - ALPHABETICAL, - SIZE, - RANDOM, - DEFAULT; - - public static ModuleSortType fromOrdinal(int ordinal) { - return values()[ordinal]; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/OptionCompletions.java b/src/main/java/net/daporkchop/pepsimod/module/api/OptionCompletions.java deleted file mode 100644 index 066ddeb..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/OptionCompletions.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -public class OptionCompletions { - public static final String[] BOOLEAN = new String[]{"true", "false"}; - public static final String[] BYTE = new String[]{"0"}; - public static final String[] DOUBLE = new String[]{"0.0"}; - public static final String[] FLOAT = new String[]{"0.0"}; - public static final String[] INTEGER = new String[]{"0"}; - public static final String[] SHORT = new String[]{"0"}; - public static final String[] STRING = new String[]{""}; -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/TimeModule.java b/src/main/java/net/daporkchop/pepsimod/module/api/TimeModule.java deleted file mode 100644 index 3aa2736..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/TimeModule.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api; - -public abstract class TimeModule extends Module { - public long currentMS = 0L; - public long lastMS = -1L; - - public TimeModule(String name) { - super(name); - } - - public final void updateMS() { - this.currentMS = System.currentTimeMillis(); - } - - public final void updateLastMS() { - this.lastMS = System.currentTimeMillis(); - } - - public final boolean hasTimePassedM(long MS) { - return this.currentMS >= this.lastMS + MS; - } - - public final boolean hasTimePassedS(float speed) { - return this.currentMS >= this.lastMS + (long) (1000 / speed); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionBoolean.java b/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionBoolean.java deleted file mode 100644 index 7db4fc9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionBoolean.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api.option; - -public class ExtensionBoolean extends OptionExtended { //tbh this will probably never be used but whatever - @Override - public ExtensionType getType() { - return ExtensionType.TYPE_BOOLEAN; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionMulti.java b/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionMulti.java deleted file mode 100644 index de97889..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionMulti.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api.option; - -public class ExtensionMulti extends OptionExtended { - //TODO - - @Override - public ExtensionType getType() { - return ExtensionType.TYPE_MULTI; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionSlider.java b/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionSlider.java deleted file mode 100644 index d99ed78..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionSlider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api.option; - -public class ExtensionSlider extends OptionExtended { - public final ExtensionType dataType; - public final Object min, max, step; - - public ExtensionSlider(ExtensionType dataType, Object min, Object max, Object step) { - this.dataType = dataType; - this.min = min; - this.max = max; - this.step = step; - } - - @Override - public ExtensionType getType() { - return ExtensionType.TYPE_SLIDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionType.java b/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionType.java deleted file mode 100644 index be51e63..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/option/ExtensionType.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api.option; - -public enum ExtensionType { - TYPE_BOOLEAN, - TYPE_SLIDER, - TYPE_MULTI, - VALUE_INT, - VALUE_FLOAT -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/api/option/OptionExtended.java b/src/main/java/net/daporkchop/pepsimod/module/api/option/OptionExtended.java deleted file mode 100644 index 4b96831..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/api/option/OptionExtended.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.api.option; - -public abstract class OptionExtended { - public abstract ExtensionType getType(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/BasicMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/BasicMod.java deleted file mode 100644 index 480fe74..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/BasicMod.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class BasicMod extends Module { - public static BasicMod INSTANCE; - - { - INSTANCE = this; - } - - public BasicMod() { - super("delet_this"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLACEHOLDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AuraMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AuraMod.java deleted file mode 100644 index 7cb755b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AuraMod.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.module.impl.player.AutoEatMod; -import net.daporkchop.pepsimod.the.wurst.pkg.name.EntityUtils; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RotationUtils; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.TargettingTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.util.EnumHand; - -public class AuraMod extends Module { - public static final String[] targetBoneStrings = new String[]{"head", "feet", "middle"}; - public static AuraMod INSTANCE; - public int lastTick = 0; - - { - INSTANCE = this; - } - - public AuraMod() { - super("Aura"); - } - - @Override - public void onEnable() { - if (mc.player == null) { - } - } - - @Override - public void onDisable() { - if (mc.player == null) { - } - } - - @Override - public void tick() { - if (AutoEatMod.INSTANCE.state.enabled && !AutoEatMod.INSTANCE.doneEating) { - return; - } - - if (TargettingTranslator.INSTANCE.use_cooldown) { - if (mc.player.getCooledAttackStrength(0) == 1) { - Entity entity = EntityUtils.getBestEntityToAttack(EntityUtils.DEFAULT_SETTINGS); - if (entity == null) { - return; - } - - if (TargettingTranslator.INSTANCE.rotate) { - if (!RotationUtils.faceEntityPacket(entity)) { - return; - } - if (!TargettingTranslator.INSTANCE.silent) { - RotationUtils.faceEntityClient(entity); - } - } - - mc.playerController.attackEntity(mc.player, entity); - if (!TargettingTranslator.INSTANCE.silent) { - mc.player.swingArm(EnumHand.MAIN_HAND); - } - } - } else { - this.lastTick++; - - if (this.lastTick >= TargettingTranslator.INSTANCE.delay) { - this.lastTick = 0; - - Entity entity = EntityUtils.getBestEntityToAttack(EntityUtils.DEFAULT_SETTINGS); - if (entity == null) { - return; - } - - if (TargettingTranslator.INSTANCE.rotate) { - if (!RotationUtils.faceEntityPacket(entity)) { - return; - } - if (!TargettingTranslator.INSTANCE.silent) { - RotationUtils.faceEntityClient(entity); - } - } - - mc.playerController.attackEntity(mc.player, entity); - if (!TargettingTranslator.INSTANCE.silent) { - mc.player.swingArm(EnumHand.MAIN_HAND); - } - } - } - } - - @Override - public void init() { - - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ //wtf why is this throwing an NPE - new ModuleOption<>(TargettingTranslator.INSTANCE.players, "players", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.players = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.players; - }, "Players"), - new ModuleOption<>(TargettingTranslator.INSTANCE.animals, "animals", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.animals = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.animals; - }, "Animals"), - new ModuleOption<>(TargettingTranslator.INSTANCE.monsters, "monsters", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.monsters = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.monsters; - }, "Monsters"), - new ModuleOption<>(TargettingTranslator.INSTANCE.golems, "golems", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.golems = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.golems; - }, "Golems"), - new ModuleOption<>(TargettingTranslator.INSTANCE.sleeping, "sleeping", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.sleeping = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.sleeping; - }, "Sleeping"), - new ModuleOption<>(TargettingTranslator.INSTANCE.invisible, "invisible", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.invisible = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.invisible; - }, "Invisible"), - new ModuleOption<>(TargettingTranslator.INSTANCE.teams, "teams", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.teams = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.teams; - }, "Teams"), - new ModuleOption<>(TargettingTranslator.INSTANCE.friends, "friends", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.friends = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.friends; - }, "Friends"), - new ModuleOption<>(TargettingTranslator.INSTANCE.through_walls, "through_walls", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.through_walls = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.through_walls; - }, "Through Walls"), - new ModuleOption<>(TargettingTranslator.INSTANCE.fov, "fov", OptionCompletions.FLOAT, - (value) -> { - TargettingTranslator.INSTANCE.fov = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.fov; - }, "FOV", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 360.0f, 0.5f)), - new ModuleOption<>(TargettingTranslator.INSTANCE.reach, "reach", OptionCompletions.FLOAT, - (value) -> { - TargettingTranslator.INSTANCE.reach = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.reach; - }, "Reach", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 10.0f, 0.1f)), - new ModuleOption<>(TargettingTranslator.INSTANCE.delay, "delay", OptionCompletions.INTEGER, - (value) -> { - TargettingTranslator.INSTANCE.delay = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.delay; - }, "Delay", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 50, 1)), - new ModuleOption<>(TargettingTranslator.INSTANCE.use_cooldown, "use_cooldown", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.use_cooldown = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.use_cooldown; - }, "Use Cooldown"), - new ModuleOption<>(TargettingTranslator.INSTANCE.silent, "silent", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.silent = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.silent; - }, "Silent"), - new ModuleOption<>(TargettingTranslator.INSTANCE.rotate, "rotate", OptionCompletions.BOOLEAN, - (value) -> { - TargettingTranslator.INSTANCE.rotate = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.rotate; - }, "Rotate"), - new ModuleOption<>(TargettingTranslator.INSTANCE.targetBone, "bone", targetBoneStrings, - (value) -> { - TargettingTranslator.INSTANCE.targetBone = value; - return true; - }, - () -> { - return TargettingTranslator.INSTANCE.targetBone; - }, "Bone", false) - }; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - String mode = ""; - if (TargettingTranslator.INSTANCE.silent) { - mode += "Silent:"; - } - if (TargettingTranslator.INSTANCE.rotate) { - mode += "Rotate"; - } else { - mode += "NoRotate"; - } - return mode; - } - - @Override - public String getSuggestion(String cmd, String[] args) { - if (args.length == 2 && args[1].equals("bone")) { - return cmd + " " + targetBoneStrings[0]; - } else if (args.length == 3 && args[1].equals("bone")) { - if (args[2].isEmpty()) { - return cmd + targetBoneStrings[0]; - } else { - for (String s : targetBoneStrings) { - if (s.startsWith(args[2])) { - return args[0] + " " + args[1] + " " + s; - } - } - - return ""; - } - } - - return super.getSuggestion(cmd, args); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length == 3 && !args[2].isEmpty() && cmd.startsWith(".aura bone ")) { - String s = args[2].toUpperCase(); - try { - TargettingTranslator.TargetBone bone = TargettingTranslator.TargetBone.valueOf(s); - if (bone == null) { - clientMessage("Not a valid bone: " + args[2]); - } else { - this.getOptionByName("bone").setValue(bone); - clientMessage("Set " + PepsiUtils.COLOR_ESCAPE + "o" + args[1] + PepsiUtils.COLOR_ESCAPE + "r to " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } - } catch (Exception e) { - clientMessage("Not a valid bone: " + args[2]); - } - return; - } - - super.execute(cmd, args); - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoArmorMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoArmorMod.java deleted file mode 100644 index 5b46b8d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoArmorMod.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.TimeModule; -import net.daporkchop.pepsimod.the.wurst.pkg.name.WPlayerController; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; - -public class AutoArmorMod extends TimeModule { - public static AutoArmorMod INSTANCE; - - { - INSTANCE = this; - } - - public AutoArmorMod() { - super("AutoArmor"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (mc.player.capabilities.isCreativeMode) { - return; - } - - this.updateMS(); - if (this.hasTimePassedM(500)) { - this.updateLastMS(); - int[] bestArmorValues = new int[4]; - for (int type = 0; type < 4; type++) { - ItemStack oldArmor = mc.player.inventory.armorItemInSlot(type); - if (oldArmor.getItem() instanceof ItemArmor) { - bestArmorValues[type] = ((ItemArmor) oldArmor.getItem()).damageReduceAmount; - } - } - int[] bestArmorSlots = {-1, -1, -1, -1}; - for (int slot = 0; slot < 36; slot++) { - ItemStack stack = mc.player.inventory.getStackInSlot(slot); - if (stack.getItem() instanceof ItemArmor) { - ItemArmor armor = (ItemArmor) stack.getItem(); - int type = PepsiUtils.getArmorType(armor); - if (armor.damageReduceAmount > bestArmorValues[type]) { - bestArmorValues[type] = armor.damageReduceAmount; - bestArmorSlots[type] = slot; - } - } - } - for (int type = 0; type < 4; type++) { - int slot = bestArmorSlots[type]; - if (slot != -1) { - WPlayerController.windowClick_PICKUP(slot < 9 ? 36 + slot : slot); - WPlayerController.windowClick_PICKUP(8 - type); - WPlayerController.windowClick_PICKUP(slot < 9 ? 36 + slot : slot); - } - } - } - } - - @Override - public void init() { - INSTANCE = this; - this.updateLastMS(); - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoTotemMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoTotemMod.java deleted file mode 100644 index 8765d00..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/AutoTotemMod.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.init.Items; -import net.minecraft.inventory.ClickType; -import net.minecraft.inventory.ContainerPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -/** - * #totallyNotSkidded - */ -public class AutoTotemMod extends Module { - public static AutoTotemMod INSTANCE; - private int timer; - - { - INSTANCE = this; - } - - public AutoTotemMod() { - super("AutoTotem"); - } - - @Override - public void onEnable() { - this.timer = 0; - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - EntityPlayerSP player = mc.player; - - if (this.timer > 0) { - this.timer--; - return; - } - - NonNullList inv; - ItemStack offhand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); - - int inventoryIndex; - - inv = player.inventory.mainInventory; - - if ((offhand == null) || (offhand.getItem() != Items.TOTEM_OF_UNDYING)) { - for (inventoryIndex = 0; inventoryIndex < inv.size(); inventoryIndex++) { - if (inv.get(inventoryIndex) != ItemStack.EMPTY) { - if (inv.get(inventoryIndex).getItem() == Items.TOTEM_OF_UNDYING) { - this.replaceTotem(inventoryIndex); - break; - } - } - } - this.timer = 3; - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } - - public void replaceTotem(int inventoryIndex) { - if (mc.player.openContainer instanceof ContainerPlayer) { - mc.playerController.windowClick(0, inventoryIndex < 9 ? inventoryIndex + 36 : inventoryIndex, 0, ClickType.PICKUP, mc.player); - mc.playerController.windowClick(0, 45, 0, ClickType.PICKUP, mc.player); - mc.playerController.windowClick(0, inventoryIndex < 9 ? inventoryIndex + 36 : inventoryIndex, 0, ClickType.PICKUP, mc.player); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BedBomberMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BedBomberMod.java deleted file mode 100644 index 73551fa..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BedBomberMod.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.TimeModule; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.the.wurst.pkg.name.BlockUtils; -import net.daporkchop.pepsimod.util.config.impl.BedBomberTranslator; -import net.minecraft.block.BlockBed; -import net.minecraft.block.state.IBlockState; -import net.minecraft.inventory.ClickType; -import net.minecraft.item.ItemBed; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; - -public class BedBomberMod extends TimeModule { - public static BedBomberMod INSTANCE; - private static BlockUtils.BlockValidator validator = - (pos) -> { - IBlockState state = mc.world.getBlockState(pos); - return state.getBlock() instanceof BlockBed; - }; - public int itemMoveTick = 3, bedSlot = -1; - private int itemTimer; - private boolean shouldRestock = false; - - { - INSTANCE = this; - } - - public BedBomberMod() { - super("BedBomber"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - this.updateMS(); - - if (this.hasTimePassedM(BedBomberTranslator.INSTANCE.delay) && (mc.player.dimension == -1 || mc.player.dimension == 1)) { - Iterable validBlocks = BlockUtils.getValidBlocksByDistance(BedBomberTranslator.INSTANCE.range, false, validator); - - for (BlockPos pos : validBlocks) { - if (BlockUtils.rightClickBlockLegit(pos)) { - return; - } - } - } - - this.replaceBed(-1); - - if (this.shouldRestock && BedBomberTranslator.INSTANCE.resupply && this.itemMoveTick == 3) { - if (this.itemTimer > 0) { - this.itemTimer--; - return; - } - - ItemStack hand = mc.player.getHeldItem(EnumHand.MAIN_HAND); - NonNullList inv = mc.player.inventory.mainInventory; - - if (hand == null || hand.isEmpty()) { - for (int inventoryIndex = 0; inventoryIndex < inv.size(); inventoryIndex++) { - if (inventoryIndex != mc.player.inventory.currentItem) { - ItemStack stack = inv.get(inventoryIndex); - if (!stack.isEmpty() && stack.getItem() instanceof ItemBed) { - this.replaceBed(inventoryIndex); - break; - } - } - } - this.shouldRestock = false; - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(BedBomberTranslator.INSTANCE.range, "range", OptionCompletions.FLOAT, - (value) -> { - BedBomberTranslator.INSTANCE.range = Math.max(value, 0); - return true; - }, - () -> { - return BedBomberTranslator.INSTANCE.range; - }, "Range", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 10.0f, 0.5f)), - new ModuleOption<>(BedBomberTranslator.INSTANCE.delay, "delay", OptionCompletions.FLOAT, - (value) -> { - BedBomberTranslator.INSTANCE.delay = Math.max(value, 0); - return true; - }, - () -> { - return BedBomberTranslator.INSTANCE.delay; - }, "Delay", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 5000, 50)), - new ModuleOption<>(BedBomberTranslator.INSTANCE.resupply, "resupply", OptionCompletions.BOOLEAN, - (value) -> { - BedBomberTranslator.INSTANCE.resupply = value; - return true; - }, - () -> { - return BedBomberTranslator.INSTANCE.resupply; - }, "Resupply") - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } - - public void replaceBed(int inventoryIndex) { - if (inventoryIndex == -1) { - inventoryIndex = this.bedSlot; - } else { - this.itemMoveTick = 0; - this.bedSlot = inventoryIndex; - } - if (inventoryIndex == -1) { - return; - } - switch (this.itemMoveTick) { - case 0: - mc.playerController.windowClick(0, inventoryIndex < 9 ? inventoryIndex + 36 : inventoryIndex, 0, ClickType.PICKUP, mc.player); - break; - case 1: - mc.playerController.windowClick(0, 36 + mc.player.inventory.currentItem, 0, ClickType.PICKUP, mc.player); - break; - case 2: - mc.playerController.windowClick(0, inventoryIndex < 9 ? inventoryIndex + 36 : inventoryIndex, 0, ClickType.PICKUP, mc.player); - this.bedSlot = -1; - break; - } - this.itemMoveTick++; - } - - public void onPlaceBed() { - if (this.state.enabled && BedBomberTranslator.INSTANCE.resupply) { - this.shouldRestock = true; - this.itemTimer = 3; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BowAimBotMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BowAimBotMod.java deleted file mode 100644 index 7caf923..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/BowAimBotMod.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RenderUtils; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RotationUtils; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.client.gui.GuiIngame; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemBow; -import net.minecraft.util.math.AxisAlignedBB; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; - -public class BowAimBotMod extends Module { - public static BowAimBotMod INSTANCE; - public EntityLivingBase target; - public float velocity; - - { - INSTANCE = this; - } - - public BowAimBotMod() { - super("BowAimBot"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void onRenderGUI(float partialTicks, int width, int height, GuiIngame gui) { - if (this.velocity != -1.0f) { - if (this.velocity > 0.0f) { - gui.drawCenteredString(mc.fontRenderer, "Ready!", width / 2, height / 2 - 20, 16777215); - } else { - gui.drawCenteredString(mc.fontRenderer, "Charging...", width / 2, height / 2 - 20, 16740352); - } - } - } - - @Override - public void onRender(float partialTicks) { - if (this.target != null) { - double[] pos = PepsiUtils.interpolate(this.target); - double x = pos[0] - ReflectionStuff.getRenderPosX(); - double y = pos[1] - ReflectionStuff.getRenderPosY(); - double z = pos[2] - ReflectionStuff.getRenderPosZ(); - - GL11.glPushMatrix(); - GL11.glTranslated(x, y, z); - GL11.glRotatef(-this.target.rotationYaw, 0.0F, 1.0F, 0.0F); - PepsiUtils.glColor(Color.RED); - RenderUtils.drawOutlinedBox(new AxisAlignedBB(this.target.width / 2.0D, 0.0D, -(this.target.width / 2.0D), -this.target.width / 2.0D, this.target.height + 0.1D, this.target.width / 2.0D)); - GL11.glPopMatrix(); - } - - this.target = null; - if (mc.player.inventory.getCurrentItem() != null) { - if (mc.player.inventory.getCurrentItem().getItem() instanceof ItemBow && - mc.gameSettings.keyBindUseItem.isKeyDown()) { - this.target = PepsiUtils.getClosestEntityWithoutReachFactor(); - this.aimAtTarget(); - return; - } - } - this.velocity = -1.0F; - } - - private void aimAtTarget() { - if (this.target == null) { - return; - } - this.velocity = ((72000 - mc.player.getItemInUseCount()) / 20.0F); - this.velocity = ((this.velocity * this.velocity + this.velocity * 2.0F) / 3.0F); - if (this.velocity > 1.0F) { - this.velocity = 1.0F; - } - if (this.velocity < 0.1D) { - if ((this.target instanceof EntityLivingBase)) { - RotationUtils.faceEntityClient(this.target); - RotationUtils.faceEntityPacket(this.target); - } - return; - } - if (this.velocity > 1.0F) { - this.velocity = 1.0F; - } - double posX = this.target.posX - mc.player.posX; - double posY = this.target.posY + this.target.getEyeHeight() - 0.15D - - mc.player.posY - - mc.player.getEyeHeight(); - double posZ = this.target.posZ - mc.player.posZ; - - float yaw = (float) (Math.atan2(posZ, posX) * 180.0D / 3.141592653589793D) - 90.0F; - double y2 = Math.sqrt(posX * posX + posZ * posZ); - float g = 0.006F; - float tmp = (float) (this.velocity * this.velocity * this.velocity * this.velocity - - g * (g * (y2 * y2) + 2.0D * posY * (this.velocity * this.velocity))); - float pitch = (float) -Math.toDegrees( - Math.atan((this.velocity * this.velocity - Math.sqrt(tmp)) / (g * y2))); - mc.player.rotationYaw = yaw; - mc.player.rotationPitch = pitch; - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CriticalsMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CriticalsMod.java deleted file mode 100644 index 2feeae4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CriticalsMod.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.util.config.impl.CriticalsTranslator; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.client.CPacketUseEntity; - -public class CriticalsMod extends Module { - public static CriticalsMod INSTANCE; - - { - INSTANCE = this; - } - - public CriticalsMod() { - super("Criticals"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{new ModuleOption<>(true, "packet", OptionCompletions.BOOLEAN, - (value) -> { - CriticalsTranslator.INSTANCE.packet = value; - return true; - }, - () -> { - return CriticalsTranslator.INSTANCE.packet; - }, "Packet")}; - } - - @Override - public boolean preSendPacket(Packet packetIn) { - if (packetIn instanceof CPacketUseEntity) { - if (((CPacketUseEntity) packetIn).getAction() == CPacketUseEntity.Action.ATTACK) { - this.doCrit(); - } - } - return false; - } - - public void doCrit() { - EntityPlayer player = Minecraft.getMinecraft().player; - - if (!player.onGround) { - return; - } - - if (player.isInWater() || player.isInLava()) { - return; - } - - if ((boolean) this.getOptionByName("packet").getValue()) { - double x = player.posX; - double y = player.posY; - double z = player.posZ; - NetworkManager manager = Minecraft.getMinecraft().getConnection().getNetworkManager(); - manager.sendPacket(new CPacketPlayer.Position(x, y + 0.0625D, z, true)); - manager.sendPacket(new CPacketPlayer.Position(x, y, z, false)); - manager.sendPacket(new CPacketPlayer.Position(x, y + 1.1E-5D, z, false)); - manager.sendPacket(new CPacketPlayer.Position(x, y, z, false)); - } else { - player.motionY = 0.1F; - player.fallDistance = 0.1F; - player.onGround = false; - } - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - if ((boolean) this.getOptionByName("packet").getValue()) { - return "Packet"; - } else { - return "Jump"; - } - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CrystalAuraMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CrystalAuraMod.java deleted file mode 100644 index d81eeec..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/combat/CrystalAuraMod.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.combat; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.CrystalAuraTranslator; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityEnderCrystal; -import net.minecraft.util.EnumHand; - -/** - * #totallyNotSkidded - */ -public class CrystalAuraMod extends Module { - public static CrystalAuraMod INSTANCE; - private long currentMS = 0L; - private long lastMS = -1L; - - { - INSTANCE = this; - } - - public CrystalAuraMod() { - super("CrystalAura"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - EntityPlayerSP player = mc.player; - - this.currentMS = System.nanoTime() / 1000000; - if (this.hasDelayRun((long) (1000 / CrystalAuraTranslator.INSTANCE.speed))) { - for (Entity e : mc.world.loadedEntityList) { - if (player.getDistance(e) < CrystalAuraTranslator.INSTANCE.range) { - if (e instanceof EntityEnderCrystal) { - mc.playerController.attackEntity(player, e); - player.swingArm(EnumHand.MAIN_HAND); - this.lastMS = System.nanoTime() / 1000000; - break; - } - } - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(CrystalAuraTranslator.INSTANCE.speed, "speed", OptionCompletions.FLOAT, - (value) -> { - CrystalAuraTranslator.INSTANCE.speed = Math.max(value, 0); - return true; - }, - () -> { - return CrystalAuraTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0f, 20f, 0.5f)), - new ModuleOption<>(CrystalAuraTranslator.INSTANCE.range, "range", OptionCompletions.FLOAT, - (value) -> { - CrystalAuraTranslator.INSTANCE.range = Math.max(value, 0); - return true; - }, - () -> { - return CrystalAuraTranslator.INSTANCE.range; - }, "Range", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 3f, 10f, 0.05f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.COMBAT; - } - - public boolean hasDelayRun(long time) { - return (this.currentMS - this.lastMS) >= time; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AnnouncerMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AnnouncerMod.java deleted file mode 100644 index 3fcf189..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AnnouncerMod.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.TimeModule; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.AnnouncerTranslator; -import net.daporkchop.pepsimod.util.misc.announcer.MessagePrefixes; -import net.daporkchop.pepsimod.util.misc.announcer.QueuedTask; -import net.daporkchop.pepsimod.util.misc.announcer.TaskType; -import net.daporkchop.pepsimod.util.misc.announcer.impl.TaskBasic; -import net.daporkchop.pepsimod.util.misc.announcer.impl.TaskBlock; -import net.daporkchop.pepsimod.util.misc.announcer.impl.TaskMove; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.network.FMLNetworkEvent; - -import java.util.Iterator; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -public class AnnouncerMod extends TimeModule { - public static AnnouncerMod INSTANCE; - public Queue toSend = new ConcurrentLinkedQueue<>(); - - { - INSTANCE = this; - } - - public AnnouncerMod() { - super("Announcer"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - if (mc.world != null && mc.world.isRemote) { - this.updateMS(); - if (this.hasTimePassedM(AnnouncerTranslator.INSTANCE.delay)) { - this.updateLastMS(); - MAINLOOP: - while (this.toSend.size() > 0) { - QueuedTask task = this.toSend.poll(); - if (task != null) { - String msg = task.getMessage(); - if (msg != null) { - if (AnnouncerTranslator.INSTANCE.clientSide) { - mc.player.sendMessage(new TextComponentString(PepsiUtils.COLOR_ESCAPE + "a" + msg)); - } else { - mc.player.sendChatMessage(msg); - } - break MAINLOOP; - } else { - continue MAINLOOP; - } - } - } - } - - if (AnnouncerTranslator.INSTANCE.walk && !FreecamMod.INSTANCE.state.enabled) { - Iterator iterator = this.toSend.iterator(); - TaskMove task = null; - while (iterator.hasNext()) { - QueuedTask curr = iterator.next(); - if (curr instanceof TaskMove) { - task = (TaskMove) curr; - } - } - if (task == null) { - this.toSend.add(new TaskMove(TaskType.WALK)); - } else { - task.update(mc.player.getPositionVector()); - } - } - } - } - - @Override - public void init() { - INSTANCE = this; - MinecraftForge.EVENT_BUS.register(this); - this.updateLastMS(); - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(AnnouncerTranslator.INSTANCE.clientSide, "client", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.clientSide = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.clientSide; - }, "Client Sided"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.join, "join", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.join = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.join; - }, "Join"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.leave, "leave", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.leave = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.leave; - }, "Leave"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.eat, "eat", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.eat = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.eat; - }, "Food"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.walk, "walk", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.walk = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.walk; - }, "Walk"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.mine, "mine", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.mine = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.mine; - }, "Mined"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.place, "place", OptionCompletions.BOOLEAN, - (value) -> { - AnnouncerTranslator.INSTANCE.place = value; - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.place; - }, "Place"), - new ModuleOption<>(AnnouncerTranslator.INSTANCE.delay, "delay", OptionCompletions.INTEGER, - (value) -> { - AnnouncerTranslator.INSTANCE.delay = Math.max(value, 0); - return true; - }, - () -> { - return AnnouncerTranslator.INSTANCE.delay; - }, "Delay", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 10000, 500)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } - - public void onBreakBlock(IBlockState state) { - if (this.state.enabled && AnnouncerTranslator.INSTANCE.mine) { - Iterator iterator = this.toSend.iterator(); - while (iterator.hasNext()) { - QueuedTask task = iterator.next(); - if (task.type == TaskType.BREAK) { - TaskBlock taskBlock = (TaskBlock) task; - if (taskBlock.block == state.getBlock()) { - taskBlock.count++; - return; - } - } - } - this.toSend.add(new TaskBlock(TaskType.BREAK, state.getBlock())); - this.tick(); - } - } - - public void onPlaceBlock(Block block) { - if (this.state.enabled && AnnouncerTranslator.INSTANCE.place) { - Iterator iterator = this.toSend.iterator(); - while (iterator.hasNext()) { - QueuedTask task = iterator.next(); - if (task.type == TaskType.PLACE) { - TaskBlock taskBlock = (TaskBlock) task; - if (taskBlock.block == block) { - taskBlock.count++; - return; - } - } - } - this.toSend.add(new TaskBlock(TaskType.PLACE, block)); - this.tick(); - } - } - - public void onPlayerJoin(String name) { - if (this.state.enabled && AnnouncerTranslator.INSTANCE.join) { - QueuedTask task = new TaskBasic(TaskType.JOIN, MessagePrefixes.getMessage(TaskType.JOIN, name)); - if (this.hasTimePassedM(2000)) { - this.updateLastMS(); - String msg = task.getMessage(); - if (msg != null) { - if (AnnouncerTranslator.INSTANCE.clientSide) { - mc.player.sendMessage(new TextComponentString(PepsiUtils.COLOR_ESCAPE + "a" + msg)); - } else { - mc.player.sendChatMessage(msg); - } - } - } - } - } - - public void onPlayerLeave(String name) { - if (this.state.enabled && AnnouncerTranslator.INSTANCE.leave) { - QueuedTask task = new TaskBasic(TaskType.LEAVE, MessagePrefixes.getMessage(TaskType.LEAVE, name)); - if (this.hasTimePassedM(2000)) { - this.updateLastMS(); - String msg = task.getMessage(); - if (msg != null) { - if (AnnouncerTranslator.INSTANCE.clientSide) { - mc.player.sendMessage(new TextComponentString(PepsiUtils.COLOR_ESCAPE + "a" + msg)); - } else { - mc.player.sendChatMessage(msg); - } - } - } - } - } - - @SubscribeEvent - public void onDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { - this.toSend.clear(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AntiHungerMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AntiHungerMod.java deleted file mode 100644 index 460c6b1..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AntiHungerMod.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class AntiHungerMod extends Module { - public static AntiHungerMod INSTANCE; - public static boolean ANTI_HUNGER = false; - - { - INSTANCE = this; - } - - public AntiHungerMod() { - super("AntiHunger"); - } - - @Override - public void onEnable() { - ANTI_HUNGER = true; - } - - @Override - public void onDisable() { - ANTI_HUNGER = false; - } - - @Override - public void tick() { - - } - - @Override - public void init() { - - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoFishMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoFishMod.java deleted file mode 100644 index 44a6d33..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoFishMod.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.the.wurst.pkg.name.WPlayerController; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemFishingRod; -import net.minecraft.item.ItemStack; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.SPacketSoundEffect; - -public class AutoFishMod extends Module { - public static AutoFishMod INSTANCE; - - public static boolean isBobberSplash(SPacketSoundEffect soundEffect) { - return SoundEvents.ENTITY_BOBBER_SPLASH.equals(soundEffect.getSound()); - } - - public int timer; - - { - INSTANCE = this; - } - - public AutoFishMod() { - super("AutoFish"); - } - - @Override - public void onEnable() { - // reset timer - this.timer = 0; - } - - @Override - public void onDisable() { - // reset timer - this.timer = 0; - } - - @Override - public void tick() { - // search fishing rod in hotbar - int rodInHotbar = -1; - for (int i = 0; i < 9; i++) { - // skip non-rod items - ItemStack stack = mc.player.inventory.getStackInSlot(i); - if (stack.isEmpty() || !(stack.getItem() instanceof ItemFishingRod)) { - continue; - } - - rodInHotbar = i; - break; - } - - // check if any rod was found - if (rodInHotbar != -1) { - // select fishing rod - if (mc.player.inventory.currentItem != rodInHotbar) { - mc.player.inventory.currentItem = rodInHotbar; - return; - } - - // wait for timer - if (this.timer > 0) { - this.timer--; - return; - } - - // check bobber - if (mc.player.fishEntity != null) { - return; - } - - // cast rod - this.rightClick(); - return; - } - - // search fishing rod in inventory - int rodInInventory = -1; - for (int i = 9; i < 36; i++) { - // skip non-rod items - ItemStack stack = mc.player.inventory.getStackInSlot(i); - if (stack.isEmpty() || !(stack.getItem() instanceof ItemFishingRod)) { - continue; - } - - rodInInventory = i; - break; - } - - // check if completely out of rods - if (rodInInventory == -1) { - return; - } - - // find empty hotbar slot - int hotbarSlot = -1; - for (int i = 0; i < 9; i++) { - // skip non-empty slots - if (!mc.player.inventory.getStackInSlot(i).isEmpty()) { - continue; - } - - hotbarSlot = i; - break; - } - - // check if hotbar is full - boolean swap = false; - if (hotbarSlot == -1) { - hotbarSlot = mc.player.inventory.currentItem; - swap = true; - } - - // place rod in hotbar slot - WPlayerController.windowClick_PICKUP(rodInInventory); - WPlayerController.windowClick_PICKUP(36 + hotbarSlot); - - // swap old hotbar item with rod - if (swap) { - WPlayerController.windowClick_PICKUP(rodInInventory); - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } - - private void rightClick() { - // check held item - ItemStack stack = mc.player.inventory.getCurrentItem(); - if (stack.isEmpty() || !(stack.getItem() instanceof ItemFishingRod)) { - return; - } - - // right click - ReflectionStuff.rightClickMouse(); - - // reset timer - this.timer = 15; - } - - @Override - public void postRecievePacket(Packet packetIn) { - if (packetIn instanceof SPacketSoundEffect && isBobberSplash((SPacketSoundEffect) packetIn) && mc.player.fishEntity != null) { - this.rightClick(); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoToolMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoToolMod.java deleted file mode 100644 index fe01fad..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/AutoToolMod.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.impl.player.AutoEatMod; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketHeldItemChange; -import net.minecraft.network.play.client.CPacketPlayerDigging; -import net.minecraft.world.GameType; - -public class AutoToolMod extends Module { - public static AutoToolMod INSTANCE; - public boolean digging = false; - public int slot = -1; - - { - INSTANCE = this; - } - - public AutoToolMod() { - super("AutoTool"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - synchronized (this) { - if (!mc.gameSettings.keyBindAttack.isKeyDown() && this.digging) { - this.digging = false; - if (this.slot != -1) { - ReflectionStuff.setCurrentPlayerItem(mc.player.inventory.currentItem = this.slot); - mc.getConnection().sendPacket(new CPacketHeldItemChange(this.slot)); - this.slot = -1; - } - } - } - } - - public boolean preSendPacket(Packet packetIn) { - if (!this.digging && AutoEatMod.INSTANCE.doneEating && packetIn instanceof CPacketPlayerDigging) { - synchronized (this) { - CPacketPlayerDigging pck = (CPacketPlayerDigging) packetIn; - if (!this.digging && mc.playerController.getCurrentGameType() != GameType.CREATIVE && pck.getAction() == CPacketPlayerDigging.Action.START_DESTROY_BLOCK) { - this.digging = true; - int bestIndex = PepsiUtils.getBestTool(mc.world.getBlockState(pck.getPosition()).getBlock()); - if (bestIndex != -1 && bestIndex != mc.player.inventory.currentItem) { - if (this.slot == -1) { - this.slot = mc.player.inventory.currentItem; - } - ReflectionStuff.setCurrentPlayerItem(mc.player.inventory.currentItem = bestIndex); - mc.getConnection().sendPacket(new CPacketHeldItemChange(bestIndex)); - mc.getConnection().sendPacket(packetIn); - return true; - } - } - } - } - return false; - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/ClickGuiMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/ClickGuiMod.java deleted file mode 100644 index 0871862..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/ClickGuiMod.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.gui.clickgui.ClickGUI; -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.minecraft.client.settings.KeyBinding; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import org.lwjgl.input.Keyboard; - -public class ClickGuiMod extends Module { - public static ClickGuiMod INSTANCE; - - { - INSTANCE = this; - } - - public ClickGuiMod(boolean isEnabled, int key) { - super(isEnabled, "ClickGUI", key, true); - } - - @Override - public void onEnable() { - if (pepsimod.isInitialized) { - for (Window window : ClickGUI.INSTANCE.windows) { - window.openGui(); - } - - mc.displayGuiScreen(ClickGUI.INSTANCE); - } - } - - @Override - public void onDisable() { - if (mc.currentScreen instanceof ClickGUI) { - mc.displayGuiScreen(null); - } - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - @Override - public void registerKeybind(String name, int key) { - this.keybind = new KeyBinding("\u00A7cOpen ClickGUI", Keyboard.KEY_RSHIFT, "key.categories.pepsimod"); - ClientRegistry.registerKeyBinding(this.keybind); - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/FreecamMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/FreecamMod.java deleted file mode 100644 index 766adb8..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/FreecamMod.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleLaunchState; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.EntityFakePlayer; -import net.daporkchop.pepsimod.util.config.impl.FreecamTranslator; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketPlayer; -import org.lwjgl.opengl.Display; - -public class FreecamMod extends Module { - public static FreecamMod INSTANCE; - - public static void doMove(float speed) { - mc.player.motionX = 0.0d; - mc.player.motionY = 0.0d; - mc.player.motionZ = 0.0d; - - if (Display.isActive()) { - if (mc.gameSettings.keyBindJump.isKeyDown()) { - mc.player.motionY += speed; - } - if (mc.gameSettings.keyBindSneak.isKeyDown()) { - mc.player.motionY -= speed; - } - - float forward = 0.0f; - if (mc.gameSettings.keyBindForward.isKeyDown()) { - forward += speed; - } - if (mc.gameSettings.keyBindBack.isKeyDown()) { - forward -= speed; - } - - float strafe = 0.0f; - if (mc.gameSettings.keyBindLeft.isKeyDown()) { - strafe += speed; - } - if (mc.gameSettings.keyBindRight.isKeyDown()) { - strafe -= speed; - } - - float yaw = mc.player.rotationYaw; - mc.player.motionX = (forward * Math.cos(Math.toRadians(yaw + 90.0F)) + strafe * Math.sin(Math.toRadians(yaw + 90.0F))); - mc.player.motionZ = (forward * Math.sin(Math.toRadians(yaw + 90.0F)) - strafe * Math.cos(Math.toRadians(yaw + 90.0F))); - } - } - - public EntityFakePlayer fakePlayer; - - { - INSTANCE = this; - } - - public FreecamMod() { - super("Freecam"); - } - - @Override - public void onEnable() { - INSTANCE = this;//adding this a bunch because it always seems to be null idk y - if (pepsimod.hasInitializedModules) { - this.fakePlayer = new EntityFakePlayer(); - } - } - - @Override - public void onDisable() { - INSTANCE = this; //adding this a bunch because it always seems to be null idk y - if (pepsimod.hasInitializedModules) { - this.fakePlayer.resetPlayerPosition(); - this.fakePlayer.despawn(); - } - } - - @Override - public void tick() { - doMove(FreecamTranslator.INSTANCE.speed); - } - - @Override - public void init() { - INSTANCE = this; //adding this a bunch because it always seems to be null idk y - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(1.0f, "speed", new String[]{"1.0", "0.0"}, - (value) -> { - if (value <= 0.0f) { - clientMessage("Speed cannot be negative or 0!"); - return false; - } - FreecamTranslator.INSTANCE.speed = value; - return true; - }, - () -> { - return FreecamTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 1.0f, 0.1f)) - }; - } - - @Override - public boolean preSendPacket(Packet packetIn) { - return packetIn instanceof CPacketPlayer; - } - - @Override - public ModuleLaunchState getLaunchState() { - return ModuleLaunchState.DISABLED; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/HUDMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/HUDMod.java deleted file mode 100644 index 4c1d4a4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/HUDMod.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.misc.TickRate; -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.colors.rainbow.RainbowText; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.client.gui.GuiIngame; -import net.minecraft.item.ItemStack; - -import java.awt.Color; - -public class HUDMod extends Module { - public static HUDMod INSTANCE; - public String serverBrand = ""; - - { - INSTANCE = this; - } - - public HUDMod(boolean isEnabled, int key) { - super(isEnabled, "HUD", key, true); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public boolean shouldTick() { - return true; - } - - @Override - public void tick() { - for (Module module : ModuleManager.ENABLED_MODULES) { - module.updateName(); - } - - ModuleManager.sortModules(GeneralTranslator.INSTANCE.sortType); - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(HUDTranslator.INSTANCE.drawLogo, "draw_logo", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.drawLogo = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.drawLogo; - }, "Watermark"), - new ModuleOption<>(HUDTranslator.INSTANCE.arrayList, "arraylist", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.arrayList = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.arrayList; - }, "ArrayList"), - new ModuleOption<>(HUDTranslator.INSTANCE.TPS, "tps", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.TPS = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.TPS; - }, "TPS"), - new ModuleOption<>(HUDTranslator.INSTANCE.coords, "coords", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.coords = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.coords; - }, "Coords"), - new ModuleOption<>(HUDTranslator.INSTANCE.netherCoords, "nether_coords", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.netherCoords = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.netherCoords; - }, "NetherCoords"), - new ModuleOption<>(HUDTranslator.INSTANCE.arrayListTop, "arraylist_top", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.arrayListTop = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.arrayListTop; - }, "ArrayListOnTop"), - new ModuleOption<>(HUDTranslator.INSTANCE.serverBrand, "server_brand", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.serverBrand = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.serverBrand; - }, "ServerBrand"), - new ModuleOption<>(HUDTranslator.INSTANCE.rainbow, "rainbow", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.rainbow = value; - for (Module module : ModuleManager.AVALIBLE_MODULES) { - module.updateName(); - } - return true; - }, - () -> { - return HUDTranslator.INSTANCE.rainbow; - }, "Rainbow"), - new ModuleOption<>(HUDTranslator.INSTANCE.direction, "direction", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.direction = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.direction; - }, "Direction"), - new ModuleOption<>(HUDTranslator.INSTANCE.armor, "armor", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.armor = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.armor; - }, "Armor"), - new ModuleOption<>(HUDTranslator.INSTANCE.effects, "effects", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.effects = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.effects; - }, "Effects"), - new ModuleOption<>(HUDTranslator.INSTANCE.fps, "fps", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.fps = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.fps; - }, "FPS"), - new ModuleOption<>(HUDTranslator.INSTANCE.ping, "ping", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.ping = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.ping; - }, "Ping"), - new ModuleOption<>(HUDTranslator.INSTANCE.clampTabList, "clampTabList", OptionCompletions.BOOLEAN, - (value) -> { - HUDTranslator.INSTANCE.clampTabList = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.clampTabList; - }, "Clamp Tab List"), - new ModuleOption<>(HUDTranslator.INSTANCE.maxTabRows, "maxTabRows", OptionCompletions.INTEGER, - (value) -> { - HUDTranslator.INSTANCE.maxTabRows = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.maxTabRows; - }, "Max Tab Rows", new ExtensionSlider(ExtensionType.VALUE_INT, 1, 80, 1)), - /*new ModuleOption<>(HUDTranslator.INSTANCE.maxTabCols, "maxTabCols", OptionCompletions.INTEGER, - (value) -> { - HUDTranslator.INSTANCE.maxTabCols = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.maxTabCols; - }, "Max Tab Cols", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 15, 1)),*/ - new ModuleOption<>(HUDTranslator.INSTANCE.r, "r", new String[]{"0", "128", "255"}, - (value) -> { - HUDTranslator.INSTANCE.r = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.r; - }, "Red", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 255, 1)), - new ModuleOption<>(HUDTranslator.INSTANCE.g, "g", new String[]{"0", "128", "255"}, - (value) -> { - HUDTranslator.INSTANCE.g = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.g; - }, "Green", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 255, 1)), - new ModuleOption<>(HUDTranslator.INSTANCE.b, "b", new String[]{"0", "128", "255"}, - (value) -> { - HUDTranslator.INSTANCE.b = value; - return true; - }, - () -> { - return HUDTranslator.INSTANCE.b; - }, "Blue", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 255, 1)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } - - public void registerKeybind(String name, int key) { - } - - @Override - public void onRenderGUI(float partialTicks, int width, int height, GuiIngame gui) { - if (HUDTranslator.INSTANCE.drawLogo) { - if (HUDTranslator.INSTANCE.rainbow) { - PepsiUtils.PEPSI_NAME.drawAtPos(gui, 2, 2, 0); - } else { - HUDTranslator.INSTANCE.bindColor(); - mc.fontRenderer.drawString(Pepsimod.NAME_VERSION, 2, 2, HUDTranslator.INSTANCE.getColor(), true); - } - } - - if (HUDTranslator.INSTANCE.arrayList) { - if (HUDTranslator.INSTANCE.arrayListTop) { - for (int i = 0, j = 0; i < ModuleManager.ENABLED_MODULES.size(); i++) { - Module module = ModuleManager.ENABLED_MODULES.get(i); - if (module.state.hidden) { - continue; - } - - if (HUDTranslator.INSTANCE.rainbow) { - if (module.text instanceof RainbowText) { - ((RainbowText) module.text).drawAtPos(gui, width - 2 - module.text.width(), 2 + j * 10, ++j * 10); - } else { - module.text.drawAtPos(gui, width - 2 - module.text.width(), 2 + ++j * 10); - } - } else { - HUDTranslator.INSTANCE.bindColor(); - mc.fontRenderer.drawString(module.text.getRawText(), width - 2 - module.text.width(), 2 + j * 10, HUDTranslator.INSTANCE.getColor()); - j++; - } - } - } else { - int j = mc.currentScreen instanceof GuiChat ? 14 : 0; - for (int i = 0; i < ModuleManager.ENABLED_MODULES.size(); i++) { - Module module = ModuleManager.ENABLED_MODULES.get(i); - if (module.state.hidden) { - continue; - } - - if (HUDTranslator.INSTANCE.rainbow) { - if (module.text instanceof RainbowText) { - ((RainbowText) module.text).drawAtPos(gui, width - 2 - module.text.width(), height - (j += 10), j / 10 * 8); - } else { - module.text.drawAtPos(gui, width - 2 - module.text.width(), height - (j += 10)); - } - } else { - HUDTranslator.INSTANCE.bindColor(); - mc.fontRenderer.drawString(module.text.getRawText(), width - 2 - module.text.width(), height - (j += 10), HUDTranslator.INSTANCE.getColor()); - } - } - } - } - - int i = 0; - if (HUDTranslator.INSTANCE.arrayListTop) { - i = mc.currentScreen instanceof GuiChat ? 14 : 0; - if (HUDTranslator.INSTANCE.serverBrand) { - String text = PepsiUtils.COLOR_ESCAPE + "7Server brand: " + PepsiUtils.COLOR_ESCAPE + "r" + HUDMod.INSTANCE.serverBrand; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("Server brand: " + HUDMod.INSTANCE.serverBrand) + 2), height - 2 - (i += 10), Color.white.getRGB()); - } - if (HUDTranslator.INSTANCE.ping) { - try { - int ping = mc.getConnection().getPlayerInfo(mc.getConnection().getGameProfile().getId()).getResponseTime(); - String text = PepsiUtils.COLOR_ESCAPE + "7Ping: " + PepsiUtils.COLOR_ESCAPE + "r" + ping; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("Ping: " + ping) + 2), height - 2 - (i += 10), Color.white.getRGB()); - } catch (NullPointerException e) { - } - } - if (HUDTranslator.INSTANCE.TPS) { - String text = PepsiUtils.COLOR_ESCAPE + "7TPS: " + PepsiUtils.COLOR_ESCAPE + "r" + TickRate.TPS; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("TPS: " + TickRate.TPS) + 2), height - 2 - (i += 10), Color.white.getRGB()); - } - if (HUDTranslator.INSTANCE.fps) { - String text = PepsiUtils.COLOR_ESCAPE + "7FPS: " + PepsiUtils.COLOR_ESCAPE + "r" + ReflectionStuff.getDebugFps(); - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("FPS: " + ReflectionStuff.getDebugFps()) + 2), height - 2 - (i += 10), Color.white.getRGB()); - } - } else { - if (HUDTranslator.INSTANCE.serverBrand) { - String text = PepsiUtils.COLOR_ESCAPE + "7Server brand: " + PepsiUtils.COLOR_ESCAPE + "r" + HUDMod.INSTANCE.serverBrand; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("Server brand: " + HUDMod.INSTANCE.serverBrand) + 2), 2 + i++ * 10, Color.white.getRGB()); - } - if (HUDTranslator.INSTANCE.ping) { - try { - int ping = mc.getConnection().getPlayerInfo(mc.getConnection().getGameProfile().getId()).getResponseTime(); - String text = PepsiUtils.COLOR_ESCAPE + "7Ping: " + PepsiUtils.COLOR_ESCAPE + "r" + ping; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("Ping: " + ping) + 2), 2 + i++ * 10, Color.white.getRGB()); - } catch (NullPointerException e) { - } - } - if (HUDTranslator.INSTANCE.TPS) { - String text = PepsiUtils.COLOR_ESCAPE + "7TPS: " + PepsiUtils.COLOR_ESCAPE + "r" + TickRate.TPS; - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("TPS: " + TickRate.TPS) + 2), 2 + i++ * 10, Color.white.getRGB()); - } - if (HUDTranslator.INSTANCE.fps) { - String text = PepsiUtils.COLOR_ESCAPE + "7FPS: " + PepsiUtils.COLOR_ESCAPE + "r" + ReflectionStuff.getDebugFps(); - gui.drawString(mc.fontRenderer, text, width - (mc.fontRenderer.getStringWidth("FPS: " + ReflectionStuff.getDebugFps()) + 2), 2 + i++ * 10, Color.white.getRGB()); - } - } - - i = mc.currentScreen instanceof GuiChat ? 14 : 0; - if (HUDTranslator.INSTANCE.coords) { - String toRender = PepsiUtils.COLOR_ESCAPE + "7XYZ" + PepsiUtils.COLOR_ESCAPE + "f: " + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(mc.player.posX) + "" + PepsiUtils.COLOR_ESCAPE + "f, " + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(mc.player.posY) + "" + PepsiUtils.COLOR_ESCAPE + "f, " + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(mc.player.posZ); - if (HUDTranslator.INSTANCE.netherCoords && mc.player.dimension != 1) { - toRender += " " + PepsiUtils.COLOR_ESCAPE + "f(" + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(PepsiUtils.getDimensionCoord(mc.player.posX)) + "" + PepsiUtils.COLOR_ESCAPE + "f, " + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(mc.player.posY) + "" + PepsiUtils.COLOR_ESCAPE + "f, " + PepsiUtils.COLOR_ESCAPE + "7" + PepsiUtils.roundCoords(PepsiUtils.getDimensionCoord(mc.player.posZ)) + "" + PepsiUtils.COLOR_ESCAPE + "f)"; - } - mc.fontRenderer.drawString(toRender, 2, height - (i += 10), Color.white.getRGB(), true); - } - if (HUDTranslator.INSTANCE.direction) { - mc.fontRenderer.drawString(PepsiUtils.COLOR_ESCAPE + "7[" + PepsiUtils.COLOR_ESCAPE + "f" + PepsiUtils.getFacing() + PepsiUtils.COLOR_ESCAPE + "7]", 2, height - (i += 10), Color.white.getRGB(), true); - } - - - if (HUDTranslator.INSTANCE.armor) { - i = 0; - int xPos = width / 2; - xPos -= 90; - for (int j = 0; j < 4; j++) { - ItemStack stack = PepsiUtils.getWearingArmor(j); - PepsiUtils.renderItem(xPos + 20 * i++, height - 70, partialTicks, mc.player, stack); - } - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NoFallMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NoFallMod.java deleted file mode 100644 index e3be20f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NoFallMod.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class NoFallMod extends Module { - public static boolean NO_FALL = false; - public static NoFallMod INSTANCE; - - - { - INSTANCE = this; - } - - public NoFallMod() { - super("NoFall"); - } - - @Override - public void onEnable() { - NO_FALL = true; - } - - @Override - public void onDisable() { - NO_FALL = false; - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NotificationsMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NotificationsMod.java deleted file mode 100644 index 3d3074e..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/NotificationsMod.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.util.config.impl.NotificationsTranslator; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.SPacketChat; -import net.minecraft.network.play.server.SPacketSpawnPlayer; -import org.lwjgl.opengl.Display; - -import javax.imageio.ImageIO; -import java.awt.AWTException; -import java.awt.PopupMenu; -import java.awt.SystemTray; -import java.awt.TrayIcon; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.Base64; - -public class NotificationsMod extends Module { - public static NotificationsMod INSTANCE; - - public static void sendNotification(String message, TrayIcon.MessageType type) { - if (!Display.isActive() && ModuleManager.ENABLED_MODULES.contains(INSTANCE)) { - INSTANCE.trayIcon.displayMessage("pepsimod", message, type); - } - } - public TrayIcon trayIcon; - public SystemTray tray; - public PopupMenu menu; - public boolean inQueue = false; - - { - INSTANCE = this; - } - - public NotificationsMod() { - super("Notifications"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (NotificationsTranslator.INSTANCE.death && mc.player.getHealth() <= 0) { - sendNotification("You died!", TrayIcon.MessageType.WARNING); - } - } - - @Override - public void init() { - try { - INSTANCE = this; - this.tray = SystemTray.getSystemTray(); - this.trayIcon = new TrayIcon(ImageIO.read(new ByteArrayInputStream(Base64.getDecoder() - .decode("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACDVBMVEUAAAD////++fneAAD1j5z0+fz0+Pru9PgAWJH//////Pz82+D5uMH3pK/3oa34r7n7ztT+8vT////////84uX2nKjwWW3vSF/0g5L70Nb////////819zzd4f3q7X////////96Orze4v////8/f7////3p7LY5e7k7vP96ezyaXujwte60eH6zNLuQ1uTt9D5u8N9qcf5u8SAq8j6ztTvRVyYu9L96+7ybX8rc6PA1eP////4rLZwocHx9vn/7e7WuMZGha/H2uf////Z6fFuocFLiLG60eH////////l7vObvtRRjLM9f6t/q8jO3+r////////9/v7g6/K70uGjwtegwNawy93T4uz2+fsAWJHtNE3sJ0LsJkHsLkjsKkTrGjfrHDjrGjbsJD/rIj3rHTnrGzftOlL71drtL0nrGzjzfY3/+vv7/f7uPVX709j////9/v7sJUD2nqr//f76/P1yosLtNU7rHzvze4v+8vTf6vE2eqftNU/rIDzzcoP96uz3+vt9qscKXZTsKUT1g5L+7O7n7/WCrckQYpcMX5XtITzyTmP6r7j68/bs9PjL3emQts8/gawHXJQAVY/uP1bqS2Lbh5q+ucuWutJonb8+gKsaaJwEWpIAVpAAV5AFWpJqia0vd6USZZoAWJEAV5EBV5EUZJkAVo8IXJQjbqASY5gQYpgbaZwAAAAprTAwAAAAW3RSTlMAAAAAAAAAAAACKHrA4ufPlUIICWDO+f3jiRsHdu/7qRxW7PyRC8HoT13y/qqZ/ua4/Lf8lf3jWPD+pBm65UhO5/qHBWrp+Z4XBlPD9frbexUBH2mt0te9gjUElCjBbQAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAEDSURBVBjTY2BgYOTk4ubh5eMXEBRiZAACRmERUbHomNg4cQlJKSZGBkZpGdn4hEQgSEqWk1dgZGBWVEpJTAWBtPQMZRVVBgW1zCwwPzUxOydXXYNBUysNwk/Lyy8o1NZh0NWDCCQWFZcUlJbpMxiUg01IrKisKiiorjFkMKoFCSTW1TcUFDQ2NRszmJgCtSS0tLYVFLR3dHaZMZhbpKV19/T29U+YOGnyFEsrBmubqdOmz5g5a/acufPmL7C1Y2Cxd1i4aPHcefPmL1m6zNFJiIHR2cV1+Yp585fOn7fSzd2DFeg5Ty9vn1Wr16z19fMPYAP5lzEwKDgkNCw8ItKZnSMKAAihVlWjuDlCAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA5LTA5VDE3OjE3OjAyKzAyOjAw4iAIuQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wOS0wOVQxNzoxNzowMiswMjowMJN9sAUAAAAASUVORK5CYII="))), - "pepsimod", this.menu = new PopupMenu()); - this.tray.add(this.trayIcon); - } catch (IOException | AWTException e) { - e.printStackTrace(); - ModuleManager.unRegister(this); - } - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(NotificationsTranslator.INSTANCE.chat, "chat", OptionCompletions.BOOLEAN, - (value) -> { - NotificationsTranslator.INSTANCE.chat = value; - return true; - }, - () -> { - return NotificationsTranslator.INSTANCE.chat; - }, "Chat"), - new ModuleOption<>(NotificationsTranslator.INSTANCE.queue, "queue", OptionCompletions.BOOLEAN, - (value) -> { - NotificationsTranslator.INSTANCE.queue = value; - return true; - }, - () -> { - return NotificationsTranslator.INSTANCE.queue; - }, "Queue"), - new ModuleOption<>(NotificationsTranslator.INSTANCE.death, "death", OptionCompletions.BOOLEAN, - (value) -> { - NotificationsTranslator.INSTANCE.death = value; - return true; - }, - () -> { - return NotificationsTranslator.INSTANCE.death; - }, "Death"), - new ModuleOption<>(NotificationsTranslator.INSTANCE.player, "visual_range", OptionCompletions.BOOLEAN, - (value) -> { - NotificationsTranslator.INSTANCE.player = value; - return true; - }, - () -> { - return NotificationsTranslator.INSTANCE.player; - }, "Visual Range") - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } - - @Override - public boolean shouldRegister() { - return SystemTray.isSupported(); - } - - @Override - public void postRecievePacket(Packet packet) { - if (packet instanceof SPacketChat) { - SPacketChat pck = (SPacketChat) packet; - if (!pck.isSystem()) { - String message = pck.getChatComponent().getUnformattedText().toLowerCase(); - if (NotificationsTranslator.INSTANCE.queue && message.startsWith("position in queue")) { - this.inQueue = true; - } else if (this.inQueue && message.startsWith("connecting to")) { - sendNotification("Finished going through the queue!", TrayIcon.MessageType.INFO); - this.inQueue = false; - } else if (NotificationsTranslator.INSTANCE.chat && message.contains(mc.getSession().getUsername().toLowerCase())) { - sendNotification("Your name was mentioned in chat!", TrayIcon.MessageType.INFO); - } - } - } else if (NotificationsTranslator.INSTANCE.player && packet instanceof SPacketSpawnPlayer) { - sendNotification(mc.getConnection().getPlayerInfo(((SPacketSpawnPlayer) packet).getUniqueId()).getGameProfile().getName() + " entered visual range!", TrayIcon.MessageType.INFO); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/TimerMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/misc/TimerMod.java deleted file mode 100644 index 7b7d68d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/misc/TimerMod.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.misc; - -import net.daporkchop.pepsimod.misc.TickRate; -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.TimerTranslator; - -public class TimerMod extends Module { - public static TimerMod INSTANCE; - - { - INSTANCE = this; - } - - public TimerMod() { - super("Timer"); - } - - @Override - public void onEnable() { - INSTANCE = this;//adding this a bunch because it always seems to be null idk y - } - - @Override - public void onDisable() { - INSTANCE = this;//adding this a bunch because it always seems to be null idk y - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; //adding this a bunch because it always seems to be null idk y - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(1.0f, "multiplier", new String[]{"1.0", "0.0"}, - (value) -> { - if (value <= 0.0f) { - clientMessage("Multiplier cannot be negative or 0!"); - return false; - } - TimerTranslator.INSTANCE.multiplier = value; - return true; - }, - () -> { - return TimerTranslator.INSTANCE.multiplier; - }, "Multiplier", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 1.0f, 0.01f)), - new ModuleOption<>(false, "tps_sync", OptionCompletions.BOOLEAN, - (value) -> { - TimerTranslator.INSTANCE.tpsSync = value; - return true; - }, - () -> { - return TimerTranslator.INSTANCE.tpsSync; - }, "TpsSync") - }; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - return TickRate.format.format(this.getMultiplier()); - } - - public float getMultiplier() { - if (this.state.enabled) { - if (TimerTranslator.INSTANCE.tpsSync) { - return TickRate.TPS / 20 * TimerTranslator.INSTANCE.multiplier; - } else { - return TimerTranslator.INSTANCE.multiplier; - } - } else { - return 1.0f; - } - } - - public ModuleCategory getCategory() { - return ModuleCategory.MISC; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoRespawnMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoRespawnMod.java deleted file mode 100644 index 50fc821..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoRespawnMod.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class AutoRespawnMod extends Module { - public AutoRespawnMod INSTANCE; - - { - this.INSTANCE = this; - } - - public AutoRespawnMod() { - super("AutoRespawn"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - if (mc.player != null && mc.player.getHealth() <= 0) { - mc.player.respawnPlayer(); - } - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoWalkMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoWalkMod.java deleted file mode 100644 index fca13e0..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/AutoWalkMod.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.optimization.OverrideCounter; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import org.lwjgl.input.Keyboard; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class AutoWalkMod extends Module { - public static AutoWalkMod INSTANCE; - - { - INSTANCE = this; - } - - protected final AtomicBoolean incremented = new AtomicBoolean(false); - - public AutoWalkMod() { - super("AutoWalk"); - } - - @Override - public void onEnable() { - if (!this.incremented.getAndSet(true)) { - ((OverrideCounter) mc.gameSettings.keyBindForward).incrementOverride(); - } - } - - @Override - public void onDisable() { - if (this.incremented.getAndSet(false)) { - ((OverrideCounter) mc.gameSettings.keyBindForward).decrementOverride(); - } - } - - @Override - public void tick() { - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/BoatFlyMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/BoatFlyMod.java deleted file mode 100644 index 8ce5d45..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/BoatFlyMod.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.ReflectionStuff; - -public class BoatFlyMod extends Module { - public static BoatFlyMod INSTANCE; - - { - INSTANCE = this; - } - - public BoatFlyMod() { - super("BoatFly"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (mc.player.isRiding()) { - // fly - mc.player.getRidingEntity().motionY = ReflectionStuff.getPressed(mc.gameSettings.keyBindJump) ? 0.3 : 0; - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/ElytraFlyMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/ElytraFlyMod.java deleted file mode 100644 index d1f28ad..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/ElytraFlyMod.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.TimeModule; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.config.impl.ElytraFlyTranslator; -import net.minecraft.init.Items; -import net.minecraft.item.ItemElytra; -import net.minecraft.item.ItemStack; -import net.minecraft.network.play.client.CPacketEntityAction; - -public class ElytraFlyMod extends TimeModule { - public static final String[] modes = new String[]{"normal", "packet"}; - - public static ElytraFlyMod INSTANCE; - - { - INSTANCE = this; - } - - public ElytraFlyMod() { - super("Elytra+"); - } - - @Override - public void onEnable() { - if (ElytraFlyTranslator.INSTANCE.mode == ElytraFlyTranslator.ElytraFlyMode.PACKET) { - if (mc.world == null) { - ModuleManager.disableModule(this); - } - } - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - this.updateMS(); - - ItemStack chestplate = PepsiUtils.getWearingArmor(1); - if (chestplate == null || chestplate.getItem() != Items.ELYTRA) { - return; - } - - if (mc.player.isElytraFlying()) { - if (ElytraFlyTranslator.INSTANCE.stopInWater && mc.player.isInWater()) { - mc.getConnection().sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_FALL_FLYING)); - return; - } - - if (ElytraFlyTranslator.INSTANCE.fly && ElytraFlyTranslator.INSTANCE.mode == ElytraFlyTranslator.ElytraFlyMode.NORMAL) { - if (ReflectionStuff.getPressed(mc.gameSettings.keyBindJump)) { - mc.player.motionY += 0.08 * ElytraFlyTranslator.INSTANCE.speed; - } else if (ReflectionStuff.getPressed(mc.gameSettings.keyBindSneak)) { - mc.player.motionY -= 0.04 * ElytraFlyTranslator.INSTANCE.speed; - } - - if (ReflectionStuff.getPressed(mc.gameSettings.keyBindForward)) { - double yaw = Math.toRadians(mc.player.rotationYaw); - mc.player.motionX -= Math.sin(yaw) * ElytraFlyTranslator.INSTANCE.speed; - mc.player.motionZ += Math.cos(yaw) * ElytraFlyTranslator.INSTANCE.speed; - } else if (ReflectionStuff.getPressed(mc.gameSettings.keyBindBack)) { - double yaw = Math.toRadians(mc.player.rotationYaw); - mc.player.motionX += Math.sin(yaw) * ElytraFlyTranslator.INSTANCE.speed; - mc.player.motionZ -= Math.cos(yaw) * ElytraFlyTranslator.INSTANCE.speed; - } - } - } else if (ElytraFlyTranslator.INSTANCE.easyStart && ElytraFlyTranslator.INSTANCE.mode != ElytraFlyTranslator.ElytraFlyMode.PACKET && ItemElytra.isUsable(chestplate) && mc.gameSettings.keyBindJump.isPressed()) { - if (this.hasTimePassedM(1000)) { - this.updateLastMS(); - mc.player.setJumping(false); - mc.player.setSprinting(true); - mc.player.jump(); - } - mc.getConnection().sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_FALL_FLYING)); - } - if (ElytraFlyTranslator.INSTANCE.fly && ElytraFlyTranslator.INSTANCE.mode == ElytraFlyTranslator.ElytraFlyMode.PACKET) { - mc.player.motionX = mc.player.motionZ = 0; - if (ReflectionStuff.getPressed(mc.gameSettings.keyBindForward)) { - double yaw = Math.toRadians(mc.player.rotationYaw); - mc.player.motionX -= Math.sin(yaw) * ElytraFlyTranslator.INSTANCE.speed; - mc.player.motionZ += Math.cos(yaw) * ElytraFlyTranslator.INSTANCE.speed; - } else if (ReflectionStuff.getPressed(mc.gameSettings.keyBindBack)) { - double yaw = Math.toRadians(mc.player.rotationYaw); - mc.player.motionX += Math.sin(yaw) * ElytraFlyTranslator.INSTANCE.speed; - mc.player.motionZ -= Math.cos(yaw) * ElytraFlyTranslator.INSTANCE.speed; - } - mc.player.motionY = 0; - mc.getConnection().sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_FALL_FLYING)); - mc.getConnection().sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_FALL_FLYING)); - } - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(ElytraFlyTranslator.INSTANCE.easyStart, "easyStart", OptionCompletions.BOOLEAN, - (value) -> { - ElytraFlyTranslator.INSTANCE.easyStart = value; - return true; - }, - () -> { - return ElytraFlyTranslator.INSTANCE.easyStart; - }, "EasyStart"), - new ModuleOption<>(ElytraFlyTranslator.INSTANCE.stopInWater, "stopInWater", OptionCompletions.BOOLEAN, - (value) -> { - ElytraFlyTranslator.INSTANCE.stopInWater = value; - return true; - }, - () -> { - return ElytraFlyTranslator.INSTANCE.stopInWater; - }, "StopInWater"), - new ModuleOption<>(ElytraFlyTranslator.INSTANCE.fly, "fly", OptionCompletions.BOOLEAN, - (value) -> { - ElytraFlyTranslator.INSTANCE.fly = value; - return true; - }, - () -> { - return ElytraFlyTranslator.INSTANCE.fly; - }, "Fly"), - new ModuleOption<>(ElytraFlyTranslator.INSTANCE.mode, "mode", modes, - (value) -> { - ElytraFlyTranslator.INSTANCE.mode = value; - return true; - }, - () -> { - return ElytraFlyTranslator.INSTANCE.mode; - }, "Mode", false), - new ModuleOption<>(ElytraFlyTranslator.INSTANCE.speed, "speed", OptionCompletions.FLOAT, - (value) -> { - ElytraFlyTranslator.INSTANCE.speed = Math.max(value, 0); - return true; - }, - () -> { - return ElytraFlyTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0f, 0.5f, 0.005f)) - }; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - return ElytraFlyTranslator.INSTANCE.mode.name(); - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } - - @Override - public String getSuggestion(String cmd, String[] args) { - if (args.length == 2 && args[1].equals("mode")) { - return cmd + " " + modes[0]; - } else if (args.length == 3 && args[1].equals("mode")) { - if (args[2].isEmpty()) { - return cmd + modes[0]; - } else { - for (String s : modes) { - if (s.startsWith(args[2])) { - return args[0] + " " + args[1] + " " + s; - } - } - - return ""; - } - } - - return super.getSuggestion(cmd, args); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length == 3 && !args[2].isEmpty() && cmd.startsWith(".elytra+ mode ")) { - String s = args[2].toUpperCase(); - try { - ElytraFlyTranslator.ElytraFlyMode mode = ElytraFlyTranslator.ElytraFlyMode.valueOf(s); - if (mode == null) { - clientMessage("Not a valid mode: " + args[2]); - } else { - this.getOptionByName("mode").setValue(mode); - clientMessage("Set " + PepsiUtils.COLOR_ESCAPE + "o" + args[1] + PepsiUtils.COLOR_ESCAPE + "r to " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } - } catch (Exception e) { - clientMessage("Not a valid mode: " + args[2]); - } - return; - } - - super.execute(cmd, args); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/EntitySpeedMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/EntitySpeedMod.java deleted file mode 100644 index df39b6a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/EntitySpeedMod.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.config.impl.EntitySpeedTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.client.CPacketVehicleMove; -import net.minecraft.network.play.server.SPacketMoveVehicle; -import net.minecraft.util.MovementInput; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.Vec3d; - -import java.util.List; - -public class EntitySpeedMod extends Module { - public static EntitySpeedMod INSTANCE; - - public static AxisAlignedBB getMergedBBs(Entity entity, AxisAlignedBB bb) { - if (entity.world.isRemote) { //only run on client to fix stuff in single player - for (Entity passenger : entity.getPassengers()) { - AxisAlignedBB bb2 = passenger.getEntityBoundingBox(); - ReflectionStuff.setMaxY(bb2, passenger.getPositionEyes(0.0f).y); - bb = bb.union(bb2); - } - } - return bb; - } - - { - INSTANCE = this; - } - - public float fakedStepHeight = 0.5f; - protected int stepDelay = 0; - - public EntitySpeedMod() { - super("EntitySpeed"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - this.fakedStepHeight = 0.5f; - } - - @Override - public void tick() { - Entity ridingEntity = ReflectionStuff.getRidingEntity(mc.player); - if (ridingEntity != null) { - PIG_STEP: - if (ridingEntity instanceof EntityPig) { - if (this.stepDelay > 0) { - this.stepDelay--; - return; - } - - EntityPig pig = (EntityPig) ridingEntity; - - if (mc.player.movementInput.moveForward == 0 && mc.player.movementInput.moveStrafe == 0) { - pig.stepHeight = this.fakedStepHeight = 1.0f; - break PIG_STEP; - } else { - pig.stepHeight = this.fakedStepHeight = 0.5f; - } - - if (!pig.collidedHorizontally) { - break PIG_STEP; - } - - if (!pig.onGround || pig.isOnLadder() || pig.isInWater() || pig.isInLava()) { - break PIG_STEP; - } - - if (mc.player.movementInput.jump) { - break PIG_STEP; - } - - double stepHeight = -1; - Vec3d stepDir = null; - { - boolean found = false; - Vec3d[] dirs = { - new Vec3d(1, 0, 0), - new Vec3d(-1, 0, 0), - new Vec3d(0, 0, 1), - new Vec3d(0, 0, -1) - }; - YLOOP: - for (double d = 1.0d; d > 0.0d; d -= 0.0625d) { - for (Vec3d dir : dirs) { - AxisAlignedBB bb = pig.getEntityBoundingBox().offset(dir.scale(0.0625d)); - if (mc.world.getCollisionBoxes(pig, bb.offset(0, d, 0)).isEmpty()) { - found = true; - stepDir = dir; - for (AxisAlignedBB box : mc.world.getCollisionBoxes(pig, bb)) { - if (box.maxY > stepHeight) { - stepHeight = box.maxY; - } - } - break YLOOP; - } - } - } - - if (!found) { - break PIG_STEP; - } - } - - stepHeight -= pig.posY; - - if (stepHeight < 0 || stepHeight > 1) { - break PIG_STEP; - } - - double yOrig = pig.posY; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - pig.posY = yOrig + 0.24d * stepHeight; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - pig.posY = yOrig + 0.48d * stepHeight; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - pig.posY = yOrig + 0.72d * stepHeight; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - pig.posY = yOrig + 0.96d * stepHeight; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - pig.posY = yOrig + stepHeight; - mc.player.connection.sendPacket(new CPacketVehicleMove(pig)); - - pig.setPosition(pig.posX + stepDir.x * 0.0625d, yOrig + stepHeight, pig.posZ + stepDir.z * 0.0625d); - //System.out.println("Stepping at x=" + pig.getEntityBoundingBox().maxX); - this.stepDelay = 5; - return; - } - - MovementInput movementInput = mc.player.movementInput; - double forward = movementInput.moveForward; - double strafe = movementInput.moveStrafe; - float yaw = mc.player.rotationYaw; - if ((forward == 0.0D) && (strafe == 0.0D)) { - ridingEntity.motionX = 0.0D; - ridingEntity.motionZ = 0.0D; - } else { - if (forward != 0.0D) { - if (strafe > 0.0D) { - yaw += (forward > 0.0D ? -45 : 45); - } else if (strafe < 0.0D) { - yaw += (forward > 0.0D ? 45 : -45); - } - strafe = 0.0D; - if (forward > 0.0D) { - forward = 1.0D; - } else if (forward < 0.0D) { - forward = -1.0D; - } - } - ridingEntity.motionX = (forward * EntitySpeedTranslator.INSTANCE.speed * Math.cos(Math.toRadians(yaw + 90.0F)) + strafe * EntitySpeedTranslator.INSTANCE.speed * Math.sin(Math.toRadians(yaw + 90.0F))); - ridingEntity.motionZ = (forward * EntitySpeedTranslator.INSTANCE.speed * Math.sin(Math.toRadians(yaw + 90.0F)) - strafe * EntitySpeedTranslator.INSTANCE.speed * Math.cos(Math.toRadians(yaw + 90.0F))); - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(EntitySpeedTranslator.INSTANCE.speed, "speed", OptionCompletions.FLOAT, - (value) -> { - EntitySpeedTranslator.INSTANCE.speed = Math.max(0, value); - return true; - }, - () -> { - return EntitySpeedTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0f, 4f, 0.1f)), - new ModuleOption<>(EntitySpeedTranslator.INSTANCE.idleSpeed, "idleSpeed", OptionCompletions.FLOAT, - (value) -> { - EntitySpeedTranslator.INSTANCE.idleSpeed = Math.max(0, value); - return true; - }, - () -> { - return EntitySpeedTranslator.INSTANCE.idleSpeed; - }, "Idle Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0f, 2f, 0.1f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/FlightMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/FlightMod.java deleted file mode 100644 index 6d45bbd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/FlightMod.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.module.impl.misc.FreecamMod; -import net.daporkchop.pepsimod.util.config.impl.FlightTranslator; - -public class FlightMod extends Module { - public static FlightMod INSTANCE; - - { - INSTANCE = this; - } - - public FlightMod() { - super("Flight"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - FreecamMod.doMove(FlightTranslator.INSTANCE.speed); - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(FlightTranslator.INSTANCE.speed, "speed", OptionCompletions.FLOAT, - (value) -> { - FlightTranslator.INSTANCE.speed = Math.max(0, value); - return true; - }, - () -> { - return FlightTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.1f, 10f, 0.1f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/HorseJumpPowerMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/HorseJumpPowerMod.java deleted file mode 100644 index 9aa5a5f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/HorseJumpPowerMod.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.ReflectionStuff; - -public class HorseJumpPowerMod extends Module { - public static HorseJumpPowerMod INSTANCE; - - { - INSTANCE = this; - } - - public HorseJumpPowerMod() { - super("HorseJumpPower"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - ReflectionStuff.setHorseJumpPower(1.0f); - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/InventoryMoveMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/InventoryMoveMod.java deleted file mode 100644 index cb2972b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/InventoryMoveMod.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class InventoryMoveMod extends Module { - public static InventoryMoveMod INSTANCE; - - { - INSTANCE = this; - } - - public InventoryMoveMod() { - super("InventoryMove"); - INSTANCE = this; - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/JesusMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/JesusMod.java deleted file mode 100644 index 836af70..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/JesusMod.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.network.Packet; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.client.CPacketVehicleMove; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; - -public class JesusMod extends Module { - public static JesusMod INSTANCE; - private int tickTimer = 10; - private int packetTimer = 0; - - { - INSTANCE = this; - } - - public JesusMod() { - super("Jesus"); - } - - public boolean isOverLiquid() { - if (mc.player == null) { - return false; - } - - Entity entity = mc.player.isRiding() ? mc.player.getRidingEntity() : mc.player; - - boolean foundLiquid = false; - boolean foundSolid = false; - - // check collision boxes below player - for (AxisAlignedBB bb : mc.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(0, -0.5, 0))) { - BlockPos pos = new BlockPos(bb.getCenter()); - IBlockState state = mc.world.getBlockState(pos); - Material material = state.getBlock().getMaterial(state); - - if (material == Material.WATER || material == Material.LAVA) { - foundLiquid = true; - } else if (material != Material.AIR) { - foundSolid = true; - } - } - - return foundLiquid && !foundSolid; - } - - public boolean shouldBeSolid() { - if (mc.player == null) { - return false; - } - - Entity entity = mc.player.isRiding() ? mc.player.getRidingEntity() : mc.player; - - return this.state.enabled && entity.fallDistance <= 3 && !mc.gameSettings.keyBindSneak.isPressed() && !entity.isInWater(); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (mc.player == null) { - return; - } - - Entity entity = mc.player.isRiding() ? mc.player.getRidingEntity() : mc.player; - - // check if sneaking - if (mc.gameSettings.keyBindSneak.isPressed()) { - return; - } - - // move up in water - if (entity.isInWater()) { - entity.motionY = 0.11; - this.tickTimer = 0; - return; - } - - // simulate jumping out of water - if (this.tickTimer == 0) { - entity.motionY = 0.30; - } else if (this.tickTimer == 1) { - entity.motionY = 0; - } - - // update timer - this.tickTimer++; - } - - @Override - public boolean preSendPacket(Packet packet) { - if (mc.player == null) { - return false; - } - - Entity entity = mc.player.isRiding() ? mc.player.getRidingEntity() : mc.player; - - RETURN: - if (!mc.player.isRiding() && packet instanceof CPacketPlayer) { - // check if packet contains a position - if (!(packet instanceof CPacketPlayer.Position || packet instanceof CPacketPlayer.PositionRotation)) { - break RETURN; - } - - // check inWater - if (entity.isInWater()) { - break RETURN; - } - - // check fall distance - if (entity.fallDistance > 3F) { - break RETURN; - } - - if (!this.isOverLiquid()) { - break RETURN; - } - - // if not actually moving, cancel packet - if (mc.player.movementInput == null) { - return true; - } - - // wait for timer - this.packetTimer++; - if (this.packetTimer < 4) { - break RETURN; - } - - CPacketPlayer pck = (CPacketPlayer) packet; - - // get position - double y = pck.getY(0); - - // offset y - if (entity.ticksExisted % 2 == 0) { - y -= 0.05; - } else { - y += 0.05; - } - - ReflectionStuff.setCPacketPlayer_y(pck, y); - ReflectionStuff.setcPacketPlayer_onGround(pck, true); - } else if (mc.player.isRiding() && packet instanceof CPacketVehicleMove) { - // check inWater - if (entity.isInWater()) { - break RETURN; - } - - // check fall distance - if (entity.fallDistance > 3F) { - break RETURN; - } - - if (!this.isOverLiquid()) { - break RETURN; - } - - // if not actually moving, cancel packet - if (mc.player.movementInput == null) { - return true; - } - - // wait for timer - this.packetTimer++; - if (this.packetTimer < 4) { - break RETURN; - } - - CPacketVehicleMove pck = (CPacketVehicleMove) packet; - - // get position - double y = pck.getY(); - - // offset y - if (entity.ticksExisted % 2 == 0) { - y -= 0.05; - } else { - y += 0.05; - } - - ReflectionStuff.setcPacketVehicleMove_y(pck, y); - } - - return false; - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoClipMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoClipMod.java deleted file mode 100644 index ec96e49..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoClipMod.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.ReflectionStuff; - -public class NoClipMod extends Module { - public static NoClipMod INSTANCE; - - { - INSTANCE = this; - } - - public NoClipMod() { - super("NoClip"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - if (pepsimod.isInitialized) { - mc.player.noClip = false; - } - } - - @Override - public void tick() { - mc.player.noClip = true; - mc.player.fallDistance = 0; - mc.player.onGround = false; - - mc.player.capabilities.isFlying = false; - mc.player.motionX = 0; - mc.player.motionY = 0; - mc.player.motionZ = 0; - - float speed = 0.2F; - mc.player.jumpMovementFactor = speed; - if (ReflectionStuff.getPressed(mc.gameSettings.keyBindJump)) { - mc.player.motionY += speed; - } - - if (ReflectionStuff.getPressed(mc.gameSettings.keyBindSneak)) { - mc.player.motionY -= speed; - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoSlowdownMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoSlowdownMod.java deleted file mode 100644 index b3cdff2..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/NoSlowdownMod.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.minecraft.init.Blocks; - -public class NoSlowdownMod extends Module { - public static NoSlowdownMod INSTANCE; - - { - INSTANCE = this; - } - - public NoSlowdownMod() { - super("NoSlowdown"); - } - - @Override - public void onEnable() { - this.fastIce(); - } - - @Override - public void onDisable() { - this.normalIce(); - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } - - private void fastIce() { - Blocks.ICE.slipperiness = 0.39F; - Blocks.PACKED_ICE.slipperiness = 0.39F; - } - - private void normalIce() { - Blocks.ICE.slipperiness = 0.98F; - Blocks.PACKED_ICE.slipperiness = 0.98F; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SafewalkMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SafewalkMod.java deleted file mode 100644 index eb2d98a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SafewalkMod.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.event.MoveEvent; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.renderer.Vector3d; - -public class SafewalkMod extends Module { - public static SafewalkMod INSTANCE; - private Vector3d vec = new Vector3d(); - - { - INSTANCE = this; - } - - public SafewalkMod() { - super("Safewalk"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } - - @Override - public void onPlayerMove(MoveEvent event) { - double x = event.x; - double y = event.y; - double z = event.z; - - if (mc.player.onGround) { - double increment; - for (increment = 0.05D; x != 0.0D && this.isOffsetBBEmpty(x, -1.0D, 0.0D); ) { - if (x < increment && x >= -increment) { - x = 0.0D; - } else if (x > 0.0D) { - x -= increment; - } else { - x += increment; - } - } - for (; z != 0.0D && this.isOffsetBBEmpty(0.0D, -1.0D, z); ) { - if (z < increment && z >= -increment) { - z = 0.0D; - } else if (z > 0.0D) { - z -= increment; - } else { - z += increment; - } - } - for (; x != 0.0D && z != 0.0D && this.isOffsetBBEmpty(x, -1.0D, z); ) { - if (x < increment && x >= -increment) { - x = 0.0D; - } else if (x > 0.0D) { - x -= increment; - } else { - x += increment; - } - if (z < increment && z >= -increment) { - z = 0.0D; - } else if (z > 0.0D) { - z -= increment; - } else { - z += increment; - } - } - } - - event.x = x; - event.y = y; - event.z = z; - } - - public boolean isOffsetBBEmpty(double offsetX, double offsetY, double offsetZ) { - EntityPlayerSP playerSP = mc.player; - this.vec.x = offsetX; - this.vec.y = offsetY; - this.vec.z = offsetZ; - return mc.world.getCollisionBoxes(playerSP, playerSP.getEntityBoundingBox().offset(this.vec.x, this.vec.y, this.vec.z)).isEmpty(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SpeedMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SpeedMod.java deleted file mode 100644 index f57c0fb..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/SpeedMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class SpeedMod extends Module { - public static SpeedMod INSTANCE; - - { - INSTANCE = this; - } - - public SpeedMod() { - super("Speed"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/StepMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/StepMod.java deleted file mode 100644 index 5a40cb2..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/StepMod.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.StepTranslator; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.util.math.AxisAlignedBB; - -import java.util.List; - -public class StepMod extends Module { - public static StepMod INSTANCE; - - { - INSTANCE = this; - } - - public StepMod() { - super("Step"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - if (pepsimod.hasInitializedModules) { - mc.player.stepHeight = 0.5F; - } - } - - @Override - public void tick() { - if (StepTranslator.INSTANCE.legit) { - EntityPlayerSP player = mc.player; - - player.stepHeight = 0.5f; - - if (!player.collidedHorizontally) { - return; - } - - if (!player.onGround || player.isOnLadder() || player.isInWater() || player.isInLava()) { - return; - } - - if (player.movementInput.moveForward == 0 && player.movementInput.moveStrafe == 0) { - return; - } - - if (player.movementInput.jump) { - return; - } - - AxisAlignedBB bb = player.getEntityBoundingBox().expand(0.0625, 0, 0.0625).expand(-0.0625, 0, -0.0625); - boolean found = false; - for (double d = 1.0d; d > 0.0d; d -= 1.0d / 16.0d) { - if (mc.world.getCollisionBoxes(player, bb.offset(0, d, 0)).isEmpty()) { - found = true; - break; - } - } - - if (!found) { - return; - } - - double stepHeight = -1; - List bbs = mc.world.getCollisionBoxes(player, bb); - for (AxisAlignedBB box : bbs) { - if (box.maxY > stepHeight) { - stepHeight = box.maxY; - } - } - - stepHeight -= player.posY; - - if (stepHeight < 0 || stepHeight > 1) { - return; - } - - mc.player.connection.sendPacket(new CPacketPlayer.Position(player.posX, player.posY + 0.42 * stepHeight, player.posZ, player.onGround)); - mc.player.connection.sendPacket(new CPacketPlayer.Position(player.posX, player.posY + 0.753 * stepHeight, player.posZ, player.onGround)); - player.setPosition(player.posX, player.posY + 1 * stepHeight, player.posZ); - } else { - mc.player.stepHeight = StepTranslator.INSTANCE.height; - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(StepTranslator.INSTANCE.height, "height", OptionCompletions.INTEGER, - (value) -> { - StepTranslator.INSTANCE.height = Math.max(0, value); - return true; - }, - () -> { - return StepTranslator.INSTANCE.height; - }, "Height", new ExtensionSlider(ExtensionType.VALUE_INT, 1, 64, 1)), - new ModuleOption<>(StepTranslator.INSTANCE.legit, "legit", OptionCompletions.BOOLEAN, - (value) -> { - StepTranslator.INSTANCE.legit = value; - return true; - }, - () -> { - return StepTranslator.INSTANCE.legit; - }, "Legit") - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - if (StepTranslator.INSTANCE.legit) { - return "Legit"; - } else { - return String.valueOf(StepTranslator.INSTANCE.height); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/VelocityMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/movement/VelocityMod.java deleted file mode 100644 index a6bb2bd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/movement/VelocityMod.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.movement; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.VelocityTranslator; - -public class VelocityMod extends Module { - public static VelocityMod INSTANCE; - - { - INSTANCE = this; - } - - public VelocityMod() { - super("Velocity"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(1.0f, "strength", new String[]{"1.0", "0.0"}, - (value) -> { - VelocityTranslator.INSTANCE.multiplier = value; - return true; - }, - () -> { - return VelocityTranslator.INSTANCE.multiplier; - }, "Strength", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 1.0f, 0.1f)) - }; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - return String.valueOf((float) this.getOptionByName("strength").getValue()); - } - - public float getVelocity() { - if (this.state.enabled) { - return VelocityTranslator.INSTANCE.multiplier; - } else { - return 1.0f; - } - } - - public ModuleCategory getCategory() { - return ModuleCategory.MOVEMENT; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AntiAFKMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/AntiAFKMod.java deleted file mode 100644 index cfc4cec..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AntiAFKMod.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.optimization.OverrideCounter; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RotationUtils; -import net.daporkchop.pepsimod.util.config.impl.AntiAFKTranslator; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.EnumHand; -import net.minecraft.util.Tuple; -import org.lwjgl.opengl.Display; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public class AntiAFKMod extends Module { - public static AntiAFKMod INSTANCE; - protected long lastRun = System.currentTimeMillis(); - protected Runnable cleaner = null; - - { - INSTANCE = this; - } - - public AntiAFKMod() { - super("AntiAFK"); - } - - @Override - public void onEnable() { - this.lastRun = System.currentTimeMillis(); - } - - @Override - public void onDisable() { - this.clean(); - } - - @Override - public void tick() { - if (AntiAFKTranslator.INSTANCE.requireInactive && mc.inGameHasFocus) { - this.lastRun = System.currentTimeMillis(); - } else if (this.isAnyKeyPressed()) { - this.clean(); - this.lastRun = System.currentTimeMillis(); - } else if (this.lastRun + AntiAFKTranslator.INSTANCE.delay <= System.currentTimeMillis()) { - this.clean(); - this.lastRun = System.currentTimeMillis(); - List> functions = new ArrayList<>(); - - if (AntiAFKTranslator.INSTANCE.spin) { - functions.add(new Tuple<>( - () -> RotationUtils.faceVectorClient(mc.player.getPositionVector().add( - ThreadLocalRandom.current().nextDouble(-5.0d, 5.0d), - ThreadLocalRandom.current().nextDouble(-5.0d, 5.0d), - ThreadLocalRandom.current().nextDouble(-5.0d, 5.0d) - )), - () -> { - } - )); - } - if (AntiAFKTranslator.INSTANCE.sneak) { - functions.add(new Tuple<>( - () -> ((OverrideCounter) mc.gameSettings.keyBindSneak).incrementOverride(), - () -> ((OverrideCounter) mc.gameSettings.keyBindSneak).decrementOverride() - )); - } - if (AntiAFKTranslator.INSTANCE.swingArm) { - functions.add(new Tuple<>( - () -> mc.player.swingArm(EnumHand.MAIN_HAND), - () -> { - } - )); - } - if (AntiAFKTranslator.INSTANCE.strafe) { - int flag = ThreadLocalRandom.current().nextInt(2); - functions.add(new Tuple<>( - () -> { - switch (flag) { - case 0: - ((OverrideCounter) mc.gameSettings.keyBindLeft).incrementOverride(); - break; - case 1: - ((OverrideCounter) mc.gameSettings.keyBindRight).incrementOverride(); - break; - } - }, - () -> { - switch (flag) { - case 0: - ((OverrideCounter) mc.gameSettings.keyBindLeft).decrementOverride(); - break; - case 1: - ((OverrideCounter) mc.gameSettings.keyBindRight).decrementOverride(); - break; - } - } - )); - } else if (AntiAFKTranslator.INSTANCE.move) { - int flag = ThreadLocalRandom.current().nextInt(4); - functions.add(new Tuple<>( - () -> { - switch (flag) { - case 0: - ((OverrideCounter) mc.gameSettings.keyBindForward).incrementOverride(); - break; - case 1: - ((OverrideCounter) mc.gameSettings.keyBindBack).incrementOverride(); - break; - case 2: - ((OverrideCounter) mc.gameSettings.keyBindLeft).incrementOverride(); - break; - case 3: - ((OverrideCounter) mc.gameSettings.keyBindRight).incrementOverride(); - break; - } - }, - () -> { - switch (flag) { - case 0: - ((OverrideCounter) mc.gameSettings.keyBindForward).decrementOverride(); - break; - case 1: - ((OverrideCounter) mc.gameSettings.keyBindBack).decrementOverride(); - break; - case 2: - ((OverrideCounter) mc.gameSettings.keyBindLeft).decrementOverride(); - break; - case 3: - ((OverrideCounter) mc.gameSettings.keyBindRight).decrementOverride(); - break; - } - } - )); - } - - if (!functions.isEmpty()) { - Tuple tuple = functions.get(ThreadLocalRandom.current().nextInt(functions.size())); - tuple.getFirst().run(); - this.cleaner = tuple.getSecond(); - } - } - } - - protected void clean() { - if (this.cleaner != null) { - this.cleaner.run(); - this.cleaner = null; - } - } - - protected boolean isAnyKeyPressed() { - if (!Display.isActive()) { - return false; - } - for (KeyBinding keyBind : mc.gameSettings.keyBindings) { - if (keyBind.isKeyDown()) { - return true; - } - } - return false; - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(AntiAFKTranslator.INSTANCE.delay, "delay", new String[]{"1000", "2000", "3000", "4000", "5000"}, - val -> { - AntiAFKTranslator.INSTANCE.delay = val; - return true; - }, - () -> AntiAFKTranslator.INSTANCE.delay, - "Delay", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 10000, 500) - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.spin, "spin", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.spin = val; - this.clean(); - return true; - }, - () -> AntiAFKTranslator.INSTANCE.spin, - "Spin" - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.sneak, "sneak", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.sneak = val; - this.clean(); - return true; - }, - () -> AntiAFKTranslator.INSTANCE.sneak, - "Sneak" - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.swingArm, "swingArm", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.swingArm = val; - this.clean(); - return true; - }, - () -> AntiAFKTranslator.INSTANCE.swingArm, - "Swing arm" - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.move, "move", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.move = val; - this.clean(); - return true; - }, - () -> AntiAFKTranslator.INSTANCE.move, - "Move" - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.strafe, "strafe", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.strafe = val; - this.clean(); - return true; - }, - () -> AntiAFKTranslator.INSTANCE.strafe, - "Strafe" - ), - new ModuleOption<>(AntiAFKTranslator.INSTANCE.requireInactive, "requireInactive", OptionCompletions.BOOLEAN, - val -> { - AntiAFKTranslator.INSTANCE.requireInactive = val; - return true; - }, - () -> AntiAFKTranslator.INSTANCE.requireInactive, - "Require inactive" - ) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoEatMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoEatMod.java deleted file mode 100644 index a06ebc3..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoEatMod.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.config.impl.AutoEatTranslator; -import net.minecraft.block.BlockContainer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.EntityTameable; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.inventory.ClickType; -import net.minecraft.item.ItemAppleGold; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.util.FoodStats; - -public class AutoEatMod extends Module { - public static AutoEatMod INSTANCE; - public boolean doneEating = true; - - { - INSTANCE = this; - } - - public AutoEatMod() { - super("AutoEat"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - if (mc.world != null) { - ReflectionStuff.setPressed(mc.gameSettings.keyBindUseItem, false); - } - this.doneEating = true; - } - - @Override - public void tick() { - if (!this.shouldEat()) { - ReflectionStuff.setPressed(mc.gameSettings.keyBindUseItem, false); - this.doneEating = true; - return; - } - - FoodStats foodStats = mc.player.getFoodStats(); - if (foodStats.getFoodLevel() <= AutoEatTranslator.INSTANCE.threshold && this.shouldEat()) { - this.doneEating = false; - this.eatFood(); - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(AutoEatTranslator.INSTANCE.threshold, "threshold", OptionCompletions.FLOAT, - (value) -> { - AutoEatTranslator.INSTANCE.threshold = Math.max(0, value); - return true; - }, - () -> { - return AutoEatTranslator.INSTANCE.threshold; - }, "Threshold", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0f, 19f, 1f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } - - private void eatFood() { - for (int slot = 44; slot >= 9; slot--) { - ItemStack stack = mc.player.inventoryContainer.getSlot(slot).getStack(); - - if (stack != null) { - if (slot >= 36 && slot <= 44) { - if (stack.getItem() instanceof ItemFood - && !(stack.getItem() instanceof ItemAppleGold)) { - mc.player.inventory.currentItem = slot - 36; - ReflectionStuff.setPressed(mc.gameSettings.keyBindUseItem, true); - return; - } - } else if (stack.getItem() instanceof ItemFood - && !(stack.getItem() instanceof ItemAppleGold)) { - int itemSlot = slot; - int currentSlot = mc.player.inventory.currentItem + 36; - mc.playerController.windowClick(0, slot, 0, ClickType.PICKUP, mc.player); - mc.playerController.windowClick(0, currentSlot, 0, ClickType.PICKUP, mc.player); - mc.playerController.windowClick(0, slot, 0, ClickType.PICKUP, mc.player); - return; - } - } - } - } - - private boolean shouldEat() { - if (!mc.player.canEat(false)) { - return false; - } - - if (mc.currentScreen != null) { - return false; - } - - if (mc.currentScreen == null && mc.objectMouseOver != null) { - Entity entity = mc.objectMouseOver.entityHit; - if (entity instanceof EntityVillager || entity instanceof EntityTameable) { - return false; - } - - if (mc.objectMouseOver.getBlockPos() != null && mc.world.getBlockState(mc.objectMouseOver.getBlockPos()).getBlock() instanceof BlockContainer) { - return false; - } - } - - return true; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoMineMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoMineMod.java deleted file mode 100644 index 7d993da..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/AutoMineMod.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.optimization.OverrideCounter; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.math.RayTraceResult; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class AutoMineMod extends Module { - public static AutoMineMod INSTANCE; - protected boolean started = false; - protected final AtomicBoolean incremented = new AtomicBoolean(false); - - { - INSTANCE = this; - } - - public AutoMineMod() { - super("AutoMine"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - if (this.incremented.getAndSet(false)) { - ((OverrideCounter) mc.gameSettings.keyBindAttack).decrementOverride(); - } - } - - @Override - public void tick() { - if (this.started && mc.gameSettings.keyBindUseItem.isKeyDown()) { - this.started = false; - } - if (this.incremented.getAndSet(false)) { - ((OverrideCounter) mc.gameSettings.keyBindAttack).decrementOverride(); - } - if (mc.objectMouseOver == null || mc.objectMouseOver.typeOfHit != RayTraceResult.Type.BLOCK) { - return; - } - - if (this.started) { - IBlockState state = mc.world.getBlockState(mc.objectMouseOver.getBlockPos()); - boolean flag = state.getBlock().getMaterial(state) != Material.AIR; - if (flag && !this.incremented.getAndSet(true)) { - ((OverrideCounter) mc.gameSettings.keyBindAttack).incrementOverride(); - } - } else { - if (mc.gameSettings.keyBindAttack.isKeyDown()) { - this.started = true; - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/FastPlaceMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/FastPlaceMod.java deleted file mode 100644 index 1141b55..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/FastPlaceMod.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.util.ReflectionStuff; - -public class FastPlaceMod extends Module { - public static FastPlaceMod INSTANCE; - - { - INSTANCE = this; - } - - public FastPlaceMod() { - super("FastPlace"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - ReflectionStuff.setRightClickDelayTimer(0); - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/ScaffoldMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/ScaffoldMod.java deleted file mode 100644 index 7ee0178..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/ScaffoldMod.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.the.wurst.pkg.name.BlockUtils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockPistonBase; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; - -public class ScaffoldMod extends Module { - public static ScaffoldMod INSTANCE; - - { - INSTANCE = this; - } - - public ScaffoldMod() { - super("Scaffold"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - BlockPos belowPlayer = new BlockPos(mc.player).down(); - - // check if block is already placed - IBlockState state = mc.world.getBlockState(belowPlayer); - if (!state.getBlock().isReplaceable(mc.world, belowPlayer)) { - return; - } - - // search blocks in hotbar - int newSlot = -1; - for (int i = 0; i < 9; i++) { - // filter out non-block items - ItemStack stack = mc.player.inventory.getStackInSlot(i); - if (stack == null || stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) { - continue; - } - - // filter out non-solid blocks - Block block = Block.getBlockFromItem(stack.getItem()); - if (!block.getDefaultState().isFullBlock() && !(block instanceof BlockPistonBase)) { - continue; - } - - newSlot = i; - break; - } - - // check if any blocks were found - if (newSlot == -1) { - return; - } - - // set slot - int oldSlot = mc.player.inventory.currentItem; - mc.player.inventory.currentItem = newSlot; - - // place block - BlockUtils.placeBlockScaffold(belowPlayer); - - // reset slot - mc.player.inventory.currentItem = oldSlot; - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/SpeedmineMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/SpeedmineMod.java deleted file mode 100644 index d83b54c..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/SpeedmineMod.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.config.impl.SpeedmineTranslator; - -public class SpeedmineMod extends Module { - public static SpeedmineMod INSTANCE; - - { - INSTANCE = this; - } - - public SpeedmineMod() { - super("Speedmine"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (mc.world != null) { - if (ReflectionStuff.getCurBlockDamageMP() < SpeedmineTranslator.INSTANCE.speed) { - ReflectionStuff.setCurBlockDamageMP(SpeedmineTranslator.INSTANCE.speed); - } - if (ReflectionStuff.getBlockHitDelay() > 1) { - ReflectionStuff.setBlockHitDelay(1); - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(SpeedmineTranslator.INSTANCE.speed, "speed", OptionCompletions.FLOAT, - (value) -> { - SpeedmineTranslator.INSTANCE.speed = Math.max(0, value); - return true; - }, - () -> { - return SpeedmineTranslator.INSTANCE.speed; - }, "Speed", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.1f, 1f, 0.1f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/player/SprintMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/player/SprintMod.java deleted file mode 100644 index bd973ae..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/player/SprintMod.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.player; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class SprintMod extends Module { - public static SprintMod INSTANCE; - - { - INSTANCE = this; - } - - public SprintMod() { - super("Sprint"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - boolean shouldSprint = mc.player.movementInput.moveForward > 0.0F && !mc.player.isSneaking(); - if (shouldSprint) { - mc.player.setSprinting(true); - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.PLAYER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiBlindMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiBlindMod.java deleted file mode 100644 index d672965..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiBlindMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class AntiBlindMod extends Module { - public static AntiBlindMod INSTANCE; - - { - INSTANCE = this; - } - - public AntiBlindMod() { - super("AntiBlind"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiInvisibleMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiInvisibleMod.java deleted file mode 100644 index d0de373..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiInvisibleMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class AntiInvisibleMod extends Module { - public static AntiInvisibleMod INSTANCE; - - { - INSTANCE = this; - } - - public AntiInvisibleMod() { - super("AntiInvisible"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiTotemAnimationMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiTotemAnimationMod.java deleted file mode 100644 index 8c87a50..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/AntiTotemAnimationMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class AntiTotemAnimationMod extends Module { - public static AntiTotemAnimationMod INSTANCE; - - { - INSTANCE = this; - } - - public AntiTotemAnimationMod() { - super("AntiTotemAnimation"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/ESPMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/ESPMod.java deleted file mode 100644 index 7ffb85e..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/ESPMod.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.util.RenderColor; -import net.daporkchop.pepsimod.util.config.impl.ESPTranslator; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.daporkchop.pepsimod.util.render.WorldRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.monster.EntityGolem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; - -public class ESPMod extends Module { - public static final RenderColor friendColor = new RenderColor(76, 144, 255, 255); - public static final RenderColor monsterColor = new RenderColor(128, 0, 0, 255); - public static final RenderColor animalColor = new RenderColor(0, 0, 204, 255); - public static final RenderColor golemColor = new RenderColor(179, 179, 179, 255); - public static final RenderColor playerColor = new RenderColor(255, 255, 0, 255); - - public static ESPMod INSTANCE; - - { - INSTANCE = this; - } - - public ESPMod() { - super("ESP"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public void renderWorld(WorldRenderer renderer) { - if (!ESPTranslator.INSTANCE.box) { - return; - } - - for (Entity entity : mc.world.loadedEntityList) { - if (entity == mc.player) { - continue; - } - RenderColor color = this.chooseColor(entity); - if (color != null) { - renderer.color(color).outline(entity); - } - } - } - - public RenderColor chooseColor(Entity entity) { - if (!this.state.enabled) { - return null; - } else if (entity.isInvisible() && !ESPTranslator.INSTANCE.invisible) { - return null; - } else if (ESPTranslator.INSTANCE.animals && entity instanceof EntityAnimal) { - return animalColor; - } else if (ESPTranslator.INSTANCE.monsters && entity instanceof EntityMob) { - return monsterColor; - } else if (ESPTranslator.INSTANCE.players && entity instanceof EntityPlayer) { - if (ESPTranslator.INSTANCE.friendColors && FriendsTranslator.INSTANCE.isFriend(entity)) { - return friendColor; - } else { - return playerColor; - } - } else if (ESPTranslator.INSTANCE.golems && entity instanceof EntityGolem) { - return golemColor; - } else { - return null; - } - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(ESPTranslator.INSTANCE.monsters, "monsters", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.monsters = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.monsters; - }, "Monsters"), - new ModuleOption<>(ESPTranslator.INSTANCE.animals, "animals", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.animals = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.animals; - }, "Animals"), - new ModuleOption<>(ESPTranslator.INSTANCE.players, "players", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.players = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.players; - }, "Players"), - new ModuleOption<>(ESPTranslator.INSTANCE.golems, "golems", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.golems = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.golems; - }, "Golems"), - new ModuleOption<>(ESPTranslator.INSTANCE.invisible, "invisible", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.invisible = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.invisible; - }, "Invisible"), - new ModuleOption<>(ESPTranslator.INSTANCE.friendColors, "friendColors", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.friendColors = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.friendColors; - }, "FriendColors"), - new ModuleOption<>(ESPTranslator.INSTANCE.box, "box", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.box = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.box; - }, "Box") - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/FullbrightMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/FullbrightMod.java deleted file mode 100644 index 1a3cc90..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/FullbrightMod.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class FullbrightMod extends Module { - public static FullbrightMod INSTANCE; - - public int level = 0; - - { - INSTANCE = this; - } - - public FullbrightMod() { - super("Fullbright"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - if (this.state.enabled || XrayMod.INSTANCE.state.enabled) { - final int max = 32; - if (this.level < max) { - this.level++; - } else if (this.level > max) { - this.level = max; - } - } else { - final int min = 8; - if (this.level > min) { - this.level = min; - } else if (this.level > 0) { - this.level--; - } else if (this.level < 0) { - this.level = 0; - } - } - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - @Override - public boolean shouldTick() { - return true; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/HealthTagsMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/HealthTagsMod.java deleted file mode 100644 index 85fd323..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/HealthTagsMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class HealthTagsMod extends Module { - public static HealthTagsMod INSTANCE; - - { - INSTANCE = this; - } - - public HealthTagsMod() { - super("HealthTags"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NameTagsMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/NameTagsMod.java deleted file mode 100644 index 4333766..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NameTagsMod.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.NameTagsTranslator; - -public class NameTagsMod extends Module { - public static NameTagsMod INSTANCE; - - { - INSTANCE = this; - } - - public NameTagsMod() { - super("NameTags"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[] { - new ModuleOption<>(1.0f, "scale", new String[]{"0.5", "1.0", "1.5", "2.0"}, - val -> { - NameTagsTranslator.INSTANCE.scale = val; - return true; - }, - () -> NameTagsTranslator.INSTANCE.scale, - "Scale", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.1f, 5.0f, 0.1f)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoHurtCamMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoHurtCamMod.java deleted file mode 100644 index b8b9a50..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoHurtCamMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class NoHurtCamMod extends Module { - public static NoHurtCamMod INSTANCE; - - { - INSTANCE = this; - } - - public NoHurtCamMod() { - super("NoHurtCam"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoOverlayMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoOverlayMod.java deleted file mode 100644 index 7985603..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoOverlayMod.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class NoOverlayMod extends Module { - public static NoOverlayMod INSTANCE; - - { - INSTANCE = this; - } - - public NoOverlayMod() { - super("NoOverlay"); - } - - @Override - public void onEnable() { - INSTANCE = this; - } - - @Override - public void onDisable() { - INSTANCE = this; - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoWeatherMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoWeatherMod.java deleted file mode 100644 index dfa6aa4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/NoWeatherMod.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.NoWeatherTranslator; - -public class NoWeatherMod extends Module { - public static NoWeatherMod INSTANCE; - - { - INSTANCE = this; - } - - public NoWeatherMod() { - super("NoWeather"); - } - - @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(false, "disableRain", OptionCompletions.BOOLEAN, - (value) -> { - NoWeatherTranslator.INSTANCE.disableRain = value; - return true; - }, - () -> { - return NoWeatherTranslator.INSTANCE.disableRain; - }, "Disable Rain"), - new ModuleOption<>(false, "changeTime", OptionCompletions.BOOLEAN, - (value) -> { - NoWeatherTranslator.INSTANCE.changeTime = value; - return true; - }, - () -> { - return NoWeatherTranslator.INSTANCE.changeTime; - }, "Change Time"), - new ModuleOption<>(NoWeatherTranslator.INSTANCE.time, "time", new String[]{"0", "6000", "12000", "18000", "24000"}, - (value) -> { - if (value < 0 || value > 24000) { - clientMessage("Time must be in range 0-24000!"); - return false; - } - NoWeatherTranslator.INSTANCE.time = value; - return true; - }, - () -> { - return NoWeatherTranslator.INSTANCE.time; - }, "Time", new ExtensionSlider(ExtensionType.VALUE_INT, 0, 24000, 500)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/StorageESPMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/StorageESPMod.java deleted file mode 100644 index 98c7494..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/StorageESPMod.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.RenderColor; -import net.daporkchop.pepsimod.util.config.impl.ESPTranslator; -import net.daporkchop.pepsimod.util.config.impl.TracersTranslator; -import net.daporkchop.pepsimod.util.render.WorldRenderer; -import net.minecraft.block.BlockChest; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.tileentity.TileEntityEnderChest; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.tileentity.TileEntityHopper; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; - -public class StorageESPMod extends Module { - public static final RenderColor chestColor = new RenderColor(196, 139, 53, 128); - public static final RenderColor trappedColor = new RenderColor(81, 57, 22, 128); - public static final RenderColor enderColor = new RenderColor(25, 35, 40, 128); - public static final RenderColor hopperColor = new RenderColor(45, 45, 45, 128); - public static final RenderColor furnaceColor = new RenderColor(151, 151, 151, 128); - public static StorageESPMod INSTANCE; - - public static AxisAlignedBB getBoundingBox(World world, BlockPos pos) { - return world.getBlockState(pos).getBoundingBox(world, pos); - } - - public final ArrayList basic = new ArrayList<>(); - public final ArrayList trapped = new ArrayList<>(); - public final ArrayList ender = new ArrayList<>(); - public final ArrayList hopper = new ArrayList<>(); - public final ArrayList furnace = new ArrayList<>(); - - { - INSTANCE = this; - } - - public StorageESPMod() { - super("StorageESP"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - this.basic.clear(); - this.trapped.clear(); - this.ender.clear(); - this.hopper.clear(); - this.furnace.clear(); - - for (TileEntity te : mc.world.loadedTileEntityList) { - if ((ESPTranslator.INSTANCE.basic || ESPTranslator.INSTANCE.trapped) && te instanceof TileEntityChest) { - TileEntityChest chestTe = (TileEntityChest) te; - - if (chestTe.adjacentChestXPos != null || chestTe.adjacentChestZPos != null) { - continue; - } - - AxisAlignedBB bb = PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, te.getPos())), te.getPos()); - - if (chestTe.adjacentChestXNeg != null) { - ReflectionStuff.setMinX(bb, bb.minX - 1); - //PepsiUtils.unionBB(bb, PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, chestTe.adjacentChestXNeg.getPos())), chestTe.adjacentChestXNeg.getPos())); - } else if (chestTe.adjacentChestZNeg != null) { - ReflectionStuff.setMinZ(bb, bb.minZ - 1); - //PepsiUtils.unionBB(bb, PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, chestTe.adjacentChestZNeg.getPos())), chestTe.adjacentChestZNeg.getPos())); - } - - if (chestTe.getChestType() == BlockChest.Type.TRAP) { - if (ESPTranslator.INSTANCE.trapped) { - this.trapped.add(bb); - } - } else { - if (ESPTranslator.INSTANCE.basic) { - this.basic.add(bb); - } - } - } else if (ESPTranslator.INSTANCE.ender && te instanceof TileEntityEnderChest) { - this.ender.add(PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, te.getPos())), te.getPos())); - } else if (ESPTranslator.INSTANCE.furnace && te instanceof TileEntityFurnace) { - this.furnace.add(PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, te.getPos())), te.getPos())); - } else if (ESPTranslator.INSTANCE.hopper && te instanceof TileEntityHopper) { - this.hopper.add(PepsiUtils.offsetBB(PepsiUtils.cloneBB(getBoundingBox(mc.world, te.getPos())), te.getPos())); - } - } - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(ESPTranslator.INSTANCE.basic, "normal", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.basic = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.basic; - }, "Normal"), - new ModuleOption<>(ESPTranslator.INSTANCE.trapped, "trapped", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.trapped = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.trapped; - }, "Trapped"), - new ModuleOption<>(ESPTranslator.INSTANCE.ender, "ender", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.ender = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.ender; - }, "Ender"), - new ModuleOption<>(ESPTranslator.INSTANCE.hopper, "hopper", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.hopper = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.hopper; - }, "Hopper"), - new ModuleOption<>(ESPTranslator.INSTANCE.furnace, "furnace", OptionCompletions.BOOLEAN, - (value) -> { - ESPTranslator.INSTANCE.furnace = value; - return true; - }, - () -> { - return ESPTranslator.INSTANCE.furnace; - }, "Furnace") - }; - } - - @Override - public void renderWorld(WorldRenderer renderer) { - renderer.width(TracersTranslator.INSTANCE.width); - - if (ESPTranslator.INSTANCE.basic) { - renderer.color(chestColor); - //this.basic.forEach(bb -> renderer.line(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ)); - this.basic.forEach(renderer::outline); - } - - if (ESPTranslator.INSTANCE.trapped) { - renderer.color(trappedColor); - this.trapped.forEach(renderer::outline); - } - - if (ESPTranslator.INSTANCE.ender) { - renderer.color(enderColor); - this.ender.forEach(renderer::outline); - } - - if (ESPTranslator.INSTANCE.hopper) { - renderer.color(hopperColor); - this.hopper.forEach(renderer::outline); - } - - if (ESPTranslator.INSTANCE.furnace) { - renderer.color(furnaceColor); - this.furnace.forEach(renderer::outline); - } - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/TracersMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/TracersMod.java deleted file mode 100644 index d2ad0cd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/TracersMod.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.EntityFakePlayer; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.RenderColor; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.daporkchop.pepsimod.util.config.impl.TracersTranslator; -import net.daporkchop.pepsimod.util.render.WorldRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; - -public class TracersMod extends Module { - public static final RenderColor friendColor = new RenderColor(76, 144, 255, 255); - public static final RenderColor monsterColor = new RenderColor(128, 0, 0, 255); - public static final RenderColor animalColor = new RenderColor(0, 0, 204, 255); - public static final RenderColor itemColor = new RenderColor(179, 179, 179, 255); - - public static final RenderColor distSafe = new RenderColor(0, 255, 0, 255); - public static final RenderColor dist20 = new RenderColor(128, 255, 0, 255); - public static final RenderColor dist15 = new RenderColor(255, 255, 0, 255); - public static final RenderColor dist10 = new RenderColor(255, 128, 0, 255); - public static final RenderColor dist5 = new RenderColor(255, 0, 0, 255); - - public static TracersMod INSTANCE; - - { - INSTANCE = this; - } - - public TracersMod() { - super("Tracers"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(false, "sleeping", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.sleeping = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.sleeping; - }, "Sleeping"), - new ModuleOption<>(false, "invisible", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.invisible = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.invisible; - }, "Invisible"), - new ModuleOption<>(true, "friendColors", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.friendColors = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.friendColors; - }, "FriendColors"), - new ModuleOption<>(false, "animals", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.animals = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.animals; - }, "Animals"), - new ModuleOption<>(false, "monsters", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.monsters = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.monsters; - }, "Monsters"), - new ModuleOption<>(false, "players", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.players = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.players; - }, "Players"), - new ModuleOption<>(false, "items", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.items = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.items; - }, "Items"), - new ModuleOption<>(false, "everything", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.everything = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.everything; - }, "Everything"), - new ModuleOption<>(true, "distanceColor", OptionCompletions.BOOLEAN, - (value) -> { - TracersTranslator.INSTANCE.distanceColor = value; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.distanceColor; - }, "DistanceColor"), - new ModuleOption<>(2.0f, "width", new String[]{"0.5", "1.0", "1.5", "2.0", "2.5"}, - val -> { - TracersTranslator.INSTANCE.width = val; - return true; - }, - () -> { - return TracersTranslator.INSTANCE.width; - }, "Width", new ExtensionSlider(ExtensionType.VALUE_FLOAT, 0.0f, 10.0f, 0.1f)) - }; - } - - - @Override - public void renderOverlay(WorldRenderer renderer) { - renderer.width(TracersTranslator.INSTANCE.width); - - RenderColor color = null; - for (Entity entity : mc.world.getLoadedEntityList()) { - if (Math.abs(entity.posY - mc.player.posY) > 1e6) { - continue; - } - - if (!TracersTranslator.INSTANCE.invisible && entity.isInvisible()) { - continue; - } - - if ((TracersTranslator.INSTANCE.players || TracersTranslator.INSTANCE.everything) && entity instanceof EntityPlayer) { - if (entity == mc.player || entity instanceof EntityFakePlayer) { - continue; - } - - if (!TracersTranslator.INSTANCE.sleeping && ReflectionStuff.getSleeping((EntityPlayer) entity)) { - continue; - } - - if (TracersTranslator.INSTANCE.friendColors && FriendsTranslator.INSTANCE.isFriend(entity)) { - color = friendColor; - } else if (TracersTranslator.INSTANCE.distanceColor) { - double dist = mc.player.getDistanceSq(entity); - if (dist >= 625) { - color = distSafe; - } else if (dist >= 400) { - color = dist20; - } else if (dist >= 225) { - color = dist15; - } else if (dist >= 100) { - color = dist10; - } else { - color = dist5; - } - } - } else if ((TracersTranslator.INSTANCE.monsters || TracersTranslator.INSTANCE.everything) && entity instanceof EntityMob) { - if (TracersTranslator.INSTANCE.distanceColor) { - double dist = mc.player.getDistanceSq(entity); - if (dist >= 625) { - color = distSafe; - } else if (dist >= 400) { - color = dist20; - } else if (dist >= 225) { - color = dist15; - } else if (dist >= 100) { - color = dist10; - } else { - color = dist5; - } - } else { - color = monsterColor; - } - } else if ((TracersTranslator.INSTANCE.animals || TracersTranslator.INSTANCE.everything) && entity instanceof EntityAnimal) { - color = animalColor; - } else if ((TracersTranslator.INSTANCE.items || TracersTranslator.INSTANCE.everything) && entity instanceof EntityItem) { - color = itemColor; - } else { - continue; - } - - renderer.color(color).lineFromEyes(entity); - } - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/TrajectoriesMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/TrajectoriesMod.java deleted file mode 100644 index 9123730..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/TrajectoriesMod.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.the.wurst.pkg.name.RenderUtils; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.daporkchop.pepsimod.util.RenderColor; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemFishingRod; -import net.minecraft.item.ItemPotion; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import org.lwjgl.opengl.GL11; - -public class TrajectoriesMod extends Module { - public static final RenderColor lineColor = new RenderColor(51, 196, 191, 128); - public static TrajectoriesMod INSTANCE; - - { - INSTANCE = this; - } - - public TrajectoriesMod() { - super("Trajectories"); - } - - @Override - public void onEnable() { - } - - @Override - public void onDisable() { - } - - @Override - public void tick() { - } - - @Override - public void init() { - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - - }; - } - - @Override - public void onRender(float partialTicks) { - EntityPlayerSP player = mc.player; - - ItemStack stack = player.inventory.getCurrentItem(); - if (stack == null) { - return; - } - - if (!PepsiUtils.isThrowable(stack)) { - return; - } - - boolean usingBow = stack.getItem() instanceof ItemBow; - - // calculate starting position - double arrowPosX = player.lastTickPosX + (player.posX - player.lastTickPosX) * ReflectionStuff.getTimer().renderPartialTicks - Math.cos((float) Math.toRadians(player.rotationYaw)) * 0.16F; - double arrowPosY = player.lastTickPosY + (player.posY - player.lastTickPosY) * ReflectionStuff.getTimer().renderPartialTicks + player.getEyeHeight() - 0.1; - double arrowPosZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * ReflectionStuff.getTimer().renderPartialTicks - Math.sin((float) Math.toRadians(player.rotationYaw)) * 0.16F; - - // calculate starting motion - float arrowMotionFactor = usingBow ? 1F : 0.4F; - float yaw = (float) Math.toRadians(player.rotationYaw); - float pitch = (float) Math.toRadians(player.rotationPitch); - float arrowMotionX = (float) (-Math.sin(yaw) * Math.cos(pitch) * arrowMotionFactor); - float arrowMotionY = (float) (-Math.sin(pitch) * arrowMotionFactor); - float arrowMotionZ = (float) (Math.cos(yaw) * Math.cos(pitch) * arrowMotionFactor); - double arrowMotion = Math.sqrt(arrowMotionX * arrowMotionX + arrowMotionY * arrowMotionY + arrowMotionZ * arrowMotionZ); - arrowMotionX /= arrowMotion; - arrowMotionY /= arrowMotion; - arrowMotionZ /= arrowMotion; - if (usingBow) { - float bowPower = (72000 - player.getItemInUseCount()) / 20F; - bowPower = (bowPower * bowPower + bowPower * 2F) / 3F; - - if (bowPower > 1F || bowPower <= 0.1F) { - bowPower = 1F; - } - - bowPower *= 3F; - arrowMotionX *= bowPower; - arrowMotionY *= bowPower; - arrowMotionZ *= bowPower; - } else { - arrowMotionX *= 1.5D; - arrowMotionY *= 1.5D; - arrowMotionZ *= 1.5D; - } - - // GL settings - GL11.glPushMatrix(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_LINE_SMOOTH); - GL11.glLineWidth(2); - - RenderManager renderManager = mc.getRenderManager(); - - boolean hitEntity = false; - - // draw trajectory line - double gravity = usingBow ? 0.05D : stack.getItem() instanceof ItemPotion ? 0.4D : stack.getItem() instanceof ItemFishingRod ? 0.15D : 0.03D; - Vec3d playerVector = new Vec3d(player.posX, player.posY + player.getEyeHeight(), player.posZ); - PepsiUtils.glColor(lineColor); - GL11.glBegin(GL11.GL_LINE_STRIP); - for (int i = 0; i < 1000; i++) { - GL11.glVertex3d(arrowPosX - ReflectionStuff.getRenderPosX(renderManager), arrowPosY - ReflectionStuff.getRenderPosY(renderManager), arrowPosZ - ReflectionStuff.getRenderPosZ(renderManager)); - - arrowPosX += arrowMotionX * 0.1; - arrowPosY += arrowMotionY * 0.1; - arrowPosZ += arrowMotionZ * 0.1; - arrowMotionX *= 0.999D; - arrowMotionY *= 0.999D; - arrowMotionZ *= 0.999D; - arrowMotionY -= gravity * 0.1; - - RayTraceResult result = mc.world.rayTraceBlocks(playerVector, new Vec3d(arrowPosX, arrowPosY, arrowPosZ)); - if (result != null) { - break; - } else if (!mc.world.checkNoEntityCollision(new AxisAlignedBB( - arrowPosX - 0.25d, arrowPosY - 0.25d, arrowPosZ - 0.25d, - arrowPosX + 0.25d, arrowPosY + 0.25d, arrowPosZ + 0.25d - ), mc.player)) { - hitEntity = true; - break; - } - } - GL11.glEnd(); - - // draw end of trajectory line - double renderX = arrowPosX - ReflectionStuff.getRenderPosX(renderManager); - double renderY = arrowPosY - ReflectionStuff.getRenderPosY(renderManager); - double renderZ = arrowPosZ - ReflectionStuff.getRenderPosZ(renderManager); - - GL11.glPushMatrix(); - GL11.glTranslated(renderX - 0.5, renderY - 0.5, renderZ - 0.5); - - if (hitEntity) { - GL11.glColor4f(1F, 0F, 0F, 0.25F); - } else { - GL11.glColor4f(0F, 1F, 0F, 0.25F); - } - RenderUtils.drawSolidBox(); - if (hitEntity) { - GL11.glColor4f(1F, 0F, 0F, 0.75F); - } else { - GL11.glColor4f(0F, 1F, 0F, 0.75F); - } - RenderUtils.drawOutlinedBox(); - - GL11.glPopMatrix(); - - // GL resets - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(true); - GL11.glDisable(GL11.GL_LINE_SMOOTH); - GL11.glPopMatrix(); - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/UnfocusedCPUMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/UnfocusedCPUMod.java deleted file mode 100644 index c1cb9f7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/UnfocusedCPUMod.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.module.api.OptionCompletions; -import net.daporkchop.pepsimod.module.api.option.ExtensionSlider; -import net.daporkchop.pepsimod.module.api.option.ExtensionType; -import net.daporkchop.pepsimod.util.config.impl.CpuLimitTranslator; - -public class UnfocusedCPUMod extends Module { - public static UnfocusedCPUMod INSTANCE; - - { - INSTANCE = this; - } - - public UnfocusedCPUMod() { - super("UnfocusedCPU"); - INSTANCE = this; - } - - @Override - public void onEnable() { - INSTANCE = this; - } - - @Override - public void onDisable() { - INSTANCE = this; - } - - @Override - public void tick() { - - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(CpuLimitTranslator.INSTANCE.limit, "limit", OptionCompletions.INTEGER, - (value) -> { - CpuLimitTranslator.INSTANCE.limit = Math.max(1, value); - return true; - }, - () -> { - return CpuLimitTranslator.INSTANCE.limit; - }, "Limit", new ExtensionSlider(ExtensionType.VALUE_INT, 1, 60, 1)) - }; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } - - @Override - public boolean hasModeInName() { - return true; - } - - @Override - public String getModeForName() { - return String.valueOf(CpuLimitTranslator.INSTANCE.limit); - - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/XrayMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/XrayMod.java deleted file mode 100644 index 000ceca..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/XrayMod.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleOption; -import net.daporkchop.pepsimod.optimization.BlockID; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.XrayTranslator; -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; - -public class XrayMod extends Module { - public static XrayMod INSTANCE; - - { - INSTANCE = this; - } - - public XrayMod() { - super("Xray"); - } - - @Override - public void onEnable() { - try { - mc.renderGlobal.loadRenderers(); - } catch (NullPointerException e) { - //we don't care, mc isn't initialized yet - } - } - - @Override - public void onDisable() { - try { - mc.renderGlobal.loadRenderers(); - } catch (NullPointerException e) { - //we don't care, mc isn't initialized yet - } - } - - @Override - public void tick() { - } - - @Override - public void init() { - INSTANCE = this; - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[]{ - new ModuleOption<>(0, "add", new String[0], - (value) -> { - return true; - }, - () -> { - return 0; - }, "add", false), - new ModuleOption<>(0, "remove", new String[0], - (value) -> { - return true; - }, - () -> { - return 0; - }, "remove", false) - }; - } - - @Override - public String getSuggestion(String cmd, String[] args) { - if (args.length == 2 && args[1].equals("add")) { - return cmd + " " + Block.REGISTRY.getObjectById(7).getRegistryName().toString(); - } else if (args.length == 3 && args[1].equals("add")) { - if (args[2].isEmpty()) { - return cmd + Block.REGISTRY.getObjectById(7).getRegistryName().toString(); - } else { - String arg = args[2]; - for (Block b : Block.REGISTRY) { - String s = b.getRegistryName().toString(); - if (s.startsWith(arg)) { - return args[0] + " " + args[1] + " " + s; - } - } - - return ""; - } - } else if (args.length == 2 && args[1].equals("remove")) { - return cmd + " " + Block.REGISTRY.getObjectById(XrayTranslator.INSTANCE.target_blocks.iterator().nextInt()).getRegistryName(); - } else if (args.length == 3 && args[1].equals("remove")) { - if (args[2].isEmpty()) { - return cmd + Block.REGISTRY.getObjectById(XrayTranslator.INSTANCE.target_blocks.iterator().nextInt()).getRegistryName(); - } else { - String arg = args[2]; - for (Integer i : XrayTranslator.INSTANCE.target_blocks) { - String s = Block.REGISTRY.getObjectById(i).getRegistryName().toString(); - if (s.startsWith(arg)) { - return args[0] + " " + args[1] + " " + s; - } - } - - return ""; - } - } - - return super.getSuggestion(cmd, args); - } - - @Override - public void execute(String cmd, String[] args) { - if (args.length == 3 && !args[2].isEmpty() && cmd.startsWith(".xray add ")) { - String s = args[2].toLowerCase(); - try { - int id = Integer.parseInt(s); - Block block = Block.REGISTRY.getObjectById(id); - if (block == null) { - clientMessage("Not a valid block ID: " + PepsiUtils.COLOR_ESCAPE + "o" + args[2]); - } else { - XrayTranslator.INSTANCE.target_blocks.add(id); - clientMessage("Added " + PepsiUtils.COLOR_ESCAPE + "o" + block.getRegistryName().toString() + PepsiUtils.COLOR_ESCAPE + "r to the Xray list"); - if (this.state.enabled) { - mc.renderGlobal.loadRenderers(); - } - } - } catch (NumberFormatException e) { - if (s.contains(":") && !s.endsWith(":") && !s.startsWith(":")) { - String[] split = s.split(":"); - Block block = Block.REGISTRY.getObject(new ResourceLocation(split[0], split[1])); - if (block == null) { - clientMessage("Invalid id: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } else { - XrayTranslator.INSTANCE.target_blocks.add(((BlockID) block).getBlockId()); - clientMessage("Added " + PepsiUtils.COLOR_ESCAPE + "o" + block.getRegistryName().toString() + PepsiUtils.COLOR_ESCAPE + "r to the Xray list"); - if (this.state.enabled) { - mc.renderGlobal.loadRenderers(); - } - } - } else { - clientMessage("Invalid id: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } - } - return; - } else if (args.length == 3 && !args[2].isEmpty() && cmd.startsWith(".xray remove ")) { - String s = args[2].toLowerCase(); - try { - int id = Integer.parseInt(s); - if (XrayTranslator.INSTANCE.target_blocks.contains(id)) { - XrayTranslator.INSTANCE.target_blocks.remove((Integer) id); - clientMessage("Removed " + PepsiUtils.COLOR_ESCAPE + "o" + id + PepsiUtils.COLOR_ESCAPE + "r from the Xray list"); - if (this.state.enabled) { - mc.renderGlobal.loadRenderers(); - } - } else { - clientMessage("Block ID " + PepsiUtils.COLOR_ESCAPE + "o" + args[2] + PepsiUtils.COLOR_ESCAPE + "r is not on the Xray list!"); - } - } catch (NumberFormatException e) { - if (s.contains(":") && !s.endsWith(":") && !s.startsWith(":")) { - String[] split = s.split(":"); - Block block = Block.REGISTRY.getObject(new ResourceLocation(split[0], split[1])); - if (block == null) { - clientMessage("Invalid id: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } else { - int id = ((BlockID) block).getBlockId(); - if (XrayTranslator.INSTANCE.target_blocks.contains(id)) { - XrayTranslator.INSTANCE.target_blocks.remove(id); - clientMessage("Removed " + PepsiUtils.COLOR_ESCAPE + "o" + s + PepsiUtils.COLOR_ESCAPE + "r from the Xray list"); - if (this.state.enabled) { - mc.renderGlobal.loadRenderers(); - } - } else { - clientMessage("Block ID " + PepsiUtils.COLOR_ESCAPE + "o" + s + PepsiUtils.COLOR_ESCAPE + "r is not on the Xray list!"); - } - } - } else { - clientMessage("Invalid id: " + PepsiUtils.COLOR_ESCAPE + "o" + s); - } - } - return; - } - - super.execute(cmd, args); - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/module/impl/render/ZoomMod.java b/src/main/java/net/daporkchop/pepsimod/module/impl/render/ZoomMod.java deleted file mode 100644 index 0add836..0000000 --- a/src/main/java/net/daporkchop/pepsimod/module/impl/render/ZoomMod.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.module.impl.render; - -import net.daporkchop.pepsimod.module.ModuleCategory; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleLaunchState; -import net.daporkchop.pepsimod.module.api.ModuleOption; - -public class ZoomMod extends Module { - public static ZoomMod INSTANCE; - public float fov = -1f; - - { - INSTANCE = this; - } - - public ZoomMod(int key) { - super(false, "Zoom", key, true); - } - - @Override - public void onEnable() { - if (this.fov == -1f || mc.gameSettings.fovSetting == this.fov) { - this.fov = mc.gameSettings.fovSetting; - } - } - - @Override - public void onDisable() { - - } - - @Override - public void tick() { - if (this.state.enabled) { - if (mc.gameSettings.fovSetting > 12f) { - for (int i = 0; i < 100; i++) { - if (mc.gameSettings.fovSetting > 12f) { - mc.gameSettings.fovSetting -= 0.1f; - } - } - } - } else if (mc.gameSettings.fovSetting < this.fov) { - for (int i = 0; i < 100; i++) { - mc.gameSettings.fovSetting += 0.1F; - } - } - } - - @Override - public void init() { - - } - - @Override - public ModuleOption[] getDefaultOptions() { - return new ModuleOption[0]; - } - - @Override - public boolean shouldTick() { - return true; - } - - public ModuleCategory getCategory() { - return ModuleCategory.RENDER; - } - - @Override - public ModuleLaunchState getLaunchState() { - return ModuleLaunchState.DISABLED; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/optimization/BlockID.java b/src/main/java/net/daporkchop/pepsimod/optimization/BlockID.java deleted file mode 100644 index 0c62b2d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/optimization/BlockID.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.optimization; - -import net.minecraft.block.Block; - -import java.util.ArrayList; -import java.util.List; - -/** - * Injected into {@link net.minecraft.block.Block} at runtime for fast access to block IDs. - * - * @author DaPorkchop_ - */ -public interface BlockID { - /** - * A lookup table of block IDs to block instances. - */ - List BLOCK_LOOKUP = new ArrayList<>(); //basically as fast as it gets - - /** - * Gets the numeric ID of this block. - * - * @return this block's ID - */ - int getBlockId(); - - /** - * Sets the cached numeric ID of this block. - *

- * Only used internally, don't touch! - * - * @param id the new ID - */ - void internal_setBlockId(int id); -} diff --git a/src/main/java/net/daporkchop/pepsimod/optimization/OverrideCounter.java b/src/main/java/net/daporkchop/pepsimod/optimization/OverrideCounter.java deleted file mode 100644 index faeb8ad..0000000 --- a/src/main/java/net/daporkchop/pepsimod/optimization/OverrideCounter.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.optimization; - -/** - * @author DaPorkchop_ - */ -public interface OverrideCounter { - void incrementOverride(); - - void decrementOverride(); - - int getOverride(); - - default boolean isOverriden() { - return this.getOverride() > 0; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/optimization/SizeSettable.java b/src/main/java/net/daporkchop/pepsimod/optimization/SizeSettable.java deleted file mode 100644 index b3a52ef..0000000 --- a/src/main/java/net/daporkchop/pepsimod/optimization/SizeSettable.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.optimization; - -/** - * @author DaPorkchop_ - */ -public interface SizeSettable { - void forceSetSize(float width, float height); -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/BlockUtils.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/BlockUtils.java deleted file mode 100644 index bfe57bd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/BlockUtils.java +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import com.google.common.collect.AbstractIterator; -import net.daporkchop.pepsimod.util.ReflectionStuff; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.network.play.client.CPacketPlayerDigging; -import net.minecraft.network.play.client.CPacketPlayerDigging.Action; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.HashSet; - -public class BlockUtils { - private static final Minecraft mc = Minecraft.getMinecraft(); - - public static boolean placeBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - BlockPos neighbor = pos.offset(side); - - // check if neighbor can be right clicked - if (!WBlock.canBeClicked(neighbor)) { - continue; - } - - Vec3d dirVec = new Vec3d(side.getDirectionVec()); - Vec3d hitVec = posVec.add(dirVec.scale(0.5)); - - // check if hitVec is within range (4.25 blocks) - if (eyesPos.squareDistanceTo(hitVec) > 18.0625) { - continue; - } - - // check if side is visible (facing away from player) - if (distanceSqPosVec > eyesPos.squareDistanceTo(posVec.add(dirVec))) { - continue; - } - - // check line of sight - if (mc.world.rayTraceBlocks(eyesPos, hitVec, false, - true, false) != null) { - continue; - } - - // face block - RotationUtils.faceVectorPacketInstant(hitVec); - - // place block - WPlayerController.processRightClickBlock(neighbor, side.getOpposite(), hitVec); - WPlayer.swingArmClient(); - ReflectionStuff.setRightClickDelayTimer(4); - - return true; - } - - return false; - } - - public static boolean placeBlockScaffold(BlockPos pos) { - Vec3d eyesPos = new Vec3d(mc.player.posX, mc.player.posY + mc.player.getEyeHeight(), mc.player.posZ); - - for (EnumFacing side : EnumFacing.values()) { - BlockPos neighbor = pos.offset(side); - EnumFacing side2 = side.getOpposite(); - - // check if side is visible (facing away from player) - if (eyesPos.squareDistanceTo( - new Vec3d(pos).add(0.5, 0.5, 0.5)) >= eyesPos - .squareDistanceTo( - new Vec3d(neighbor).add(0.5, 0.5, 0.5))) { - continue; - } - - // check if neighbor can be right clicked - if (!WBlock.canBeClicked(neighbor)) { - continue; - } - - Vec3d hitVec = new Vec3d(neighbor).add(0.5, 0.5, 0.5) - .add(new Vec3d(side2.getDirectionVec()).scale(0.5)); - - // check if hitVec is within range (4.25 blocks) - if (eyesPos.squareDistanceTo(hitVec) > 18.0625) { - continue; - } - - // place block - RotationUtils.faceVectorPacketInstant(hitVec); - WPlayerController.processRightClickBlock(neighbor, side2, hitVec); - WPlayer.swingArmClient(); - ReflectionStuff.setRightClickDelayTimer(4); - - return true; - } - - return false; - } - - public static boolean placeBlockSimple(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - - for (EnumFacing side : EnumFacing.values()) { - BlockPos neighbor = pos.offset(side); - - // check if neighbor can be right clicked - if (!WBlock.canBeClicked(neighbor)) { - continue; - } - - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - - // check if hitVec is within range (6 blocks) - if (eyesPos.squareDistanceTo(hitVec) > 36) { - continue; - } - - // place block - WPlayerController.processRightClickBlock(neighbor, - side.getOpposite(), hitVec); - - return true; - } - - return false; - } - - public static boolean prepareToBreakBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (4.25 blocks) - if (distanceSqHitVec > 18.0625) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // check line of sight - if (mc.world.rayTraceBlocks(eyesPos, hitVec, false, - true, false) != null) { - continue; - } - - // face block - if (!RotationUtils.faceVectorPacket(hitVec)) { - return true; - } - - return true; - } - - return false; - } - - public static boolean breakBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (4.25 blocks) - if (distanceSqHitVec > 18.0625) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // check line of sight - if (mc.world.rayTraceBlocks(eyesPos, hitVec, false, - true, false) != null) { - continue; - } - - // damage block - if (!mc.playerController.onPlayerDamageBlock(pos, side)) { - return false; - } - - // swing arm - WPlayer.swingArmPacket(); - - return true; - } - - return false; - } - - public static boolean breakBlockExtraLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (4.25 blocks) - if (distanceSqHitVec > 18.0625) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // check line of sight - if (mc.world.rayTraceBlocks(eyesPos, hitVec, false, - true, false) != null) { - continue; - } - - // face block - if (!RotationUtils.faceVectorClient(hitVec)) { - return true; - } - - // if attack key is down but nothing happens, release it for one - // tick - if (mc.gameSettings.keyBindAttack.isPressed() - && !mc.playerController.getIsHittingBlock()) { - ReflectionStuff.setPressed(mc.gameSettings.keyBindAttack, false); - return true; - } - - // damage block - ReflectionStuff.setPressed(mc.gameSettings.keyBindAttack, true); - - return true; - } - - return false; - } - - public static boolean breakBlockSimple(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (6 blocks) - if (distanceSqHitVec > 36) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // face block - RotationUtils.faceVectorPacket(hitVec); - - // damage block - if (!mc.playerController.onPlayerDamageBlock(pos, side)) { - return false; - } - - // swing arm - WPlayer.swingArmPacket(); - - return true; - } - - return false; - } - - public static void breakBlockPacketSpam(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - - // check if side is facing towards player - if (eyesPos.squareDistanceTo(hitVec) >= distanceSqPosVec) { - continue; - } - - // break block - mc.player.connection.sendPacket(new CPacketPlayerDigging( - Action.START_DESTROY_BLOCK, pos, side)); - mc.player.connection.sendPacket( - new CPacketPlayerDigging(Action.STOP_DESTROY_BLOCK, pos, side)); - - return; - } - } - - public static boolean rightClickBlockLegit(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (4.25 blocks) - if (distanceSqHitVec > 18.0625) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // check line of sight - if (mc.world.rayTraceBlocks(eyesPos, hitVec, false, - true, false) != null) { - continue; - } - - // face block - if (!RotationUtils.faceVectorPacket(hitVec)) { - return true; - } - - // place block - WPlayerController.processRightClickBlock(pos, side, hitVec); - WPlayer.swingArmClient(); - ReflectionStuff.setRightClickDelayTimer(4); - - return true; - } - - return false; - } - - public static boolean rightClickBlockSimple(BlockPos pos) { - Vec3d eyesPos = RotationUtils.getEyesPos(); - Vec3d posVec = new Vec3d(pos).add(0.5, 0.5, 0.5); - double distanceSqPosVec = eyesPos.squareDistanceTo(posVec); - - for (EnumFacing side : EnumFacing.values()) { - Vec3d hitVec = - posVec.add(new Vec3d(side.getDirectionVec()).scale(0.5)); - double distanceSqHitVec = eyesPos.squareDistanceTo(hitVec); - - // check if hitVec is within range (6 blocks) - if (distanceSqHitVec > 36) { - continue; - } - - // check if side is facing towards player - if (distanceSqHitVec >= distanceSqPosVec) { - continue; - } - - // place block - WPlayerController.processRightClickBlock(pos, side, hitVec); - - return true; - } - - return false; - } - - public static Iterable getValidBlocksByDistance(double range, boolean ignoreVisibility, BlockValidator validator) { - // prepare range check - Vec3d eyesPos = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5); - double rangeSq = Math.pow(range + 0.5, 2); - - // set start pos - BlockPos startPos = new BlockPos(RotationUtils.getEyesPos()); - - return () -> new AbstractIterator() { - // initialize queue - private ArrayDeque queue = - new ArrayDeque<>(Arrays.asList(startPos)); - private HashSet visited = new HashSet<>(); - - @Override - protected BlockPos computeNext() { - // find block using breadth first search - while (!this.queue.isEmpty()) { - BlockPos current = this.queue.pop(); - - // check range - if (eyesPos.squareDistanceTo(new Vec3d(current)) > rangeSq) { - continue; - } - - boolean canBeClicked = WBlock.canBeClicked(current); - - if (ignoreVisibility || !canBeClicked) - // add neighbors - { - for (EnumFacing facing : EnumFacing.values()) { - BlockPos next = current.offset(facing); - - if (this.visited.contains(next)) { - continue; - } - - this.queue.add(next); - this.visited.add(next); - } - } - - // check if block is valid - if (canBeClicked && validator.isValid(current)) { - return current; - } - } - - return this.endOfData(); - } - }; - } - - public static Iterable getValidBlocksByDistanceReversed( - double range, boolean ignoreVisibility, BlockValidator validator) { - ArrayDeque validBlocks = new ArrayDeque<>(); - - BlockUtils.getValidBlocksByDistance(range, ignoreVisibility, validator) - .forEach(validBlocks::push); - - return validBlocks; - } - - public static Iterable getValidBlocks(double range, - BlockValidator validator) { - // prepare range check - Vec3d eyesPos = RotationUtils.getEyesPos().subtract(0.5, 0.5, 0.5); - double rangeSq = Math.pow(range + 0.5, 2); - - return getValidBlocks((int) Math.ceil(range), (pos) -> { - - // check range - if (eyesPos.squareDistanceTo(new Vec3d(pos)) > rangeSq) { - return false; - } - - // check if block is valid - return validator.isValid(pos); - }); - } - - public static Iterable getValidBlocks(int blockRange, - BlockValidator validator) { - BlockPos playerPos = new BlockPos(RotationUtils.getEyesPos()); - - BlockPos min = playerPos.add(-blockRange, -blockRange, -blockRange); - BlockPos max = playerPos.add(blockRange, blockRange, blockRange); - - return () -> new AbstractIterator() { - private BlockPos last; - - private BlockPos computeNextUnchecked() { - if (this.last == null) { - this.last = min; - return this.last; - } - - int x = this.last.getX(); - int y = this.last.getY(); - int z = this.last.getZ(); - - if (z < max.getZ()) { - z++; - } else if (x < max.getX()) { - z = min.getZ(); - x++; - } else if (y < max.getY()) { - z = min.getZ(); - x = min.getX(); - y++; - } else { - return null; - } - - this.last = new BlockPos(x, y, z); - return this.last; - } - - @Override - protected BlockPos computeNext() { - BlockPos pos; - while ((pos = this.computeNextUnchecked()) != null) { - // skip air blocks - if (WBlock.getMaterial(pos) == Material.AIR) { - continue; - } - - // check if block is valid - if (!validator.isValid(pos)) { - continue; - } - - return pos; - } - - return this.endOfData(); - } - }; - } - - public interface BlockValidator { - boolean isValid(BlockPos pos); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/EntityUtils.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/EntityUtils.java deleted file mode 100644 index 027aa0a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/EntityUtils.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.daporkchop.pepsimod.util.config.impl.TargettingTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.EntityFlying; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityGolem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.entity.passive.EntityAmbientCreature; -import net.minecraft.entity.passive.EntityWaterMob; -import net.minecraft.entity.player.EntityPlayer; - -import java.util.ArrayList; - -public class EntityUtils extends PepsiConstants { - public static final TargetSettings DEFAULT_SETTINGS = new TargetSettings(); - public static final String[] colors = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; - - public static boolean isCorrectEntity(Entity en, TargetSettings settings) { - // non-entities - if (en == null) { - return false; - } - - // dead entities - if (en instanceof EntityLivingBase && (((EntityLivingBase) en).isDead || ((EntityLivingBase) en).getHealth() <= 0)) { - return false; - } - - // entities outside the range - if (mc.player.getDistance(en) > settings.getRange()) { - return false; - } - - // entities outside the FOV - if (settings.getFOV() < 360F && RotationUtils.getAngleToClientRotation(PepsiUtils.adjustVectorForBone(en.getEntityBoundingBox().getCenter(), en, settings.getTargetBone())) > settings.getFOV() / 2F) { - return false; - } - - // entities behind walls - if (!settings.targetBehindWalls() && !PepsiUtils.canEntityBeSeen(en, mc.player, settings.getTargetBone())) { - return false; - } - - // friends - if (!settings.targetFriends() && FriendsTranslator.INSTANCE.isFriend(en)) { - return false; - } - - // players - if (en instanceof EntityPlayer) { - // normal players - if (!settings.targetPlayers()) { - if (!((EntityPlayer) en).isPlayerSleeping() && !en.isInvisible()) { - return false; - } - - // sleeping players - } else if (!settings.targetSleepingPlayers()) { - if (((EntityPlayer) en).isPlayerSleeping()) { - return false; - } - - // invisible players - } else if (!settings.targetInvisiblePlayers()) { - if (en.isInvisible()) { - return false; - } - } - - // team players - if (settings.targetTeams() && !checkName( - en.getDisplayName().getFormattedText(), - settings.getTeamColors())) { - return false; - } - - // the user - if (en == mc.player) { - return false; - } - - // Freecam entity - if (en.getName() - .equals(mc.player.getName())) { - return false; - } - - // mobs - } else if (en instanceof EntityLiving) { - // invisible mobs - if (en.isInvisible()) { - if (!settings.targetInvisibleMobs()) { - return false; - } - - // animals - } else if (en instanceof EntityAgeable - || en instanceof EntityAmbientCreature - || en instanceof EntityWaterMob) { - if (!settings.targetAnimals()) { - return false; - } - - // monsters - } else if (en instanceof EntityMob || en instanceof EntitySlime - || en instanceof EntityFlying) { - if (!settings.targetMonsters()) { - return false; - } - - // golems - } else if (en instanceof EntityGolem) { - if (!settings.targetGolems()) { - return false; - } - - // other mobs - } else { - return false; - } - - // team mobs - if (settings.targetTeams() && en.hasCustomName() - && !checkName(en.getCustomNameTag(), - settings.getTeamColors())) { - return false; - } - - // other entities - } else { - return false; - } - - return true; - } - - private static boolean checkName(String name, boolean[] teamColors) { - // check colors - boolean hasKnownColor = false; - for (int i = 0; i < 16; i++) { - if (name.contains('\u00A7' + colors[i])) { - hasKnownColor = true; - if (teamColors[i]) { - return true; - } - } - } - - // no known color => white - return !hasKnownColor && teamColors[15]; - } - - public static ArrayList getValidEntities(TargetSettings settings) { - ArrayList validEntities = new ArrayList<>(); - - for (Entity entity : mc.world.loadedEntityList) { - if (isCorrectEntity(entity, settings)) { - validEntities.add(entity); - } - - if (validEntities.size() >= 64) { - break; - } - } - - return validEntities; - } - - public static Entity getClosestEntity(TargetSettings settings) { - Entity closestEntity = null; - - for (Entity entity : mc.world.loadedEntityList) { - if (isCorrectEntity(entity, settings) - && (closestEntity == null || mc.player - .getDistance(entity) < mc.player - .getDistance(closestEntity))) { - closestEntity = entity; - } - } - - return closestEntity; - } - - public static Entity getBestEntityToAttack(TargetSettings settings) { - Entity bestEntity = null; - float bestAngle = Float.POSITIVE_INFINITY; - - for (Entity entity : mc.world.loadedEntityList) { - if (!isCorrectEntity(entity, settings)) { - continue; - } - - float angle = RotationUtils.getAngleToServerRotation(PepsiUtils.adjustVectorForBone(entity.getEntityBoundingBox().getCenter(), entity, settings.getTargetBone())); - - if (angle < bestAngle) { - bestEntity = entity; - bestAngle = angle; - } - } - - return bestEntity; - } - - public static Entity getClosestEntityOtherThan(Entity otherEntity, - TargetSettings settings) { - Entity closestEnemy = null; - - for (Entity entity : mc.world.loadedEntityList) { - if (isCorrectEntity(entity, settings) && entity != otherEntity - && (closestEnemy == null || mc.player - .getDistance(entity) < mc.player - .getDistance(closestEnemy))) { - closestEnemy = entity; - } - } - - return closestEnemy; - } - - public static Entity getClosestEntityWithName(String name, - TargetSettings settings) { - Entity closestEntity = null; - - for (Entity entity : mc.world.loadedEntityList) { - if (!isCorrectEntity(entity, settings)) { - continue; - } - if (!entity.getName().equalsIgnoreCase(name)) { - continue; - } - - if (closestEntity == null || mc.player - .getDistanceSq(entity) < mc.player - .getDistanceSq(closestEntity)) { - closestEntity = entity; - } - } - - return closestEntity; - } - - public static class TargetSettings { - public static final boolean[] team_colors = {true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true}; - - public boolean targetFriends() { - return TargettingTranslator.INSTANCE.friends; - } - - public boolean targetBehindWalls() { - return TargettingTranslator.INSTANCE.through_walls; - } - - public float getRange() { - return TargettingTranslator.INSTANCE.reach; - } - - public float getFOV() { - return TargettingTranslator.INSTANCE.fov; - } - - public boolean targetPlayers() { - return TargettingTranslator.INSTANCE.players; - } - - public boolean targetAnimals() { - return TargettingTranslator.INSTANCE.animals; - } - - public boolean targetMonsters() { - return TargettingTranslator.INSTANCE.monsters; - } - - public boolean targetGolems() { - return TargettingTranslator.INSTANCE.golems; - } - - public boolean targetSleepingPlayers() { - return TargettingTranslator.INSTANCE.sleeping; - } - - public boolean targetInvisiblePlayers() { - return TargettingTranslator.INSTANCE.players && TargettingTranslator.INSTANCE.invisible; - } - - public boolean targetInvisibleMobs() { - return TargettingTranslator.INSTANCE.monsters && TargettingTranslator.INSTANCE.invisible; - } - - public boolean targetTeams() { - return TargettingTranslator.INSTANCE.teams; - } - - public boolean[] getTeamColors() { - return team_colors; - } - - public TargettingTranslator.TargetBone getTargetBone() { - return TargettingTranslator.INSTANCE.targetBone; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RenderUtils.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RenderUtils.java deleted file mode 100644 index 8588b51..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RenderUtils.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.util.math.AxisAlignedBB; - -import java.awt.Color; - -import static org.lwjgl.opengl.GL11.*; - -public class RenderUtils { - private static final AxisAlignedBB DEFAULT_AABB = - new AxisAlignedBB(0, 0, 0, 1, 1, 1); - - public static void scissorBox(int x, int y, int xend, int yend) { - int width = xend - x; - int height = yend - y; - ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft()); - int factor = sr.getScaleFactor(); - int bottomY = Minecraft.getMinecraft().currentScreen.height - yend; - glScissor(x * factor, bottomY * factor, width * factor, - height * factor); - } - - public static void setColor(Color c) { - glColor4f(c.getRed() / 255f, c.getGreen() / 255f, c.getBlue() / 255f, - c.getAlpha() / 255f); - } - - public static void drawSolidBox() { - drawSolidBox(DEFAULT_AABB); - } - - public static void drawSolidBox(AxisAlignedBB bb) { - glBegin(GL_QUADS); - { - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.minY, bb.maxZ); - - glVertex3d(bb.minX, bb.maxY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.minY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - } - glEnd(); - } - - public static void drawOutlinedBox() { - drawOutlinedBox(DEFAULT_AABB); - } - - public static void drawOutlinedBox(AxisAlignedBB bb) { - glBegin(GL_LINES); - { - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.minY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.minY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.minY, bb.minZ); - - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - } - glEnd(); - } - - public static void drawCrossBox() { - drawOutlinedBox(DEFAULT_AABB); - } - - public static void drawCrossBox(AxisAlignedBB bb) { - glBegin(GL_LINES); - { - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.minZ); - - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - - glVertex3d(bb.minX, bb.minY, bb.maxZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.minX, bb.maxY, bb.minZ); - glVertex3d(bb.maxX, bb.maxY, bb.maxZ); - - glVertex3d(bb.maxX, bb.maxY, bb.minZ); - glVertex3d(bb.minX, bb.maxY, bb.maxZ); - - glVertex3d(bb.maxX, bb.minY, bb.minZ); - glVertex3d(bb.minX, bb.minY, bb.maxZ); - - glVertex3d(bb.maxX, bb.minY, bb.maxZ); - glVertex3d(bb.minX, bb.minY, bb.minZ); - } - glEnd(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RotationUtils.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RotationUtils.java deleted file mode 100644 index c0f634c..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/RotationUtils.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.minecraft.entity.Entity; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -public class RotationUtils extends PepsiConstants { - private static boolean fakeRotation; - private static float serverYaw; - private static float serverPitch; - - public static Vec3d getEyesPos() { - return new Vec3d(mc.player.posX, - mc.player.posY + mc.player.getEyeHeight(), - mc.player.posZ); - } - - public static Vec3d getClientLookVec() { - float f = MathHelper.cos(-mc.player.rotationYaw * 0.017453292F - - (float) Math.PI); - float f1 = MathHelper.sin(-mc.player.rotationYaw * 0.017453292F - - (float) Math.PI); - float f2 = - -MathHelper.cos(-mc.player.rotationPitch * 0.017453292F); - float f3 = - MathHelper.sin(-mc.player.rotationPitch * 0.017453292F); - return new Vec3d(f1 * f2, f3 + mc.player.getEyeHeight(), f * f2); - } - - public static Vec3d getServerLookVec() { - float f = MathHelper.cos(-serverYaw * 0.017453292F - (float) Math.PI); - float f1 = MathHelper.sin(-serverYaw * 0.017453292F - (float) Math.PI); - float f2 = -MathHelper.cos(-serverPitch * 0.017453292F); - float f3 = MathHelper.sin(-serverPitch * 0.017453292F); - return new Vec3d(f1 * f2, f3, f * f2); - } - - private static float[] getNeededRotations(Vec3d vec) { - Vec3d eyesPos = getEyesPos(); - - double diffX = vec.x - eyesPos.x; - double diffY = vec.y - eyesPos.y; - double diffZ = vec.z - eyesPos.z; - - double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ); - - float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90F; - float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ)); - - return new float[]{MathHelper.wrapDegrees(yaw), MathHelper.wrapDegrees(pitch)}; - } - - private static float[] getNeededRotations2(Vec3d vec) { - Vec3d eyesPos = getEyesPos(); - - double diffX = vec.x - eyesPos.x; - double diffY = vec.y - eyesPos.y; - double diffZ = vec.z - eyesPos.z; - - double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ); - - float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90F; - float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ)); - - return new float[]{ - mc.player.rotationYaw - + MathHelper.wrapDegrees(yaw - mc.player.rotationYaw), - mc.player.rotationPitch + MathHelper - .wrapDegrees(pitch - mc.player.rotationPitch)}; - } - - public static float limitAngleChange(float current, float intended, - float maxChange) { - float change = MathHelper.wrapDegrees(intended - current); - - change = MathHelper.clamp(change, -maxChange, maxChange); - - return MathHelper.wrapDegrees(current + change); - } - - public static boolean faceVectorPacket(Vec3d vec) { - // use fake rotation in next packet - fakeRotation = true; - - float[] rotations = getNeededRotations(vec); - - serverYaw = rotations[0]; - serverPitch = MathHelper.normalizeAngle((int) rotations[1], 360); - - return Math.abs(serverYaw - rotations[0]) < 1F; - } - - public static void faceVectorPacketInstant(Vec3d vec) { - float[] rotations = getNeededRotations2(vec); - - mc.getConnection().sendPacket(new CPacketPlayer.Rotation(rotations[0], - MathHelper.normalizeAngle((int) rotations[1], 360), mc.player.onGround)); - } - - public static boolean faceVectorClient(Vec3d vec) { - float[] rotations = getNeededRotations(vec); - - float oldYaw = mc.player.prevRotationYaw; - float oldPitch = mc.player.prevRotationPitch; - - mc.player.rotationYaw = rotations[0]; - mc.player.rotationPitch = MathHelper.normalizeAngle((int) rotations[1], 360); - - return Math.abs(oldYaw - rotations[0]) - + Math.abs(oldPitch - rotations[1]) < 1F; - } - - - public static boolean faceEntityClient(Entity entity) { - // get position & rotation - Vec3d eyesPos = getEyesPos(); - Vec3d lookVec = getServerLookVec(); - - // try to face center of boundingBox - AxisAlignedBB bb = entity.getEntityBoundingBox(); - if (faceVectorClient(PepsiUtils.adjustVectorForBone(bb.getCenter(), entity, EntityUtils.DEFAULT_SETTINGS.getTargetBone()))) { - return true; - } - - // if not facing center, check if facing anything in boundingBox - return bb.calculateIntercept(eyesPos, - eyesPos.add(lookVec.scale(6))) != null; - } - - public static boolean faceEntityPacket(Entity entity) { - // get position & rotation - Vec3d eyesPos = getEyesPos(); - Vec3d lookVec = getServerLookVec(); - - // try to face center of boundingBox - AxisAlignedBB bb = entity.getEntityBoundingBox(); - if (faceVectorPacket(PepsiUtils.adjustVectorForBone(bb.getCenter(), entity, EntityUtils.DEFAULT_SETTINGS.getTargetBone()))) { - return true; - } - - // if not facing center, check if facing anything in boundingBox - return bb.calculateIntercept(eyesPos, - eyesPos.add(lookVec.scale(6))) != null; - } - - public static boolean faceVectorForWalking(Vec3d vec) { - float[] rotations = getNeededRotations(vec); - - float oldYaw = mc.player.prevRotationYaw; - - mc.player.rotationYaw = MathHelper.normalizeAngle((int) rotations[0], 360); - - return Math.abs(oldYaw - rotations[0]) < 1F; - } - - public static float getAngleToClientRotation(Vec3d vec) { - float[] needed = getNeededRotations(vec); - - float diffYaw = - MathHelper.wrapDegrees(mc.player.rotationYaw) - needed[0]; - float diffPitch = - MathHelper.wrapDegrees(mc.player.rotationPitch) - needed[1]; - - float angle = - (float) Math.sqrt(diffYaw * diffYaw + diffPitch * diffPitch); - - return angle; - } - - public static float getHorizontalAngleToClientRotation(Vec3d vec) { - float[] needed = getNeededRotations(vec); - - float angle = - MathHelper.wrapDegrees(mc.player.rotationYaw) - needed[0]; - - return angle; - } - - public static float getAngleToServerRotation(Vec3d vec) { - float[] needed = getNeededRotations(vec); - - float diffYaw = serverYaw - needed[0]; - float diffPitch = serverPitch - needed[1]; - - float angle = - (float) Math.sqrt(diffYaw * diffYaw + diffPitch * diffPitch); - - return angle; - } - - public static void updateServerRotation() { - // disable fake rotation in next packet unless manually enabled again - if (fakeRotation) { - fakeRotation = false; - return; - } - - // slowly synchronize server rotation with client - serverYaw = limitAngleChange(serverYaw, mc.player.rotationYaw, 30); - serverPitch = mc.player.rotationPitch; - } - - public static float getServerYaw() { - return serverYaw; - } - - public static float getServerPitch() { - return serverPitch; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WBlock.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WBlock.java deleted file mode 100644 index d2553e0..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WBlock.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; - -public class WBlock extends PepsiConstants { - public static IBlockState getState(BlockPos pos) { - return mc.world.getBlockState(pos); - } - - public static Block getBlock(BlockPos pos) { - return getState(pos).getBlock(); - } - - public static int getId(BlockPos pos) { - return Block.getIdFromBlock(getBlock(pos)); - } - - public static String getName(Block block) { - return "" + Block.REGISTRY.getNameForObject(block); - } - - public static Material getMaterial(BlockPos pos) { - return getState(pos).getMaterial(); - } - - public static AxisAlignedBB getBoundingBox(BlockPos pos) { - return getState(pos).getBoundingBox(mc.world, pos).offset(pos); - } - - public static boolean canBeClicked(BlockPos pos) { - return getBlock(pos).canCollideCheck(getState(pos), false); - } - - public static float getHardness(BlockPos pos) { - return getState(pos).getPlayerRelativeBlockHardness(mc.player, mc.world, pos); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayer.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayer.java deleted file mode 100644 index 2762154..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.Entity; -import net.minecraft.network.play.client.CPacketAnimation; -import net.minecraft.network.play.client.CPacketUseEntity; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumHand; - -public class WPlayer extends PepsiConstants { - public static void swingArmClient() { - mc.player.swingArm(EnumHand.MAIN_HAND); - } - - public static void swingArmPacket() { - mc.player.connection.sendPacket(new CPacketAnimation(EnumHand.MAIN_HAND)); - } - - public static void attackEntity(Entity entity) { - Minecraft.getMinecraft().playerController.attackEntity(mc.player, entity); - swingArmClient(); - } - - public static void sendAttackPacket(Entity entity) { - mc.player.connection.sendPacket(new CPacketUseEntity(entity, EnumHand.MAIN_HAND)); - } - - public static float getCooldown() { - return mc.player.getCooledAttackStrength(0); - } - - public static void addPotionEffect(Potion potion) { - mc.player - .addPotionEffect(new PotionEffect(potion, 10801220)); - } - - public static void removePotionEffect(Potion potion) { - mc.player.removePotionEffect(potion); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayerController.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayerController.java deleted file mode 100644 index 2ae3083..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/WPlayerController.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.the.wurst.pkg.name; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.PlayerControllerMP; -import net.minecraft.inventory.ClickType; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -public class WPlayerController extends PepsiConstants { - private static PlayerControllerMP getPlayerController() { - return Minecraft.getMinecraft().playerController; - } - - public static ItemStack windowClick_PICKUP(int slot) { - return getPlayerController().windowClick(0, slot, 0, ClickType.PICKUP, mc.player); - } - - public static ItemStack windowClick_QUICK_MOVE(int slot) { - return getPlayerController().windowClick(0, slot, 0, ClickType.QUICK_MOVE, mc.player); - } - - public static ItemStack windowClick_THROW(int slot) { - return getPlayerController().windowClick(0, slot, 1, ClickType.THROW, - mc.player); - } - - public static void processRightClick() { - getPlayerController().processRightClick(mc.player, - mc.world, EnumHand.MAIN_HAND); - } - - public static void processRightClickBlock(BlockPos pos, EnumFacing side, Vec3d hitVec) { - getPlayerController().processRightClickBlock(mc.player, - mc.world, pos, side, hitVec, EnumHand.MAIN_HAND); - } -} - diff --git a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/package-info.java b/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/package-info.java deleted file mode 100644 index 9d6469b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/the/wurst/pkg/name/package-info.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/** - * This package contains classes that were definitely not skidded from Wurst - * (((((wait, what am i talking about?))))) - *

- * In the VERY UNLIKELY case that this entire package WAS skidded from Wurst, this package is also distributed under the Mozilla Public Liscense 2.0 - * the header is simply there because my IDE keeps adding it back and i don't think i can exclude packages to add copy-rights to - * anyway, the MPE2 is as follows: - *

- * Mozilla Public License Version 2.0 - * ================================== - *

- * 1. Definitions - * -------------- - *

- * 1.1. "Contributor" - * means each individual or legal entity that creates, contributes to - * the creation of, or owns Covered Software. - *

- * 1.2. "Contributor Version" - * means the combination of the Contributions of others (if any) used - * by a Contributor and that particular Contributor's Contribution. - *

- * 1.3. "Contribution" - * means Covered Software of a particular Contributor. - *

- * 1.4. "Covered Software" - * means Source Code Form to which the initial Contributor has attached - * the notice in Exhibit A, the Executable Form of such Source Code - * Form, and Modifications of such Source Code Form, in each case - * including portions thereof. - *

- * 1.5. "Incompatible With Secondary Licenses" - * means - *

- * (a) that the initial Contributor has attached the notice described - * in Exhibit B to the Covered Software; or - *

- * (b) that the Covered Software was made available under the terms of - * version 1.1 or earlier of the License, but not also under the - * terms of a Secondary License. - *

- * 1.6. "Executable Form" - * means any form of the work other than Source Code Form. - *

- * 1.7. "Larger Work" - * means a work that combines Covered Software with other material, in - * a separate file or files, that is not Covered Software. - *

- * 1.8. "License" - * means this document. - *

- * 1.9. "Licensable" - * means having the right to grant, to the maximum extent possible, - * whether at the time of the initial grant or subsequently, any and - * all of the rights conveyed by this License. - *

- * 1.10. "Modifications" - * means any of the following: - *

- * (a) any file in Source Code Form that results from an addition to, - * deletion from, or modification of the contents of Covered - * Software; or - *

- * (b) any new file in Source Code Form that contains any Covered - * Software. - *

- * 1.11. "Patent Claims" of a Contributor - * means any patent claim(s), including without limitation, method, - * process, and apparatus claims, in any patent Licensable by such - * Contributor that would be infringed, but for the grant of the - * License, by the making, using, selling, offering for sale, having - * made, import, or transfer of either its Contributions or its - * Contributor Version. - *

- * 1.12. "Secondary License" - * means either the GNU General Public License, Version 2.0, the GNU - * Lesser General Public License, Version 2.1, the GNU Affero General - * Public License, Version 3.0, or any later versions of those - * licenses. - *

- * 1.13. "Source Code Form" - * means the form of the work preferred for making modifications. - *

- * 1.14. "You" (or "Your") - * means an individual or a legal entity exercising rights under this - * License. For legal entities, "You" includes any entity that - * controls, is controlled by, or is under common control with You. For - * purposes of this definition, "control" means (a) the power, direct - * or indirect, to cause the direction or management of such entity, - * whether by contract or otherwise, or (b) ownership of more than - * fifty percent (50%) of the outstanding shares or beneficial - * ownership of such entity. - *

- * 2. License Grants and Conditions - * -------------------------------- - *

- * 2.1. Grants - *

- * Each Contributor hereby grants You a world-wide, royalty-free, - * non-exclusive license: - *

- * (a) under intellectual property rights (other than patent or trademark) - * Licensable by such Contributor to use, reproduce, make available, - * modify, display, perform, distribute, and otherwise exploit its - * Contributions, either on an unmodified basis, with Modifications, or - * as part of a Larger Work; and - *

- * (b) under Patent Claims of such Contributor to make, use, sell, offer - * for sale, have made, import, and otherwise transfer either its - * Contributions or its Contributor Version. - *

- * 2.2. Effective Date - *

- * The licenses granted in Section 2.1 with respect to any Contribution - * become effective for each Contribution on the date the Contributor first - * distributes such Contribution. - *

- * 2.3. Limitations on Grant Scope - *

- * The licenses granted in this Section 2 are the only rights granted under - * this License. No additional rights or licenses will be implied from the - * distribution or licensing of Covered Software under this License. - * Notwithstanding Section 2.1(b) above, no patent license is granted by a - * Contributor: - *

- * (a) for any code that a Contributor has removed from Covered Software; - * or - *

- * (b) for infringements caused by: (i) Your and any other third party's - * modifications of Covered Software, or (ii) the combination of its - * Contributions with other software (except as part of its Contributor - * Version); or - *

- * (c) under Patent Claims infringed by Covered Software in the absence of - * its Contributions. - *

- * This License does not grant any rights in the trademarks, service marks, - * or logos of any Contributor (except as may be necessary to comply with - * the notice requirements in Section 3.4). - *

- * 2.4. Subsequent Licenses - *

- * No Contributor makes additional grants as a result of Your choice to - * distribute the Covered Software under a subsequent version of this - * License (see Section 10.2) or under the terms of a Secondary License (if - * permitted under the terms of Section 3.3). - *

- * 2.5. Representation - *

- * Each Contributor represents that the Contributor believes its - * Contributions are its original creation(s) or it has sufficient rights - * to grant the rights to its Contributions conveyed by this License. - *

- * 2.6. Fair Use - *

- * This License is not intended to limit any rights You have under - * applicable copy-right doctrines of fair use, fair dealing, or other - * equivalents. - *

- * 2.7. Conditions - *

- * Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted - * in Section 2.1. - *

- * 3. Responsibilities - * ------------------- - *

- * 3.1. Distribution of Source Form - *

- * All distribution of Covered Software in Source Code Form, including any - * Modifications that You create or to which You contribute, must be under - * the terms of this License. You must inform recipients that the Source - * Code Form of the Covered Software is governed by the terms of this - * License, and how they can obtain a copy of this License. You may not - * attempt to alter or restrict the recipients' rights in the Source Code - * Form. - *

- * 3.2. Distribution of Executable Form - *

- * If You distribute Covered Software in Executable Form then: - *

- * (a) such Covered Software must also be made available in Source Code - * Form, as described in Section 3.1, and You must inform recipients of - * the Executable Form how they can obtain a copy of such Source Code - * Form by reasonable means in a timely manner, at a charge no more - * than the cost of distribution to the recipient; and - *

- * (b) You may distribute such Executable Form under the terms of this - * License, or sublicense it under different terms, provided that the - * license for the Executable Form does not attempt to limit or alter - * the recipients' rights in the Source Code Form under this License. - *

- * 3.3. Distribution of a Larger Work - *

- * You may create and distribute a Larger Work under terms of Your choice, - * provided that You also comply with the requirements of this License for - * the Covered Software. If the Larger Work is a combination of Covered - * Software with a work governed by one or more Secondary Licenses, and the - * Covered Software is not Incompatible With Secondary Licenses, this - * License permits You to additionally distribute such Covered Software - * under the terms of such Secondary License(s), so that the recipient of - * the Larger Work may, at their option, further distribute the Covered - * Software under the terms of either this License or such Secondary - * License(s). - *

- * 3.4. Notices - *

- * You may not remove or alter the substance of any license notices - * (including copy-right notices, patent notices, disclaimers of warranty, - * or limitations of liability) contained within the Source Code Form of - * the Covered Software, except that You may alter any license notices to - * the extent required to remedy known factual inaccuracies. - *

- * 3.5. Application of Additional Terms - *

- * You may choose to offer, and to charge a fee for, warranty, support, - * indemnity or liability obligations to one or more recipients of Covered - * Software. However, You may do so only on Your own behalf, and not on - * behalf of any Contributor. You must make it absolutely clear that any - * such warranty, support, indemnity, or liability obligation is offered by - * You alone, and You hereby agree to indemnify every Contributor for any - * liability incurred by such Contributor as a result of warranty, support, - * indemnity or liability terms You offer. You may include additional - * disclaimers of warranty and limitations of liability specific to any - * jurisdiction. - *

- * 4. Inability to Comply Due to Statute or Regulation - * --------------------------------------------------- - *

- * If it is impossible for You to comply with any of the terms of this - * License with respect to some or all of the Covered Software due to - * statute, judicial order, or regulation then You must: (a) comply with - * the terms of this License to the maximum extent possible; and (b) - * describe the limitations and the code they affect. Such description must - * be placed in a text file included with all distributions of the Covered - * Software under this License. Except to the extent prohibited by statute - * or regulation, such description must be sufficiently detailed for a - * recipient of ordinary skill to be able to understand it. - *

- * 5. Termination - * -------------- - *

- * 5.1. The rights granted under this License will terminate automatically - * if You fail to comply with any of its terms. However, if You become - * compliant, then the rights granted under this License from a particular - * Contributor are reinstated (a) provisionally, unless and until such - * Contributor explicitly and finally terminates Your grants, and (b) on an - * ongoing basis, if such Contributor fails to notify You of the - * non-compliance by some reasonable means prior to 60 days after You have - * come back into compliance. Moreover, Your grants from a particular - * Contributor are reinstated on an ongoing basis if such Contributor - * notifies You of the non-compliance by some reasonable means, this is the - * first time You have received notice of non-compliance with this License - * from such Contributor, and You become compliant prior to 30 days after - * Your receipt of the notice. - *

- * 5.2. If You initiate litigation against any entity by asserting a patent - * infringement claim (excluding declaratory judgment actions, - * counter-claims, and cross-claims) alleging that a Contributor Version - * directly or indirectly infringes any patent, then the rights granted to - * You by any and all Contributors for the Covered Software under Section - * 2.1 of this License shall terminate. - *

- * 5.3. In the event of termination under Sections 5.1 or 5.2 above, all - * end user license agreements (excluding distributors and resellers) which - * have been validly granted by You or Your distributors under this License - * prior to termination shall survive termination. - *

- * *********************************************************************** - * * - * 6. Disclaimer of Warranty * - * ------------------------- * - * * - * Covered Software is provided under this License on an "as is" * - * basis, without warranty of any kind, either expressed, implied, or * - * statutory, including, without limitation, warranties that the * - * Covered Software is free of defects, merchantable, fit for a * - * particular purpose or non-infringing. The entire risk as to the * - * quality and performance of the Covered Software is with You. * - * Should any Covered Software prove defective in any respect, You * - * (not any Contributor) assume the cost of any necessary servicing, * - * repair, or correction. This disclaimer of warranty constitutes an * - * essential part of this License. No use of any Covered Software is * - * authorized under this License except under this disclaimer. * - * * - * *********************************************************************** - *

- * *********************************************************************** - * * - * 7. Limitation of Liability * - * -------------------------- * - * * - * Under no circumstances and under no legal theory, whether tort * - * (including negligence), contract, or otherwise, shall any * - * Contributor, or anyone who distributes Covered Software as * - * permitted above, be liable to You for any direct, indirect, * - * special, incidental, or consequential damages of any character * - * including, without limitation, damages for lost profits, loss of * - * goodwill, work stoppage, computer failure or malfunction, or any * - * and all other commercial damages or losses, even if such party * - * shall have been informed of the possibility of such damages. This * - * limitation of liability shall not apply to liability for death or * - * personal injury resulting from such party's negligence to the * - * extent applicable law prohibits such limitation. Some * - * jurisdictions do not allow the exclusion or limitation of * - * incidental or consequential damages, so this exclusion and * - * limitation may not apply to You. * - * * - * *********************************************************************** - *

- * 8. Litigation - * ------------- - *

- * Any litigation relating to this License may be brought only in the - * courts of a jurisdiction where the defendant maintains its principal - * place of business and such litigation shall be governed by laws of that - * jurisdiction, without reference to its conflict-of-law provisions. - * Nothing in this Section shall prevent a party's ability to bring - * cross-claims or counter-claims. - *

- * 9. Miscellaneous - * ---------------- - *

- * This License represents the complete agreement concerning the subject - * matter hereof. If any provision of this License is held to be - * unenforceable, such provision shall be reformed only to the extent - * necessary to make it enforceable. Any law or regulation which provides - * that the language of a contract shall be construed against the drafter - * shall not be used to construe this License against a Contributor. - *

- * 10. Versions of the License - * --------------------------- - *

- * 10.1. New Versions - *

- * Mozilla Foundation is the license steward. Except as provided in Section - * 10.3, no one other than the license steward has the right to modify or - * publish new versions of this License. Each version will be given a - * distinguishing version number. - *

- * 10.2. Effect of New Versions - *

- * You may distribute the Covered Software under the terms of the version - * of the License under which You originally received the Covered Software, - * or under the terms of any subsequent version published by the license - * steward. - *

- * 10.3. Modified Versions - *

- * If you create software not governed by this License, and you want to - * create a new license for such software, you may create and use a - * modified version of this License if you rename the license and remove - * any references to the name of the license steward (except to note that - * such modified license differs from this License). - *

- * 10.4. Distributing Source Code Form that is Incompatible With Secondary - * Licenses - *

- * If You choose to distribute Source Code Form that is Incompatible With - * Secondary Licenses under the terms of this version of the License, the - * notice described in Exhibit B of this License must be attached. - *

- * Exhibit A - Source Code Form License Notice - * ------------------------------------------- - *

- * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - *

- * If it is not possible or desirable to put the notice in a particular - * file, then You may include the notice in a location (such as a LICENSE - * file in a relevant directory) where a recipient would be likely to look - * for such a notice. - *

- * You may add additional accurate notices of copy-right ownership. - *

- * Exhibit B - "Incompatible With Secondary Licenses" Notice - * --------------------------------------------------------- - *

- * This Source Code Form is "Incompatible With Secondary Licenses", as - * defined by the Mozilla Public License, v. 2.0. - */ -package net.daporkchop.pepsimod.the.wurst.pkg.name; diff --git a/src/main/java/net/daporkchop/pepsimod/util/AccountManager.java b/src/main/java/net/daporkchop/pepsimod/util/AccountManager.java deleted file mode 100644 index 86422e0..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/AccountManager.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import com.mojang.authlib.Agent; -import com.mojang.authlib.AuthenticationService; -import com.mojang.authlib.UserAuthentication; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import com.mojang.util.UUIDTypeAdapter; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Session; - -import java.lang.reflect.Field; -import java.util.UUID; - -public class AccountManager extends PepsiConstants { - - private final UserAuthentication auth; - - public AccountManager() { - UUID uuid = UUID.randomUUID(); - AuthenticationService authService = new YggdrasilAuthenticationService(Minecraft.getMinecraft().getProxy(), uuid.toString()); - this.auth = authService.createUserAuthentication(Agent.MINECRAFT); - authService.createMinecraftSessionService(); - } - - /** - * Sets the current session - * - * @param s - * @throws Exception - */ - public void setSession(Session s) throws Exception { - Class mc = Minecraft.getMinecraft().getClass(); - try { - Field session = null; - - for (Field f : mc.getDeclaredFields()) { - if (f.getType().isInstance(s)) { - session = f; - //FMLLog.log.info("Found field " + f.toString() + ", injecting..."); - } - } - - if (session == null) { - throw new IllegalStateException("No field of type " + Session.class.getCanonicalName() + " declared."); - } - - session.setAccessible(true); - if (pepsimod.originalSession == null) { - pepsimod.originalSession = Minecraft.getMinecraft().getSession(); - } - session.set(Minecraft.getMinecraft(), s); - session.setAccessible(false); - } catch (Exception e) { - e.printStackTrace(); - throw e; - } - } - - /** - * Sets the current user as a player with the given credentials - * - * @param username - * @param password - * @return - */ - public void setUser(String username, String password) { - if (Minecraft.getMinecraft().getSession().getUsername() != username || "0".equals(Minecraft.getMinecraft().getSession().getToken())) { - /*for (Config.AccountEntry data : Pepsimod.pepsimodInstance.getConfig().getAccounts()) { - if (data.getUsername().equals(Minecraft.getMinecraft().getSession().getUsername()) && data.getUsername().equals(username)) { - return; - } - }*/ - this.auth.logOut(); - this.auth.setUsername(username); - this.auth.setPassword(password); - try { - this.auth.logIn(); - Session session = new Session(this.auth.getSelectedProfile().getName(), UUIDTypeAdapter.fromUUID(this.auth.getSelectedProfile().getId()), this.auth.getAuthenticatedToken(), this.auth.getUserType().getName()); - this.setSession(session); - /*for (int i = 0; i < Pepsimod.pepsimodInstance.getConfig().getAccounts().size(); i++) { - Config.AccountEntry data = Pepsimod.pepsimodInstance.getConfig().getAccounts().get(i); - if (data.getUsername().equals(username) && data.getPassword().equals(password)) { - data.setName(session.getUsername()); - } - }*/ - } catch (Exception e) { - e.printStackTrace(); - } - } else { - //user is already logged in, do nothing - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/BetterScaledResolution.java b/src/main/java/net/daporkchop/pepsimod/util/BetterScaledResolution.java deleted file mode 100644 index 2f7fee4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/BetterScaledResolution.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import net.minecraft.util.math.MathHelper; - -public class BetterScaledResolution extends PepsiConstants { - public static BetterScaledResolution INSTANCE; - - public int scaledWidth; - public int scaledHeight; - public int scaleFactor; - - public BetterScaledResolution() { - this.update(); - INSTANCE = this; - } - - public void update() { - this.scaledWidth = mc.displayWidth; - this.scaledHeight = mc.displayHeight; - this.scaleFactor = 1; - boolean flag = mc.isUnicode(); - int i = mc.gameSettings.guiScale; - - if (i == 0) { - i = 1000; - } - - while (this.scaleFactor < i && this.scaledWidth / (this.scaleFactor + 1) >= 320 && this.scaledHeight / (this.scaleFactor + 1) >= 240) { - ++this.scaleFactor; - } - - if (flag && this.scaleFactor % 2 != 0 && this.scaleFactor != 1) { - --this.scaleFactor; - } - - double scaledWidthD = (double) this.scaledWidth / (double) this.scaleFactor; - double scaledHeightD = (double) this.scaledHeight / (double) this.scaleFactor; - this.scaledWidth = MathHelper.ceil(scaledWidthD); - this.scaledHeight = MathHelper.ceil(scaledHeightD); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/BossinfoCounted.java b/src/main/java/net/daporkchop/pepsimod/util/BossinfoCounted.java deleted file mode 100644 index 4e7a46a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/BossinfoCounted.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import net.minecraft.client.gui.BossInfoClient; - -/** - * Used by the boss bar merger thing to remember stuff - */ -public class BossinfoCounted { - public BossInfoClient info; - public int count = 0; -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/EntityFakePlayer.java b/src/main/java/net/daporkchop/pepsimod/util/EntityFakePlayer.java deleted file mode 100644 index 7a38b97..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/EntityFakePlayer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import net.minecraft.client.entity.EntityOtherPlayerMP; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; - -public class EntityFakePlayer extends EntityOtherPlayerMP { - public EntityFakePlayer() { - super(mc.world, mc.player.getGameProfile()); - this.copyLocationAndAnglesFrom(mc.player); - - // fix inventory - this.inventory.copyInventory(mc.player.inventory); - PepsiUtils.copyPlayerModel(mc.player, this); - - // fix rotation - this.rotationYawHead = mc.player.rotationYawHead; - this.renderYawOffset = mc.player.renderYawOffset; - - // fix cape movement - this.chasingPosX = this.posX; - this.chasingPosY = this.posY; - this.chasingPosZ = this.posZ; - - // spawn - mc.world.addEntityToWorld(this.getEntityId(), this); - } - - public void resetPlayerPosition() { - mc.player.setPositionAndRotation(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); - } - - public void despawn() { - mc.world.removeEntityFromWorld(this.getEntityId()); - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/util/HTTPUtils.java b/src/main/java/net/daporkchop/pepsimod/util/HTTPUtils.java deleted file mode 100644 index c8e3d41..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/HTTPUtils.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import org.apache.commons.codec.Charsets; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.Validate; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLEncoder; -import java.util.Map; - -@SuppressWarnings("deprecation") -public class HTTPUtils { - - public static HttpURLConnection createUrlConnection(final URL url) throws IOException { - Validate.notNull(url); - final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setConnectTimeout(15000); - connection.setReadTimeout(15000); - connection.setUseCaches(false); - return connection; - } - - /** - * Performs a POST request to the specified URL and returns the result. - *

- * The POST data will be encoded in UTF-8 as the specified contentType. The response will be parsed as UTF-8. - * If the server returns an error but still provides a body, the body will be returned as normal. - * If the server returns an error without any body, a relevant {@link java.io.IOException} will be thrown. - * - * @param url URL to submit the POST request to - * @param post POST data in the correct format to be submitted - * @param contentType Content type of the POST data - * @return Raw text response from the server - * @throws IOException The request was not successful - */ - public static String performPostRequest(final URL url, final String post, final String contentType) throws IOException { - Validate.notNull(url); - Validate.notNull(post); - Validate.notNull(contentType); - final HttpURLConnection connection = createUrlConnection(url); - final byte[] postAsBytes = post.getBytes(Charsets.UTF_8); - - connection.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); - connection.setRequestProperty("Content-Length", "" + postAsBytes.length); - connection.setDoOutput(true); - - OutputStream outputStream = null; - try { - outputStream = connection.getOutputStream(); - IOUtils.write(postAsBytes, outputStream); - } finally { - IOUtils.closeQuietly(outputStream); - } - - InputStream inputStream = null; - try { - inputStream = connection.getInputStream(); - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } catch (final IOException e) { - IOUtils.closeQuietly(inputStream); - inputStream = connection.getErrorStream(); - - if (inputStream != null) { - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } else { - throw e; - } - } finally { - IOUtils.closeQuietly(inputStream); - } - } - - /** - * Performs a POST request to the specified URL and returns the result. - *

- * The POST data will be encoded in UTF-8 as the specified contentType. The response will be parsed as UTF-8. - * If the server returns an error but still provides a body, the body will be returned as normal. - * If the server returns an error without any body, a relevant {@link java.io.IOException} will be thrown. - * - * @param url URL to submit the POST request to - * @param post POST data in the correct format to be submitted - * @param contentType Content type of the POST data - * @return Raw text response from the server - * @throws IOException The request was not successful - */ - public static String performPostRequestWithAuth(final URL url, final String post, final String contentType, final String auth) throws IOException { - Validate.notNull(url); - Validate.notNull(post); - Validate.notNull(contentType); - final HttpURLConnection connection = createUrlConnection(url); - final byte[] postAsBytes = post.getBytes(Charsets.UTF_8); - - connection.setRequestProperty("Authorization", auth); - connection.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); - connection.setRequestProperty("Content-Length", "" + postAsBytes.length); - connection.setDoOutput(true); - - OutputStream outputStream = null; - try { - outputStream = connection.getOutputStream(); - IOUtils.write(postAsBytes, outputStream); - } finally { - IOUtils.closeQuietly(outputStream); - } - - InputStream inputStream = null; - try { - inputStream = connection.getInputStream(); - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } catch (final IOException e) { - IOUtils.closeQuietly(inputStream); - inputStream = connection.getErrorStream(); - - if (inputStream != null) { - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } else { - throw e; - } - } finally { - IOUtils.closeQuietly(inputStream); - } - } - - /** - * Performs a GET request to the specified URL and returns the result. - *

- * The response will be parsed as UTF-8. - * If the server returns an error but still provides a body, the body will be returned as normal. - * If the server returns an error without any body, a relevant {@link java.io.IOException} will be thrown. - * - * @param url URL to submit the GET request to - * @return Raw text response from the server - * @throws IOException The request was not successful - */ - public static String performGetRequest(final URL url) throws IOException { - Validate.notNull(url); - final HttpURLConnection connection = createUrlConnection(url); - - InputStream inputStream = null; - try { - inputStream = connection.getInputStream(); - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } catch (final IOException e) { - IOUtils.closeQuietly(inputStream); - inputStream = connection.getErrorStream(); - - if (inputStream != null) { - final String result = IOUtils.toString(inputStream, Charsets.UTF_8); - return result; - } else { - throw e; - } - } finally { - IOUtils.closeQuietly(inputStream); - } - } - - /** - * Creates a {@link URL} with the specified string, throwing an {@link java.lang.Error} if the URL was malformed. - *

- * This is just a wrapper to allow URLs to be created in constants, where you know the URL is valid. - * - * @param url URL to construct - * @return URL constructed - */ - public static URL constantURL(final String url) { - try { - return new URL(url); - } catch (final MalformedURLException ex) { - throw new Error("Couldn't create constant for " + url, ex); - } - } - - /** - * Turns the specified Map into an encoded & escaped query - * - * @param query Map to convert into a text based query - * @return Resulting query. - */ - public static String buildQuery(final Map query) { - if (query == null) { - return ""; - } - final StringBuilder builder = new StringBuilder(); - - for (final Map.Entry entry : query.entrySet()) { - if (builder.length() > 0) { - builder.append('&'); - } - - try { - builder.append(URLEncoder.encode(entry.getKey(), "UTF-8")); - } catch (final UnsupportedEncodingException e) { - } - - if (entry.getValue() != null) { - builder.append('='); - try { - builder.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8")); - } catch (final UnsupportedEncodingException e) { - } - } - } - - return builder.toString(); - } - - /** - * Concatenates the given {@link java.net.URL} and query. - * - * @param url URL to base off - * @param query Query to append to URL - * @return URL constructed - */ - public static URL concatenateURL(final URL url, final String query) { - try { - return url.getQuery() != null && !url.getQuery().isEmpty() ? new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile() + "&" + query) : new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile() + "?" + query); - } catch (final MalformedURLException ex) { - throw new IllegalArgumentException("Could not concatenate given URL with GET arguments!", ex); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/MCLeaks.java b/src/main/java/net/daporkchop/pepsimod/util/MCLeaks.java deleted file mode 100644 index 465d5e0..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/MCLeaks.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import net.minecraft.client.Minecraft; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.login.client.CPacketEncryptionResponse; -import net.minecraft.network.login.server.SPacketEncryptionRequest; -import net.minecraft.util.CryptManager; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.fml.common.FMLLog; - -import javax.annotation.Nullable; -import javax.crypto.SecretKey; -import javax.swing.JOptionPane; -import java.io.IOException; -import java.math.BigInteger; -import java.net.URL; -import java.security.PublicKey; - -public class MCLeaks { - - public static final URL redeemUrl = HTTPUtils.constantURL("http://auth.mcleaks.net/v1/redeem"); - public static final URL joinUrl = HTTPUtils.constantURL("http://auth.mcleaks.net/v1/joinserver"); - - public static RedeemResponse redeemToken(String token) { - try { - String response = HTTPUtils.performPostRequest(redeemUrl, - "{ \"token\": \"" + token + "\" }", - "application/json"); - - JsonObject json = (new JsonParser()).parse(response).getAsJsonObject(); - JsonObject result = json.getAsJsonObject("result"); - - return new RedeemResponse(result.get("mcname").getAsString(), result.get("session").getAsString()); - } catch (IOException e) { - e.printStackTrace(); - } catch (NullPointerException e) { - JOptionPane.showMessageDialog(null, "Invalid or expired token!", "MCLeaks Error", JOptionPane.OK_OPTION); - } - return new RedeemResponse(); - } - - public static void joinServerStuff(SPacketEncryptionRequest pck, NetworkManager mgr) { - try { - final SecretKey secretkey = CryptManager.createNewSharedKey(); - String s = pck.getServerId(); - PublicKey publickey = pck.getPublicKey(); - String serverhash = (new BigInteger(CryptManager.getServerIdHash(s, publickey, secretkey))).toString(16); - - String request = "{ \"session\": \"" + Minecraft.getMinecraft().getSession().getToken() + "\", " + - "\"mcname\": \"" + Minecraft.getMinecraft().getSession().getUsername() + "\", " + - "\"serverhash\": \"" + serverhash + "\", \"server\": " + - '"' + (Minecraft.getMinecraft().getCurrentServerData().serverIP.split(":").length == 1 ? Minecraft.getMinecraft().getCurrentServerData().serverIP + ":25565" : Minecraft.getMinecraft().getCurrentServerData().serverIP) + "\" }"; - - FMLLog.log.info(request); - - String result = HTTPUtils.performPostRequest(joinUrl, request, "application/json"); - - FMLLog.log.info(result); - - JsonObject json = (new JsonParser()).parse(result).getAsJsonObject(); - if (!json.get("success").getAsBoolean()) { - mgr.closeChannel(new TextComponentString("\u00A7c\u00A7lError validating \u00A79MCLeaks \u00A7ckey!")); - } - - mgr.sendPacket(new CPacketEncryptionResponse(secretkey, publickey, pck.getVerifyToken()), p_operationComplete_1_ -> mgr.enableEncryption(secretkey)); - - } catch (Exception e) { - e.printStackTrace(); - System.exit(0); - } - } - - public static class RedeemResponse { - - public boolean success; - - @Nullable - private String name; - - @Nullable - private String session; - - public RedeemResponse() { //welp - this.success = false; - } - - public RedeemResponse(String n, String s) { - this.success = true; - this.name = n; - this.session = s; - } - - public String getName() { - return this.name; - } - - public String getSession() { - return this.session; - } - } -} \ No newline at end of file diff --git a/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java b/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java index a6a209e..ebae35e 100644 --- a/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java +++ b/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java @@ -18,9 +18,13 @@ import net.daporkchop.pepsimod.Pepsimod; import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; public abstract class PepsiConstants { + public static final String MOD_ID = "pepsimod"; + public static String VERSION = "unknown"; + public static String VERSION_FULL = "unknown"; + public static Minecraft mc = null; public static Pepsimod pepsimod = null; - public static boolean mcStartedSuccessfully = false; } diff --git a/src/main/java/net/daporkchop/pepsimod/util/PepsiUtils.java b/src/main/java/net/daporkchop/pepsimod/util/PepsiUtils.java deleted file mode 100644 index 35255d4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/PepsiUtils.java +++ /dev/null @@ -1,613 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import net.daporkchop.pepsimod.Pepsimod; -import net.daporkchop.pepsimod.optimization.BlockID; -import net.daporkchop.pepsimod.util.colors.ColorizedText; -import net.daporkchop.pepsimod.util.colors.FixedColorElement; -import net.daporkchop.pepsimod.util.colors.GradientText; -import net.daporkchop.pepsimod.util.colors.rainbow.ColorChangeType; -import net.daporkchop.pepsimod.util.colors.rainbow.RainbowCycle; -import net.daporkchop.pepsimod.util.colors.rainbow.RainbowText; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.daporkchop.pepsimod.util.config.impl.TargettingTranslator; -import net.daporkchop.pepsimod.util.misc.IWurstRenderListener; -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiDisconnected; -import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.Vector3d; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemEgg; -import net.minecraft.item.ItemEnderPearl; -import net.minecraft.item.ItemFishingRod; -import net.minecraft.item.ItemLingeringPotion; -import net.minecraft.item.ItemSnowball; -import net.minecraft.item.ItemSplashPotion; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraftforge.fml.client.FMLClientHandler; -import org.apache.commons.lang3.ArrayUtils; -import org.lwjgl.opengl.GL11; - -import javax.imageio.ImageIO; -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.ThreadLocalRandom; - -public class PepsiUtils extends PepsiConstants { - public static final char COLOR_ESCAPE = '\u00A7'; - public static final String[] colorCodes = {"c", "9", "f", "1", "4"}; - public static final Timer timer = new Timer(); - public static final ServerData TOOBEETOOTEE_DATA = new ServerData("toobeetootee", "2b2t.org", false); - public static final KeyBinding[] controls = { - mc.gameSettings.keyBindForward, mc.gameSettings.keyBindBack, - mc.gameSettings.keyBindRight, mc.gameSettings.keyBindLeft, - mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak - }; - public static final BufferedImage PEPSI_LOGO; - public static String buttonPrefix = COLOR_ESCAPE + "c"; - public static RainbowCycle rainbowCycle = new RainbowCycle(); - public static Color RAINBOW_COLOR = new Color(0, 0, 0); - public static RainbowText PEPSI_NAME = new RainbowText(Pepsimod.NAME_VERSION); - public static ArrayList wurstRenderListeners = new ArrayList<>(); - public static ArrayList toRemoveWurstRenderListeners = new ArrayList<>(); - public static GuiButton reconnectButton; - public static GuiButton autoReconnectButton; - public static int autoReconnectWaitTime = 5; - public static String lastIp; - public static int lastPort; - - static { - TOOBEETOOTEE_DATA.setResourceMode(ServerData.ServerResourceMode.PROMPT); - - timer.schedule(new TimerTask() { - @Override - public void run() {// random colors - PepsiUtils.buttonPrefix = PepsiUtils.COLOR_ESCAPE + colorCodes[ThreadLocalRandom.current().nextInt(PepsiUtils.colorCodes.length)]; - } - }, 1000, 1000); - - timer.schedule(new TimerTask() { //autoreconnect - @Override - public void run() { - if (mc.currentScreen != null && mc.currentScreen instanceof GuiDisconnected && autoReconnectButton != null && GeneralTranslator.INSTANCE.autoReconnect) { - autoReconnectButton.displayString = "AutoReconnect (\u00A7a" + --autoReconnectWaitTime + "\u00A7r)"; - if (autoReconnectWaitTime <= 0) { - ServerData data = new ServerData("", lastIp + ':' + lastPort, false); - data.setResourceMode(ServerData.ServerResourceMode.PROMPT); - mc.addScheduledTask(() -> FMLClientHandler.instance().connectToServer(mc.currentScreen, data)); - autoReconnectWaitTime = 5; - } - } - } - }, 1000, 1000); - - timer.schedule(new TimerTask() { - @Override - public void run() { //rainbow - //red - if (rainbowCycle.red == ColorChangeType.INCREASE) { - rainbowCycle.r += 4; - if (rainbowCycle.r > 255) { - rainbowCycle.red = ColorChangeType.DECRASE; - rainbowCycle.green = ColorChangeType.INCREASE; - } - } else if (rainbowCycle.red == ColorChangeType.DECRASE) { - rainbowCycle.r -= 4; - if (rainbowCycle.r == 0) { - rainbowCycle.red = ColorChangeType.NONE; - } - } - //green - if (rainbowCycle.green == ColorChangeType.INCREASE) { - rainbowCycle.g += 4; - if (rainbowCycle.g > 255) { - rainbowCycle.green = ColorChangeType.DECRASE; - rainbowCycle.blue = ColorChangeType.INCREASE; - } - } else if (rainbowCycle.green == ColorChangeType.DECRASE) { - rainbowCycle.g -= 4; - if (rainbowCycle.g == 0) { - rainbowCycle.green = ColorChangeType.NONE; - } - } - //blue - if (rainbowCycle.blue == ColorChangeType.INCREASE) { - rainbowCycle.b += 4; - if (rainbowCycle.b > 255) { - rainbowCycle.blue = ColorChangeType.DECRASE; - rainbowCycle.red = ColorChangeType.INCREASE; - } - } else if (rainbowCycle.blue == ColorChangeType.DECRASE) { - rainbowCycle.b -= 4; - if (rainbowCycle.b == 0) { - rainbowCycle.blue = ColorChangeType.NONE; - } - } - RAINBOW_COLOR = new Color(ensureRange(rainbowCycle.r, 0, 255), ensureRange(rainbowCycle.g, 0, 255), ensureRange(rainbowCycle.b, 0, 255)); - } - }, 0, 50); - - BufferedImage pepsiLogo = null; - try (InputStream in = PepsiUtils.class.getResourceAsStream("/pepsilogo.png")) { - pepsiLogo = ImageIO.read(in); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - PEPSI_LOGO = pepsiLogo; - } - } - - /** - * Makes a gradient! Cache this, as it's quite resource-intensive - * - * @param text the text to gradient-ify - * @param color1 the starting color - * @param color2 the ending color - * @param through the color in the middle - * @return a filled GradientText - */ - public static ColorizedText getGradientFromStringThroughColor(String text, Color color1, Color color2, Color through) { - int charCount = text.length(); - String[] letters = text.split(""); - int colorCountPart1 = Math.floorDiv(charCount, 2); - int colorCountPart2 = ceilDiv(charCount, 2); - Color[] colorsPart1 = new Color[colorCountPart1]; - Color[] colorsPart2 = new Color[colorCountPart2]; - int rDiffStep = (color1.getRed() - through.getRed()) / colorCountPart1; - int gDiffStep = (color1.getGreen() - through.getGreen()) / colorCountPart1; - int bDiffStep = (color1.getBlue() - through.getBlue()) / colorCountPart1; - for (int i = 0; i < colorCountPart1; i++) { //first step - colorsPart1[i] = new Color(ensureRange(color1.getRed() + i * rDiffStep * -1, 0, 255), ensureRange(color1.getGreen() + i * gDiffStep * -1, 0, 255), ensureRange(color1.getBlue() + i * bDiffStep * -1, 0, 255)); - } - rDiffStep = (through.getRed() - color2.getRed()) / colorCountPart2; - gDiffStep = (through.getGreen() - color2.getGreen()) / colorCountPart2; - bDiffStep = (through.getBlue() - color2.getBlue()) / colorCountPart2; - for (int i = 0; i < colorCountPart2; i++) { //second step - colorsPart2[i] = new Color(ensureRange(through.getRed() + i * rDiffStep * -1, 0, 255), ensureRange(through.getGreen() + i * gDiffStep * -1, 0, 255), ensureRange(through.getBlue() + i * bDiffStep * -1, 0, 255)); - } - FixedColorElement[] elements = new FixedColorElement[charCount]; - Color[] merged = ArrayUtils.addAll(colorsPart1, colorsPart2); - for (int i = 0; i < charCount; i++) { - elements[i] = new FixedColorElement(merged[i].getRGB(), letters[i]); - } - return new GradientText(elements, Minecraft.getMinecraft().fontRenderer.getStringWidth(text)); - } - - public static int ceilDiv(int x, int y) { - return Math.floorDiv(x, y) + (x % y == 0 ? 0 : 1); - } - - public static int ensureRange(int value, int min, int max) { - int toReturn = Math.min(Math.max(value, min), max); - return toReturn; - } - - public static RainbowCycle rainbowCycle(int count, RainbowCycle toRunOn) { - for (int i = 0; i < count; i++) { - //red - if (toRunOn.red == ColorChangeType.INCREASE) { - toRunOn.r += 4; - if (toRunOn.r > 255) { - toRunOn.red = ColorChangeType.DECRASE; - toRunOn.green = ColorChangeType.INCREASE; - } - } else if (toRunOn.red == ColorChangeType.DECRASE) { - toRunOn.r -= 4; - if (toRunOn.r == 0) { - toRunOn.red = ColorChangeType.NONE; - } - } - //green - if (toRunOn.green == ColorChangeType.INCREASE) { - toRunOn.g += 4; - if (toRunOn.g > 255) { - toRunOn.green = ColorChangeType.DECRASE; - toRunOn.blue = ColorChangeType.INCREASE; - } - } else if (toRunOn.green == ColorChangeType.DECRASE) { - toRunOn.g -= 4; - if (toRunOn.g == 0) { - toRunOn.green = ColorChangeType.NONE; - } - } - //blue - if (toRunOn.blue == ColorChangeType.INCREASE) { - toRunOn.b += 4; - if (toRunOn.b > 255) { - toRunOn.blue = ColorChangeType.DECRASE; - toRunOn.red = ColorChangeType.INCREASE; - } - } else if (toRunOn.blue == ColorChangeType.DECRASE) { - toRunOn.b -= 4; - if (toRunOn.b == 0) { - toRunOn.blue = ColorChangeType.NONE; - } - } - } - return toRunOn; - } - - public static RainbowCycle rainbowCycleBackwards(int count, RainbowCycle toRunOn) { - for (int i = 0; i < count; i++) { - //red - if (toRunOn.red == ColorChangeType.INCREASE) { //decrease value - toRunOn.r -= 8; - if (toRunOn.r == 0) { - toRunOn.red = ColorChangeType.NONE; - } - } else if (toRunOn.red == ColorChangeType.DECRASE) { - toRunOn.r += 8; - if (toRunOn.r > 255) { - toRunOn.red = ColorChangeType.INCREASE; - toRunOn.green = ColorChangeType.DECRASE; - } - } - - //green - if (toRunOn.green == ColorChangeType.INCREASE) { //decrease value - toRunOn.g -= 8; - if (toRunOn.g == 0) { - toRunOn.green = ColorChangeType.NONE; - } - } else if (toRunOn.green == ColorChangeType.DECRASE) { - toRunOn.g += 8; - if (toRunOn.g > 255) { - toRunOn.green = ColorChangeType.INCREASE; - toRunOn.blue = ColorChangeType.DECRASE; - } - } - - //blue - if (toRunOn.blue == ColorChangeType.INCREASE) { //decrease value - toRunOn.b -= 8; - if (toRunOn.b == 0) { - toRunOn.blue = ColorChangeType.NONE; - } - } else if (toRunOn.blue == ColorChangeType.DECRASE) { - toRunOn.b += 8; - if (toRunOn.b > 255) { - toRunOn.blue = ColorChangeType.INCREASE; - toRunOn.red = ColorChangeType.DECRASE; - } - } - } - return toRunOn; - } - - public static boolean canEntityBeSeen(Entity entityIn, EntityPlayer player, TargettingTranslator.TargetBone bone) { - return entityIn.world.rayTraceBlocks(new Vec3d(player.posX, player.posY + (double) player.getEyeHeight(), player.posZ), new Vec3d(entityIn.posX, getTargetHeight(entityIn, bone), entityIn.posZ), false, true, false) == null; - } - - public static double getTargetHeight(Entity entity, TargettingTranslator.TargetBone bone) { - double targetHeight = entity.posY; - if (bone == TargettingTranslator.TargetBone.HEAD) { - targetHeight = entity.getEyeHeight(); - } else if (bone == TargettingTranslator.TargetBone.MIDDLE) { - targetHeight = entity.getEyeHeight() / 2; - } - return targetHeight; - } - - public static Vec3d adjustVectorForBone(Vec3d vec3d, Entity entity, TargettingTranslator.TargetBone bone) { - ReflectionStuff.setY_vec3d(vec3d, getTargetHeight(entity, bone)); - return vec3d; - } - - public static void setBlockIdFields() { - Block.REGISTRY.forEach(block -> ((BlockID) block).internal_setBlockId(Block.REGISTRY.getIDForObject(block))); - } - - public static AxisAlignedBB cloneBB(AxisAlignedBB bb) { - return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - } - - public static AxisAlignedBB offsetBB(AxisAlignedBB bb, BlockPos pos) { - ReflectionStuff.setMinX(bb, ReflectionStuff.getMinX(bb) + pos.getX()); - ReflectionStuff.setMinY(bb, ReflectionStuff.getMinY(bb) + pos.getY()); - ReflectionStuff.setMinZ(bb, ReflectionStuff.getMinZ(bb) + pos.getZ()); - ReflectionStuff.setMaxX(bb, ReflectionStuff.getMaxX(bb) + pos.getX()); - ReflectionStuff.setMaxY(bb, ReflectionStuff.getMaxY(bb) + pos.getY()); - ReflectionStuff.setMaxZ(bb, ReflectionStuff.getMaxZ(bb) + pos.getZ()); - return bb; - } - - public static AxisAlignedBB unionBB(AxisAlignedBB bb1, AxisAlignedBB bb2) { - ReflectionStuff.setMinX(bb1, Math.min(ReflectionStuff.getMinX(bb1), ReflectionStuff.getMinX(bb2))); - ReflectionStuff.setMinY(bb1, Math.min(ReflectionStuff.getMinY(bb1), ReflectionStuff.getMinY(bb2))); - ReflectionStuff.setMinZ(bb1, Math.min(ReflectionStuff.getMinZ(bb1), ReflectionStuff.getMinZ(bb2))); - ReflectionStuff.setMaxX(bb1, Math.min(ReflectionStuff.getMaxX(bb1), ReflectionStuff.getMaxX(bb2))); - ReflectionStuff.setMaxY(bb1, Math.min(ReflectionStuff.getMaxY(bb1), ReflectionStuff.getMaxY(bb2))); - ReflectionStuff.setMaxZ(bb1, Math.min(ReflectionStuff.getMaxZ(bb1), ReflectionStuff.getMaxZ(bb2))); - return bb1; - } - - public static Vector3d sub(Vector3d in, Vector3d with) { - in.x -= with.x; - in.y -= with.y; - in.z -= with.z; - return in; - } - - public static Vec3d getInterpolatedAmount(Entity entity, double x, double y, double z) { - return new Vec3d( - (entity.posX - entity.lastTickPosX) * x, - (entity.posY - entity.lastTickPosY) * y, - (entity.posZ - entity.lastTickPosZ) * z - ); - } - - public static Vec3d getInterpolatedAmount(Entity entity, double ticks) { - return getInterpolatedAmount(entity, ticks, ticks, ticks); - } - - public static void copyPlayerModel(EntityPlayer from, EntityPlayer to) { - to.getDataManager().set(ReflectionStuff.getPLAYER_MODEL_FLAG(), from.getDataManager().get(ReflectionStuff.getPLAYER_MODEL_FLAG())); - } - - public static void glColor(RenderColor color) { - GL11.glColor4b(color.r, color.g, color.b, color.a); - } - - public static void glColor(Color color) { - RenderColor.glColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); - } - - public static boolean isThrowable(ItemStack stack) { - Item item = stack.getItem(); - return item instanceof ItemBow || item instanceof ItemSnowball || item instanceof ItemEgg || item instanceof ItemEnderPearl || item instanceof ItemSplashPotion || item instanceof ItemLingeringPotion || item instanceof ItemFishingRod; - } - - public static float round(float input, float step) { - return ((Math.round(input / step)) * step); - } - - public static float ensureRange(float value, float min, float max) { - float toReturn = Math.min(Math.max(value, min), max); - return toReturn; - } - - public static String roundFloatForSlider(float f) { - return String.format("%.2f", f); - } - - public static String roundCoords(double d) { - return String.format("%.2f", d); - } - - public static String getFacing() { - Entity entity = mc.getRenderViewEntity(); - EnumFacing enumfacing = entity.getHorizontalFacing(); - String s = "Invalid"; - - switch (enumfacing) { - case NORTH: - s = "-Z"; - break; - case SOUTH: - s = "+Z"; - break; - case WEST: - s = "-X"; - break; - case EAST: - s = "+X"; - } - - return s; - } - - public static void renderItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack) { - if (!stack.isEmpty()) { - GlStateManager.pushMatrix(); - RenderHelper.enableGUIStandardItemLighting(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - try { - GlStateManager.translate(0.0F, 0.0F, 32.0F); - mc.getRenderItem().zLevel = 200F; - mc.getRenderItem().renderItemAndEffectIntoGUI(stack, x, y); - mc.getRenderItem().renderItemOverlayIntoGUI(mc.fontRenderer, stack, x, y, ""); - mc.getRenderItem().zLevel = 0F; - } catch (Exception e) { - e.printStackTrace(); - } - RenderHelper.disableStandardItemLighting(); - GlStateManager.popMatrix(); - } - } - - public static ItemStack getWearingArmor(int armorType) { - return mc.player.inventoryContainer.getSlot(5 + armorType).getStack(); - } - - public static void drawNameplateNoScale(FontRenderer fontRendererIn, String str, float x, float y, float z, int verticalShift, float viewerYaw, float viewerPitch, boolean isThirdPersonFrontal, float offset, float size) { - GlStateManager.pushMatrix(); - - double dist = new Vec3d(x, y + offset, z).length(); - GlStateManager.translate(x, y + offset, z); - - GlStateManager.glNormal3f(0.0F, 1.0F, 0.0F); - GlStateManager.rotate(-viewerYaw, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate((float) (isThirdPersonFrontal ? -1 : 1) * viewerPitch, 1.0F, 0.0F, 0.0F); - size *= dist * 0.3d; - GlStateManager.scale(-0.025F * size, -0.025F * size, 0.025F * size); - GlStateManager.disableLighting(); - GlStateManager.depthMask(false); - - GlStateManager.disableDepth(); - - GlStateManager.enableBlend(); - GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); - int i = fontRendererIn.getStringWidth(str) / 2; - GlStateManager.disableTexture2D(); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); - bufferbuilder.begin(7, DefaultVertexFormats.POSITION_COLOR); - bufferbuilder.pos((double) (-i - 1), (double) (-8 + verticalShift), 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex(); - bufferbuilder.pos((double) (-i - 1), (double) (1 + verticalShift), 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex(); - bufferbuilder.pos((double) (i + 1), (double) (1 + verticalShift), 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex(); - bufferbuilder.pos((double) (i + 1), (double) (-8 + verticalShift), 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex(); - tessellator.draw(); - GlStateManager.enableTexture2D(); - - int color = 0xFFFFFFFF; - GlStateManager.enableDepth(); - - GlStateManager.depthMask(true); - fontRendererIn.drawString(str, -fontRendererIn.getStringWidth(str) / 2, verticalShift - 7, color); - GlStateManager.enableLighting(); - GlStateManager.disableBlend(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.popMatrix(); - - //TODO: draw items in name tag - } - - public static int getBestTool(Block block) { - float best = -1.0F; - int index = -1; - for (int i = 0; i < 9; i++) { - ItemStack itemStack = mc.player.inventory.getStackInSlot(i); - if (!itemStack.isEmpty()) { - float str = itemStack.getItem().getDestroySpeed(itemStack, block.getDefaultState()); - if (str > best) { - best = str; - index = i; - } - } - } - return index; - } - - public static double getDimensionCoord(double coord) { - return mc.player.dimension == 0 ? coord / 8 : coord * 8; - } - - public static int getArmorType(ItemArmor armor) { - return armor.armorType.ordinal() - 2; - } - - public static double[] interpolate(Entity entity) { - double partialTicks = ReflectionStuff.getTimer().renderPartialTicks; - double[] pos = {entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * partialTicks, entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * partialTicks, entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * partialTicks}; - - return pos; - } - - public static boolean isAttackable(EntityLivingBase entity) { - return entity != null && entity != mc.player && entity.isEntityAlive(); - } - - public static EntityLivingBase getClosestEntityWithoutReachFactor() { - EntityLivingBase closestEntity = null; - double distance = 9999.0D; - for (Object object : mc.world.loadedEntityList) { - if ((object instanceof EntityLivingBase)) { - EntityLivingBase entity = (EntityLivingBase) object; - if (isAttackable(entity)) { - double newDistance = mc.player.getDistanceSq(entity); - if (closestEntity != null) { - if (distance > newDistance) { - closestEntity = entity; - distance = newDistance; - } - } else { - closestEntity = entity; - distance = newDistance; - } - } - } - } - return closestEntity; - } - - public static boolean isControlsPressed() { - for (KeyBinding keyBinding : controls) { - if (ReflectionStuff.getPressed(keyBinding)) { - return true; - } - } - return false; - } - - public static void drawRect(float paramXStart, float paramYStart, float paramXEnd, float paramYEnd, int paramColor) { - float alpha = (float) (paramColor >> 24 & 0xFF) / 255F; - float red = (float) (paramColor >> 16 & 0xFF) / 255F; - float green = (float) (paramColor >> 8 & 0xFF) / 255F; - float blue = (float) (paramColor & 0xFF) / 255F; - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glEnable(GL11.GL_LINE_SMOOTH); - - GL11.glColor4f(red, green, blue, alpha); - GL11.glBegin(GL11.GL_QUADS); - GL11.glVertex2d(paramXEnd, paramYStart); - GL11.glVertex2d(paramXStart, paramYStart); - GL11.glVertex2d(paramXStart, paramYEnd); - GL11.glVertex2d(paramXEnd, paramYEnd); - GL11.glEnd(); - - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_LINE_SMOOTH); - GL11.glPopMatrix(); - } - - public static Vec3d getPlayerPos(float partialTicks) { - return getEntityPos(partialTicks, mc.player); - } - - public static Vec3d getEntityPos(float partialTicks, Entity entity) { - if (partialTicks == 1.0F) { - return new Vec3d(entity.posX, entity.posY, entity.posZ); - } else { - double x = entity.prevPosX + (entity.posX - entity.prevPosX) * partialTicks; - double y = entity.prevPosY + (entity.posY - entity.prevPosY) * partialTicks; - double z = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * partialTicks; - return new Vec3d(x, y, z); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/ReflectionStuff.java b/src/main/java/net/daporkchop/pepsimod/util/ReflectionStuff.java deleted file mode 100644 index 6e55362..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/ReflectionStuff.java +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import com.google.common.collect.ImmutableSet; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.GuiDisconnected; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.multiplayer.PlayerControllerMP; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.resources.DefaultResourcePack; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.play.client.CPacketPlayer; -import net.minecraft.network.play.client.CPacketVehicleMove; -import net.minecraft.util.Timer; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.translation.LanguageMap; -import net.minecraftforge.fml.common.FMLLog; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Map; -import java.util.Set; - -//TODO: replace this with Unsafe or access transformers -public class ReflectionStuff extends PepsiConstants { - public static Field renderPosX; - public static Field renderPosY; - public static Field renderPosZ; - public static Field sleeping; - public static Field PLAYER_MODEL_FLAG; - public static Field minX; - public static Field minY; - public static Field minZ; - public static Field maxX; - public static Field maxY; - public static Field maxZ; - public static Field y_vec3d; - public static Field timer; - public static Field boundingBox; - public static Field debugFps; - public static Field itemRenderer; - public static Field pressed; - public static Field ridingEntity; - public static Field horseJumpPower; - public static Field cPacketPlayer_x; - public static Field cPacketPlayer_y; - public static Field cPacketPlayer_z; - public static Field landMovementFactor; - public static Field inWater; - public static Field rightClickDelayTimer; - public static Field curBlockDamageMP; - public static Field blockHitDelay; - public static Field cPacketPlayer_onGround; - public static Field parentScreen; - public static Field DEFAULT_RESOURCE_DOMAINS; - public static Field cPacketVehicleMove_y; - public static Field currentPlayerItem; - public static Field languageMap_instance; - public static Field languageMap_languageList; - - public static Method updateFallState; - public static Method rightClickMouse; - - private static Field modifiersField; - - static { - try { - modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - } catch (Exception e) { - //impossible! - } - } - - public static Field getField(Class c, String... names) { - for (String s : names) { - try { - Field f = c.getDeclaredField(s); - f.setAccessible(true); - modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); - return f; - } catch (NoSuchFieldException e) { - FMLLog.log.info("unable to find field: " + s); - } catch (IllegalAccessException e) { - FMLLog.log.info("unable to make field changeable!"); - } - } - - throw new IllegalStateException("Field with names: " + names + " not found!"); - } - - public static Method getMethod(Class c, String[] names, Class... args) { - for (String s : names) { - try { - Method m = c.getDeclaredMethod(s, args); - m.setAccessible(true); - return m; - } catch (NoSuchMethodException e) { - FMLLog.log.info("unable to find method: " + s); - } - } - - throw new IllegalStateException("Method with names: " + names + " not found!"); - } - - public static void init() { - try { - renderPosX = getField(RenderManager.class, "renderPosX", "field_78725_b", "o"); - renderPosY = getField(RenderManager.class, "renderPosY", "field_78726_c", "p"); - renderPosZ = getField(RenderManager.class, "renderPosZ", "field_78723_d", "q"); - sleeping = getField(EntityPlayer.class, "sleeping", "field_71083_bS", "bK"); - PLAYER_MODEL_FLAG = getField(EntityPlayer.class, "PLAYER_MODEL_FLAG", "field_184827_bp", "br"); - minX = getField(AxisAlignedBB.class, "minX", "field_72340_a", "a"); - minY = getField(AxisAlignedBB.class, "minY", "field_72338_b", "b"); - minZ = getField(AxisAlignedBB.class, "minZ", "field_72339_c", "c"); - maxX = getField(AxisAlignedBB.class, "maxX", "field_72336_d", "d"); - maxY = getField(AxisAlignedBB.class, "maxY", "field_72337_e", "e"); - maxZ = getField(AxisAlignedBB.class, "maxZ", "field_72334_f", "f"); - y_vec3d = getField(Vec3d.class, "y", "field_72448_b", "c"); - timer = getField(Minecraft.class, "timer", "field_71428_T", "Y"); - boundingBox = getField(Entity.class, "boundingBox", "field_70121_D", "av"); - debugFps = getField(Minecraft.class, "debugFPS", "field_71470_ab", "ar"); - itemRenderer = getField(ItemRenderer.class, "itemRenderer", "field_178112_h", "k"); - pressed = getField(KeyBinding.class, "pressed", "field_74513_e", "i"); - ridingEntity = getField(Entity.class, "ridingEntity", "field_184239_as", "au"); - horseJumpPower = getField(EntityPlayerSP.class, "horseJumpPower", "field_110321_bQ", "cq"); - cPacketPlayer_x = getField(CPacketPlayer.class, "x", "field_149479_a", "a"); - cPacketPlayer_y = getField(CPacketPlayer.class, "y", "field_149477_b", "b"); - cPacketPlayer_z = getField(CPacketPlayer.class, "z", "field_149478_c", "c"); - inWater = getField(Entity.class, "inWater", "field_70171_ac", "U"); - landMovementFactor = getField(EntityLivingBase.class, "landMovementFactor", "field_70746_aG", "bC"); - rightClickDelayTimer = getField(Minecraft.class, "rightClickDelayTimer", "field_71467_ac", "as"); - blockHitDelay = getField(PlayerControllerMP.class, "blockHitDelay", "field_78781_i", "g"); - curBlockDamageMP = getField(PlayerControllerMP.class, "curBlockDamageMP", "field_78770_f", "e"); - cPacketPlayer_onGround = getField(CPacketPlayer.class, "onGround", "field_149474_g", "f"); - parentScreen = getField(GuiDisconnected.class, "parentScreen", "field_146307_h", "h"); - DEFAULT_RESOURCE_DOMAINS = getField(DefaultResourcePack.class, "DEFAULT_RESOURCE_DOMAINS", "field_110608_a", "a"); - cPacketVehicleMove_y = getField(CPacketVehicleMove.class, "y", "field_187008_b", "b"); - currentPlayerItem = getField(PlayerControllerMP.class, "currentPlayerItem", "field_78777_l", "j"); - languageMap_instance = getField(LanguageMap.class, "instance", "field_74817_a", "c"); - languageMap_languageList = getField(LanguageMap.class, "languageList", "field_74816_c", "d"); - - updateFallState = getMethod(Entity.class, new String[]{"updateFallState", "func_184231_a", "a"}, double.class, boolean.class, IBlockState.class, BlockPos.class); - rightClickMouse = getMethod(Minecraft.class, new String[]{"rightClickMouse", "func_147121_ag", "aB"}); - - setDEFAULT_RESOURCE_DOMAINS(ImmutableSet.builder().addAll(DefaultResourcePack.DEFAULT_RESOURCE_DOMAINS).add("wdl").build()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SuppressWarnings("unchecked") - public static Map getLanguageMapMap() { - try { - return (Map) languageMap_languageList.get(languageMap_instance.get(null)); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static LanguageMap getLanguageMap() { - try { - return (LanguageMap) languageMap_instance.get(null); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static void setCurrentPlayerItem(int i) { - try { - currentPlayerItem.setInt(mc.playerController, i); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static double getCPacketVehicleMove_y(CPacketVehicleMove n) { - try { - return cPacketVehicleMove_y.getDouble(n); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static void setcPacketVehicleMove_y(CPacketVehicleMove n, double y) { - try { - cPacketVehicleMove_y.setDouble(n, y); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static void setDEFAULT_RESOURCE_DOMAINS(Set n) { - try { - DEFAULT_RESOURCE_DOMAINS.set(null, n); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static GuiScreen getParentScreen(GuiDisconnected disconnected) { - try { - return (GuiScreen) parentScreen.get(disconnected); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public static void rightClickMouse() { - try { - rightClickMouse.invoke(mc); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setcPacketPlayer_onGround(CPacketPlayer packet, boolean onGround) { - try { - cPacketPlayer_onGround.setBoolean(packet, onGround); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static boolean getPressed(KeyBinding binding) { - try { - return pressed.getBoolean(binding); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static float getCurBlockDamageMP() { - try { - return curBlockDamageMP.getFloat(mc.playerController); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setCurBlockDamageMP(float val) { - try { - curBlockDamageMP.setFloat(mc.playerController, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static int getBlockHitDelay() { - try { - return blockHitDelay.getInt(mc.playerController); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setBlockHitDelay(int val) { - try { - blockHitDelay.setInt(mc.playerController, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setRightClickDelayTimer(int val) { - try { - rightClickDelayTimer.setInt(mc, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setInWater(Entity entity, boolean y) { - try { - inWater.setBoolean(entity, y); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setLandMovementFactor(EntityLivingBase entity, float y) { - try { - landMovementFactor.setFloat(entity, y); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setCPacketPlayer_x(CPacketPlayer packet, double x) { - try { - cPacketPlayer_x.setDouble(packet, x); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setCPacketPlayer_y(CPacketPlayer packet, double y) { - try { - cPacketPlayer_y.setDouble(packet, y); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setCPacketPlayer_z(CPacketPlayer packet, double z) { - try { - cPacketPlayer_z.setDouble(packet, z); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setHorseJumpPower(float value) { - try { - horseJumpPower.setFloat(mc.player, value); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void updateEntityFallState(Entity e, double d, boolean b, IBlockState state, BlockPos pos) { - try { - updateFallState.invoke(e, d, b, state, pos); - } catch (Exception exception) { - exception.printStackTrace(); - throw new IllegalStateException(exception); - } - } - - public static Entity getRidingEntity(Entity toGetFrom) { - try { - return (Entity) ridingEntity.get(toGetFrom); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setPressed(KeyBinding keyBinding, boolean state) { - try { - pressed.setBoolean(keyBinding, state); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static RenderItem getItemRenderer() { - try { - return (RenderItem) itemRenderer.get(mc.getItemRenderer()); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static int getDebugFps() { - try { - return debugFps.getInt(null); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static AxisAlignedBB getBoundingBox(Entity entity) { - try { - return (AxisAlignedBB) boundingBox.get(entity); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static Timer getTimer() { - try { - return (Timer) timer.get(mc); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setY_vec3d(Vec3d vec, double val) { - try { - y_vec3d.setDouble(vec, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMinX(AxisAlignedBB bb) { - try { - return minX.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMinY(AxisAlignedBB bb) { - try { - return minY.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMinZ(AxisAlignedBB bb) { - try { - return minZ.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMaxX(AxisAlignedBB bb) { - try { - return maxX.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMaxY(AxisAlignedBB bb) { - try { - return maxY.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getMaxZ(AxisAlignedBB bb) { - try { - return maxZ.getDouble(bb); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMinX(AxisAlignedBB bb, double val) { - try { - minX.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMinY(AxisAlignedBB bb, double val) { - try { - minY.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMinZ(AxisAlignedBB bb, double val) { - try { - minZ.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMaxX(AxisAlignedBB bb, double val) { - try { - maxX.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMaxY(AxisAlignedBB bb, double val) { - try { - maxY.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static void setMaxZ(AxisAlignedBB bb, double val) { - try { - maxZ.setDouble(bb, val); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static DataParameter getPLAYER_MODEL_FLAG() { - try { - return (DataParameter) PLAYER_MODEL_FLAG.get(null); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosX(RenderManager mgr) { - try { - return renderPosX.getDouble(mgr); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosY(RenderManager mgr) { - try { - return renderPosY.getDouble(mgr); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosZ(RenderManager mgr) { - try { - return renderPosZ.getDouble(mgr); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosX() { - try { - return renderPosX.getDouble(mc.getRenderManager()); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosY() { - try { - return renderPosY.getDouble(mc.getRenderManager()); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static double getRenderPosZ() { - try { - return renderPosZ.getDouble(mc.getRenderManager()); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static boolean getSleeping(EntityPlayer mgr) { - try { - return sleeping.getBoolean(mgr); - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/RenderColor.java b/src/main/java/net/daporkchop/pepsimod/util/RenderColor.java deleted file mode 100644 index acef8a1..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/RenderColor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util; - -import org.lwjgl.opengl.GL11; - -public class RenderColor { - public static void glColor(int r, int g, int b) { - glColor(r, g, b, 255); - } - - public static void glColor(int r, int g, int b, int a) { - GL11.glColor4b((byte) Math.floorDiv(r, 2), (byte) Math.floorDiv(g, 2), (byte) Math.floorDiv(b, 2), (byte) Math.floorDiv(a, 2)); - } - - public byte r; - public byte g; - public byte b; - public byte a; - public int rOrig; - public int gOrig; - public int bOrig; - public int aOrig; - - public RenderColor(int r, int g, int b, int a) { - this.r = (byte) Math.floorDiv(r, 2); - this.g = (byte) Math.floorDiv(g, 2); - this.b = (byte) Math.floorDiv(b, 2); - this.a = (byte) Math.floorDiv(a, 2); - this.rOrig = r; - this.gOrig = g; - this.bOrig = b; - this.aOrig = a; - } - - public int getIntColor() { - return (this.a & 255) << 24 | (this.r & 255) << 16 | (this.g & 255) << 8 | (this.b & 255); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorUtils.java b/src/main/java/net/daporkchop/pepsimod/util/colors/ColorUtils.java deleted file mode 100644 index 5aff52a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -import java.awt.Color; - -public class ColorUtils { - public static final int BUTTON_OFF_OFF = new Color(255, 32, 32).getRGB(); - public static final int BUTTON_ON_OFF = new Color(244, 66, 66).getRGB(); - public static final int BUTTON_OFF_ON = new Color(43, 120, 255).getRGB(); - public static final int BUTTON_ON_ON = new Color(88, 143, 239).getRGB(); - public static final int WINDOW_ON = new Color(255, 255, 255).getRGB(); - public static final int WINDOW_OFF = new Color(183, 183, 183).getRGB(); - public static final int BACKGROUND = new Color(128, 128, 128).getRGB(); - public static final int TYPE_BUTTON = 0; - public static final int TYPE_WINDOW = 1; - public static final int TYPE_SLIDER = 2; - public static final int TYPE_BG = 3; - - public static int getColorForGuiEntry(int type, boolean hovered, boolean state) { - switch (type) { - case TYPE_BUTTON: - if (hovered) { - return state ? BUTTON_ON_ON : BUTTON_ON_OFF; - } else { - return state ? BUTTON_OFF_ON : BUTTON_OFF_OFF; - } - case TYPE_WINDOW: - return hovered ? WINDOW_ON : WINDOW_OFF; - case TYPE_SLIDER: - return hovered ? BUTTON_ON_ON : BUTTON_OFF_ON; - default: - throw new IllegalStateException("Invalid type: " + type); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedElement.java b/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedElement.java deleted file mode 100644 index e2fcce6..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedElement.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -public abstract class ColorizedElement { - public int width; - public String text; -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedText.java b/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedText.java deleted file mode 100644 index 9687185..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/ColorizedText.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.client.gui.Gui; - -public abstract class ColorizedText extends PepsiConstants { - public abstract int width(); - - public abstract void drawAtPos(Gui screen, int x, int y); - - public abstract String getRawText(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/FixedColorElement.java b/src/main/java/net/daporkchop/pepsimod/util/colors/FixedColorElement.java deleted file mode 100644 index c793734..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/FixedColorElement.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -import net.minecraft.client.Minecraft; - -public class FixedColorElement extends ColorizedElement { - public final int color; - - public FixedColorElement(int color, String text) { - this.color = color; - this.text = text; - this.width = Minecraft.getMinecraft().fontRenderer.getStringWidth(text); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/GradientText.java b/src/main/java/net/daporkchop/pepsimod/util/colors/GradientText.java deleted file mode 100644 index 4bc3f95..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/GradientText.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; - -public class GradientText extends ColorizedText { - public final FixedColorElement[] elements; - public final int width; - public String text = ""; - - public GradientText(FixedColorElement[] elements, int width) { - this.elements = elements; - this.width = width; - for (FixedColorElement element : elements) { - this.text += element.text; - } - } - - public void drawAtPos(Gui screen, int x, int y) { - int i = 0; - for (FixedColorElement element : this.elements) { - screen.drawString(Minecraft.getMinecraft().fontRenderer, element.text, x + i, y, element.color); - i += element.width; - } - } - - public void drawWithEndAtPos(Gui screen, int x, int y) { - int i = 0; - for (FixedColorElement element : this.elements) { - i -= element.width; - } - for (FixedColorElement element : this.elements) { - screen.drawString(Minecraft.getMinecraft().fontRenderer, element.text, x + i, y, element.color); - i += element.width; - } - } - - public int width() { - return this.width; - } - - public String getRawText() { - return this.text; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/PlainColorElement.java b/src/main/java/net/daporkchop/pepsimod/util/colors/PlainColorElement.java deleted file mode 100644 index 16489db..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/PlainColorElement.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors; - -import static net.daporkchop.pepsimod.util.PepsiConstants.mc; - -public class PlainColorElement extends ColorizedElement { - public PlainColorElement(String text) { - this.text = text; - this.width = mc.fontRenderer.getStringWidth(text); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/ColorChangeType.java b/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/ColorChangeType.java deleted file mode 100644 index bd6f5f1..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/ColorChangeType.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors.rainbow; - -public enum ColorChangeType { - INCREASE, - DECRASE, - NONE -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowCycle.java b/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowCycle.java deleted file mode 100644 index 94f02f3..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowCycle.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors.rainbow; - -public class RainbowCycle implements Cloneable { - public ColorChangeType red = ColorChangeType.INCREASE; - public ColorChangeType green = ColorChangeType.NONE; - public ColorChangeType blue = ColorChangeType.NONE; - public int r = 0; - public int g = 0; - public int b = 0; - - public RainbowCycle clone() { - try { - return (RainbowCycle) super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - return this; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowText.java b/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowText.java deleted file mode 100644 index b91db43..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/colors/rainbow/RainbowText.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.colors.rainbow; - -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.colors.ColorizedElement; -import net.daporkchop.pepsimod.util.colors.ColorizedText; -import net.daporkchop.pepsimod.util.colors.FixedColorElement; -import net.daporkchop.pepsimod.util.colors.PlainColorElement; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.Gui; - -import java.awt.Color; - -public class RainbowText extends ColorizedText { - private final ColorizedElement[] elements; - private final int width; - private final FontRenderer fontRenderer; - public String text; - private int offset; - - public RainbowText(String text) { - this(text, 0); - } - - public RainbowText(String text, int offset) { - this.fontRenderer = mc.fontRenderer; - this.offset = offset; - String[] split = text.split(PepsiUtils.COLOR_ESCAPE + "custom"); - String[] split2 = split[0].split(""); - this.elements = new ColorizedElement[split2.length + (split.length > 1 ? 1 : 0)]; - for (int i = 0; i < split2.length; i++) { - this.elements[i] = new PlainColorElement(split2[i]); - } - if (split.length > 1) { - this.elements[this.elements.length - 1] = new FixedColorElement(Integer.parseInt(split[1].substring(0, Math.min(split[1].length(), 6)), 16), split[1].substring(6)); - int i = 0; - for (ColorizedElement element : this.elements) { - i += element.width; - } - this.width = i; - this.text = split[0] + split[1].substring(6); - } else { - this.width = this.fontRenderer.getStringWidth(text); - } - this.text = text; - } - - //int debug = 0; - public void drawAtPos(Gui screen, int x, int y) { - int i = 0; - RainbowCycle cycle = PepsiUtils.rainbowCycle(this.offset, PepsiUtils.rainbowCycle.clone()); - for (ColorizedElement element : this.elements) { - if (element instanceof FixedColorElement) { - screen.drawString(Minecraft.getMinecraft().fontRenderer, element.text, x + i, y, ((FixedColorElement) element).color); - return; - } - cycle = PepsiUtils.rainbowCycle(1, cycle); - Color color = new Color(PepsiUtils.ensureRange(cycle.r, 0, 255), PepsiUtils.ensureRange(cycle.g, 0, 255), PepsiUtils.ensureRange(cycle.b, 0, 255)); - screen.drawString(Minecraft.getMinecraft().fontRenderer, element.text, x + i, y, color.getRGB()); - i += element.width; - } - } - - public void drawAtPos(Gui screen, int x, int y, int offset) { - int tempOffset = this.offset; - this.offset = offset; - this.drawAtPos(screen, x, y); - this.offset = tempOffset; - } - - public int width() { - return this.width; - } - - public String getRawText() { - return this.text; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/BaseImplTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/BaseImplTranslator.java deleted file mode 100644 index fa25339..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/BaseImplTranslator.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config; - -import com.google.gson.JsonObject; - -public class BaseImplTranslator implements IConfigTranslator { - public static final BaseImplTranslator INSTANCE = new BaseImplTranslator(); - - private BaseImplTranslator() { - - } - - public void encode(JsonObject json) { - - } - - public void decode(String fieldName, JsonObject json) { - - } - - public String name() { - return "delet_this"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/Config.java b/src/main/java/net/daporkchop/pepsimod/util/config/Config.java deleted file mode 100644 index 55104ad..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/Config.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import net.daporkchop.pepsimod.util.config.impl.AnnouncerTranslator; -import net.daporkchop.pepsimod.util.config.impl.AntiAFKTranslator; -import net.daporkchop.pepsimod.util.config.impl.AutoEatTranslator; -import net.daporkchop.pepsimod.util.config.impl.BedBomberTranslator; -import net.daporkchop.pepsimod.util.config.impl.ClickGUITranslator; -import net.daporkchop.pepsimod.util.config.impl.CpuLimitTranslator; -import net.daporkchop.pepsimod.util.config.impl.CriticalsTranslator; -import net.daporkchop.pepsimod.util.config.impl.CrystalAuraTranslator; -import net.daporkchop.pepsimod.util.config.impl.ESPTranslator; -import net.daporkchop.pepsimod.util.config.impl.ElytraFlyTranslator; -import net.daporkchop.pepsimod.util.config.impl.EntitySpeedTranslator; -import net.daporkchop.pepsimod.util.config.impl.FlightTranslator; -import net.daporkchop.pepsimod.util.config.impl.FreecamTranslator; -import net.daporkchop.pepsimod.util.config.impl.FriendsTranslator; -import net.daporkchop.pepsimod.util.config.impl.GeneralTranslator; -import net.daporkchop.pepsimod.util.config.impl.HUDTranslator; -import net.daporkchop.pepsimod.util.config.impl.NameTagsTranslator; -import net.daporkchop.pepsimod.util.config.impl.NoWeatherTranslator; -import net.daporkchop.pepsimod.util.config.impl.NotificationsTranslator; -import net.daporkchop.pepsimod.util.config.impl.SpeedmineTranslator; -import net.daporkchop.pepsimod.util.config.impl.StepTranslator; -import net.daporkchop.pepsimod.util.config.impl.TargettingTranslator; -import net.daporkchop.pepsimod.util.config.impl.TimerTranslator; -import net.daporkchop.pepsimod.util.config.impl.TracersTranslator; -import net.daporkchop.pepsimod.util.config.impl.VelocityTranslator; -import net.daporkchop.pepsimod.util.config.impl.XrayTranslator; -import net.minecraftforge.fml.common.FMLLog; - -import java.util.Hashtable; -import java.util.Map; - -public class Config { - private static Hashtable translators = new Hashtable<>(); - - static { - registerConfigTranslator(AnnouncerTranslator.INSTANCE); - registerConfigTranslator(AntiAFKTranslator.INSTANCE); - registerConfigTranslator(AutoEatTranslator.INSTANCE); - registerConfigTranslator(BedBomberTranslator.INSTANCE); - registerConfigTranslator(ClickGUITranslator.INSTANCE); - registerConfigTranslator(CpuLimitTranslator.INSTANCE); - registerConfigTranslator(CriticalsTranslator.INSTANCE); - registerConfigTranslator(CrystalAuraTranslator.INSTANCE); - registerConfigTranslator(ElytraFlyTranslator.INSTANCE); - registerConfigTranslator(EntitySpeedTranslator.INSTANCE); - registerConfigTranslator(ESPTranslator.INSTANCE); - registerConfigTranslator(FlightTranslator.INSTANCE); - registerConfigTranslator(FreecamTranslator.INSTANCE); - registerConfigTranslator(FriendsTranslator.INSTANCE); - registerConfigTranslator(GeneralTranslator.INSTANCE); - registerConfigTranslator(HUDTranslator.INSTANCE); - registerConfigTranslator(NameTagsTranslator.INSTANCE); - registerConfigTranslator(NotificationsTranslator.INSTANCE); - registerConfigTranslator(NoWeatherTranslator.INSTANCE); - registerConfigTranslator(SpeedmineTranslator.INSTANCE); - registerConfigTranslator(StepTranslator.INSTANCE); - registerConfigTranslator(TargettingTranslator.INSTANCE); - registerConfigTranslator(TimerTranslator.INSTANCE); - registerConfigTranslator(TracersTranslator.INSTANCE); - registerConfigTranslator(VelocityTranslator.INSTANCE); - registerConfigTranslator(XrayTranslator.INSTANCE); - } - - public static void registerConfigTranslator(IConfigTranslator element) { - translators.put(element.name(), element); - } - - public static void loadConfig(String configJson) { - System.out.println("Loading config!"); - System.out.println(configJson); - - JsonObject object = null; - try { - object = new JsonParser().parse(configJson).getAsJsonObject(); - } catch (IllegalStateException e) { - //Thrown when the config is an empty string - FMLLog.info("Using default config because the file is empty or unreadable"); - return; - } - for (Map.Entry entry : object.entrySet()) { - translators.getOrDefault(entry.getKey(), NullConfigTranslator.INSTANCE).decode(entry.getKey(), entry.getValue().getAsJsonObject()); - } - } - - public static String saveConfig() { - JsonObject object = new JsonObject(); - - for (IConfigTranslator translator : translators.values()) { - JsonObject elementObj = new JsonObject(); - translator.encode(elementObj); - object.add(translator.name(), elementObj); - } - - return new Gson().toJson(object); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/IConfigTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/IConfigTranslator.java deleted file mode 100644 index ab896d4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/IConfigTranslator.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -public interface IConfigTranslator { - void encode(JsonObject json); - - void decode(String fieldName, JsonObject json); - - String name(); - - default int getInt(JsonObject object, String name, int def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().intValue(); - } - } - - return def; - } - - default short getShort(JsonObject object, String name, short def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().shortValue(); - } - } - - return def; - } - - default byte getByte(JsonObject object, String name, byte def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().byteValue(); - } - } - - return def; - } - - default long getLong(JsonObject object, String name, long def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().longValue(); - } - } - - return def; - } - - default float getFloat(JsonObject object, String name, float def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().floatValue(); - } - } - - return def; - } - - default double getDouble(JsonObject object, String name, double def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - return element.getAsJsonPrimitive().getAsNumber().doubleValue(); - } - } - - return def; - } - - default boolean getBoolean(JsonObject object, String name, boolean def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isBoolean()) { - return element.getAsJsonPrimitive().getAsBoolean(); - } - } - - return def; - } - - default String getString(JsonObject object, String name, String def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) { - return element.getAsJsonPrimitive().getAsString(); - } - } - - return def; - } - - default JsonArray getArray(JsonObject object, String name, JsonArray def) { - if (object.has(name)) { - JsonElement element = object.get(name); - if (element.isJsonArray()) { - return element.getAsJsonArray(); - } - } - - return def; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/NullConfigTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/NullConfigTranslator.java deleted file mode 100644 index 40e24ba..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/NullConfigTranslator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config; - -import com.google.gson.JsonObject; - -/** - * A config translator that does nothing with the given data - */ -public class NullConfigTranslator implements IConfigTranslator { - public static final IConfigTranslator INSTANCE = new NullConfigTranslator(); - - private NullConfigTranslator() { - - } - - public void encode(JsonObject json) { - - } - - public void decode(String fieldName, JsonObject json) { - System.out.println("[Warning] Config element with name " + fieldName + "is being ignored, discarding " + json.entrySet().size() + " values!"); - } - - public String name() { - return null; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AnnouncerTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/AnnouncerTranslator.java deleted file mode 100644 index 1a45fbd..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AnnouncerTranslator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class AnnouncerTranslator implements IConfigTranslator { - public static final AnnouncerTranslator INSTANCE = new AnnouncerTranslator(); - public boolean clientSide = false; - public boolean join = false; - public boolean leave = false; - public boolean eat = false; - public boolean walk = false; - public boolean mine = false; - public boolean place = false; - public int delay = 5000; - - private AnnouncerTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("clientSide", this.clientSide); - json.addProperty("join", this.join); - json.addProperty("leave", this.leave); - json.addProperty("eat", this.eat); - json.addProperty("walk", this.walk); - json.addProperty("mine", this.mine); - json.addProperty("place", this.place); - json.addProperty("delay", this.delay); - } - - public void decode(String fieldName, JsonObject json) { - this.clientSide = this.getBoolean(json, "clientSide", this.clientSide); - this.join = this.getBoolean(json, "join", this.join); - this.leave = this.getBoolean(json, "leave", this.leave); - this.eat = this.getBoolean(json, "eat", this.eat); - this.walk = this.getBoolean(json, "walk", this.walk); - this.mine = this.getBoolean(json, "mine", this.mine); - this.place = this.getBoolean(json, "place", this.place); - this.delay = this.getInt(json, "delay", this.delay); - } - - public String name() { - return "announcer"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AntiAFKTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/AntiAFKTranslator.java deleted file mode 100644 index 9bdf469..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AntiAFKTranslator.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class AntiAFKTranslator implements IConfigTranslator { - public static final AntiAFKTranslator INSTANCE = new AntiAFKTranslator(); - - //spinning - public boolean spin = false; - public boolean sneak = true; - public boolean swingArm = true; - public boolean move = false; - public boolean strafe = false; - - public int delay = 5000; - public boolean requireInactive = true; - - private AntiAFKTranslator() { - } - - public void encode(JsonObject json) { - json.addProperty("spin", this.spin); - json.addProperty("sneak", this.sneak); - json.addProperty("swingArm", this.swingArm); - json.addProperty("move", this.move); - json.addProperty("strafe", this.strafe); - json.addProperty("delay", this.delay); - json.addProperty("requireInactive", this.requireInactive); - } - - public void decode(String fieldName, JsonObject json) { - this.spin = this.getBoolean(json, "spin", this.spin); - this.sneak = this.getBoolean(json, "sneak", this.sneak); - this.swingArm = this.getBoolean(json, "swingArm", this.swingArm); - this.move = this.getBoolean(json, "move", this.move); - this.strafe = this.getBoolean(json, "strafe", this.strafe); - this.delay = this.getInt(json, "delay", this.delay); - this.requireInactive = this.getBoolean(json, "requireInactive", this.requireInactive); - } - - public String name() { - return "antiafk"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AutoEatTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/AutoEatTranslator.java deleted file mode 100644 index e0b8003..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/AutoEatTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class AutoEatTranslator implements IConfigTranslator { - public static final AutoEatTranslator INSTANCE = new AutoEatTranslator(); - public float threshold = 7f; - - private AutoEatTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("threshold", this.threshold); - } - - public void decode(String fieldName, JsonObject json) { - this.threshold = this.getFloat(json, "threshold", this.threshold); - } - - public String name() { - return "autoeat"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/BedBomberTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/BedBomberTranslator.java deleted file mode 100644 index a7ec2e2..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/BedBomberTranslator.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class BedBomberTranslator implements IConfigTranslator { - public static final BedBomberTranslator INSTANCE = new BedBomberTranslator(); - public float range = 4.0f; - public int delay = 500; - public boolean resupply = true; - - private BedBomberTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("range", this.range); - json.addProperty("delay", this.delay); - json.addProperty("resupply", this.resupply); - } - - public void decode(String fieldName, JsonObject json) { - this.range = this.getFloat(json, "range", this.range); - this.delay = this.getInt(json, "delay", this.delay); - this.resupply = this.getBoolean(json, "resupply", this.resupply); - } - - public String name() { - return "bedbomber"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ClickGUITranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/ClickGUITranslator.java deleted file mode 100644 index c742023..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ClickGUITranslator.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.gui.clickgui.ClickGUI; -import net.daporkchop.pepsimod.gui.clickgui.Window; -import net.daporkchop.pepsimod.gui.clickgui.api.IEntry; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class ClickGUITranslator implements IConfigTranslator { - public static final ClickGUITranslator INSTANCE = new ClickGUITranslator(); - - private ClickGUITranslator() { - - } - - public void encode(JsonObject json) { - for (Window window : ClickGUI.INSTANCE.windows) { - json.addProperty(window.text + ".x", window.x); - json.addProperty(window.text + ".y", window.y); - json.addProperty(window.text + ".open", window.isOpen()); - - for (IEntry entry : window.entries) { - json.addProperty(window.text + '.' + entry.getName() + ".open", entry.isOpen()); - } - } - } - - public void decode(String fieldName, JsonObject json) { - for (Window window : ClickGUI.INSTANCE.windows) { - window.setX(this.getInt(json, window.text + ".x", window.x)); - window.setY(this.getInt(json, window.text + ".y", window.y)); - window.setOpen(this.getBoolean(json, window.text + ".open", window.isOpen())); - - for (IEntry entry : window.entries) { - entry.setOpen(this.getBoolean(json, window.text + '.' + entry.getName() + ".open", entry.isOpen())); - } - } - } - - public String name() { - return "clickgui"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CpuLimitTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/CpuLimitTranslator.java deleted file mode 100644 index aa5aa36..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CpuLimitTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class CpuLimitTranslator implements IConfigTranslator { - public static final CpuLimitTranslator INSTANCE = new CpuLimitTranslator(); - public int limit = 5; - - private CpuLimitTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("limit", this.limit); - } - - public void decode(String fieldName, JsonObject json) { - this.limit = this.getInt(json, "limit", this.limit); - } - - public String name() { - return "cpuLimit"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CriticalsTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/CriticalsTranslator.java deleted file mode 100644 index 3864144..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CriticalsTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class CriticalsTranslator implements IConfigTranslator { - public static final CriticalsTranslator INSTANCE = new CriticalsTranslator(); - public boolean packet = true; - - private CriticalsTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("packet", this.packet); - } - - public void decode(String fieldName, JsonObject json) { - this.packet = this.getBoolean(json, "packet", this.packet); - } - - public String name() { - return "criticals"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CrystalAuraTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/CrystalAuraTranslator.java deleted file mode 100644 index 49c51fa..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/CrystalAuraTranslator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class CrystalAuraTranslator implements IConfigTranslator { - public static final CrystalAuraTranslator INSTANCE = new CrystalAuraTranslator(); - public float speed = 1.0f; - public float range = 3.8f; - - private CrystalAuraTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("speed", this.speed); - json.addProperty("range", this.range); - } - - public void decode(String fieldName, JsonObject json) { - this.speed = this.getFloat(json, "speed", this.speed); - this.range = this.getFloat(json, "range", this.range); - } - - public String name() { - return "crystalaura"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ESPTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/ESPTranslator.java deleted file mode 100644 index 48d5f05..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ESPTranslator.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class ESPTranslator implements IConfigTranslator { - public static final ESPTranslator INSTANCE = new ESPTranslator(); - public boolean basic = false; - public boolean trapped = false; - public boolean ender = false; - public boolean hopper = false; - public boolean furnace = false; - - public boolean monsters = false; - public boolean animals = false; - public boolean players = false; - public boolean golems = false; - public boolean invisible = false; - public boolean friendColors = true; - public boolean box = false; - - private ESPTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("basic", this.basic); - json.addProperty("trapped", this.trapped); - json.addProperty("ender", this.ender); - json.addProperty("hopper", this.hopper); - json.addProperty("furnace", this.furnace); - - json.addProperty("monsters", this.monsters); - json.addProperty("animals", this.animals); - json.addProperty("players", this.players); - json.addProperty("golems", this.golems); - json.addProperty("invisible", this.invisible); - json.addProperty("friendColors", this.friendColors); - json.addProperty("box", this.box); - } - - public void decode(String fieldName, JsonObject json) { - this.basic = this.getBoolean(json, "basic", this.basic); - this.trapped = this.getBoolean(json, "trapped", this.trapped); - this.ender = this.getBoolean(json, "ender", this.ender); - this.hopper = this.getBoolean(json, "hopper", this.hopper); - this.furnace = this.getBoolean(json, "furnace", this.furnace); - - this.monsters = this.getBoolean(json, "monsters", this.monsters); - this.animals = this.getBoolean(json, "animals", this.animals); - this.players = this.getBoolean(json, "players", this.players); - this.golems = this.getBoolean(json, "golems", this.golems); - this.invisible = this.getBoolean(json, "invisible", this.invisible); - this.friendColors = this.getBoolean(json, "friendColors", this.friendColors); - this.box = this.getBoolean(json, "box", this.box); - } - - public String name() { - return "esp"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ElytraFlyTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/ElytraFlyTranslator.java deleted file mode 100644 index 3d35d5f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/ElytraFlyTranslator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class ElytraFlyTranslator implements IConfigTranslator { - public static final ElytraFlyTranslator INSTANCE = new ElytraFlyTranslator(); - public boolean easyStart = false; - public boolean stopInWater = true; - public boolean fly = false; - public float speed = 0.2f; - public ElytraFlyMode mode = ElytraFlyMode.getMode(0); - - private ElytraFlyTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("easyStart", this.easyStart); - json.addProperty("stopInWater", this.stopInWater); - json.addProperty("fly", this.fly); - json.addProperty("speed", this.speed); - json.addProperty("mode", this.mode.ordinal()); - } - - public void decode(String fieldName, JsonObject json) { - this.easyStart = this.getBoolean(json, "easyStart", this.easyStart); - this.stopInWater = this.getBoolean(json, "stopInWater", this.stopInWater); - this.fly = this.getBoolean(json, "fly", this.fly); - this.speed = this.getFloat(json, "speed", this.speed); - this.mode = ElytraFlyMode.getMode(this.getInt(json, "mode", this.mode.ordinal())); - } - - public String name() { - return "elytraFly"; - } - - public enum ElytraFlyMode { - NORMAL, - PACKET; - - public static ElytraFlyMode getMode(int id) { - return values()[id]; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/EntitySpeedTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/EntitySpeedTranslator.java deleted file mode 100644 index 348f6ee..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/EntitySpeedTranslator.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class EntitySpeedTranslator implements IConfigTranslator { - public static final EntitySpeedTranslator INSTANCE = new EntitySpeedTranslator(); - public float speed = 1.0f; - public float idleSpeed = 1.0f; - - private EntitySpeedTranslator() { - } - - public void encode(JsonObject json) { - json.addProperty("speed", this.speed); - json.addProperty("idleSpeed", this.idleSpeed); - } - - public void decode(String fieldName, JsonObject json) { - this.speed = this.getFloat(json, "speed", this.speed); - this.idleSpeed = this.getFloat(json, "idleSpeed", this.idleSpeed); - } - - public String name() { - return "entityspeed"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FlightTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/FlightTranslator.java deleted file mode 100644 index 942b6a8..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FlightTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class FlightTranslator implements IConfigTranslator { - public static final FlightTranslator INSTANCE = new FlightTranslator(); - public float speed = 1.0f; - - private FlightTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("speed", this.speed); - } - - public void decode(String fieldName, JsonObject json) { - this.speed = this.getFloat(json, "speed", this.speed); - } - - public String name() { - return "flight"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FreecamTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/FreecamTranslator.java deleted file mode 100644 index 7ca07b6..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FreecamTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class FreecamTranslator implements IConfigTranslator { - public static final FreecamTranslator INSTANCE = new FreecamTranslator(); - public float speed = 1.0f; - - private FreecamTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("speed", this.speed); - } - - public void decode(String fieldName, JsonObject json) { - this.speed = this.getFloat(json, "speed", this.speed); - } - - public String name() { - return "freecam"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FriendsTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/FriendsTranslator.java deleted file mode 100644 index 3f2c224..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/FriendsTranslator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -public class FriendsTranslator implements IConfigTranslator { - public static final FriendsTranslator INSTANCE = new FriendsTranslator(); - public Set friends = new HashSet<>(); - - private FriendsTranslator() { - } - - public void encode(JsonObject json) { - JsonArray array = new JsonArray(); - for (UUID uuid : this.friends) { - JsonObject object = new JsonObject(); - object.addProperty("msb", uuid.getMostSignificantBits()); - object.addProperty("lsb", uuid.getLeastSignificantBits()); - array.add(object); - } - json.add("friends", array); - } - - public void decode(String fieldName, JsonObject json) { - JsonArray array = this.getArray(json, "friends", new JsonArray()); - for (JsonElement element : array) { - if (element.isJsonPrimitive()) { - //convert old format - this.friends.add(UUID.fromString(element.getAsString())); - } else { - JsonObject object = element.getAsJsonObject(); - this.friends.add(new UUID(object.get("msb").getAsLong(), object.get("lsb").getAsLong())); - } - } - } - - public boolean isFriend(Entity entity) { - return this.friends.contains(entity.getUniqueID()); - } - - public String name() { - return "friends"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/GeneralTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/GeneralTranslator.java deleted file mode 100644 index 568e8fb..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/GeneralTranslator.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.module.ModuleManager; -import net.daporkchop.pepsimod.module.api.Module; -import net.daporkchop.pepsimod.module.api.ModuleSortType; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -import java.util.HashMap; - -public class GeneralTranslator implements IConfigTranslator { - public static final GeneralTranslator INSTANCE = new GeneralTranslator(); - public boolean autoReconnect = false; - public HashMap states = new HashMap<>(); - public ModuleSortType sortType = ModuleSortType.SIZE; - public JsonObject json = new JsonObject(); - - private GeneralTranslator() { - - } - - public void encode(JsonObject json) { - for (Module module : ModuleManager.AVALIBLE_MODULES) { - json.addProperty("module.enabled." + module.nameFull, module.state.toString()); - } - json.addProperty("autoReconnect", this.autoReconnect); - json.addProperty("sortType", this.sortType.ordinal()); - } - - public void decode(String fieldName, JsonObject json) { - this.json = json; - this.autoReconnect = this.getBoolean(json, "autoReconnect", this.autoReconnect); - this.sortType = ModuleSortType.fromOrdinal(this.getInt(json, "sortType", this.sortType.ordinal())); - } - - public ModuleState getState(String name, ModuleState fallback) { - if (this.json.has("module.enabled." + name)) { - return ModuleState.fromString(this.json.get("module.enabled." + name).getAsString()); - } - - return fallback; - } - - public String name() { - return "general"; - } - - public static class ModuleState { - public static ModuleState DEFAULT = new ModuleState(false, false); - - public static ModuleState fromString(String from) { - String[] split = from.split(" "); - return new ModuleState(Boolean.parseBoolean(split[0]), Boolean.parseBoolean(split[1])); - } - public boolean enabled; - public boolean hidden; - - public ModuleState(boolean a, boolean b) { - this.enabled = a; - this.hidden = b; - } - - @Override - public String toString() { - return this.enabled + " " + this.hidden; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/HUDTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/HUDTranslator.java deleted file mode 100644 index 7cc1c89..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/HUDTranslator.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; -import org.lwjgl.opengl.GL11; - -public class HUDTranslator implements IConfigTranslator { - public static final HUDTranslator INSTANCE = new HUDTranslator(); - - public boolean drawLogo = true; - public boolean arrayList = true; - public boolean TPS = false; - public boolean coords = false; - public boolean netherCoords = false; - public boolean arrayListTop = true; - public boolean serverBrand = false; - public boolean rainbow = true; - public int r = 0; - public int g = 0; - public int b = 0; - public boolean direction = true; - public boolean armor = false; - public boolean effects = false; - public boolean fps = true; - public boolean ping = true; - public boolean clampTabList = false; - public int maxTabRows = 20; - //public int maxTabCols = 5; - public JsonObject json = new JsonObject(); - - private HUDTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("drawLogo", this.drawLogo); - json.addProperty("arrayList", this.arrayList); - json.addProperty("tps", this.TPS); - json.addProperty("coords", this.coords); - json.addProperty("netherCoords", this.netherCoords); - json.addProperty("arrayListTop", this.arrayListTop); - json.addProperty("serverBrand", this.serverBrand); - json.addProperty("rainbow", this.rainbow); - json.addProperty("r", this.r); - json.addProperty("g", this.g); - json.addProperty("b", this.b); - json.addProperty("direction", this.direction); - json.addProperty("armor", this.armor); - json.addProperty("effects", this.effects); - json.addProperty("fps", this.fps); - json.addProperty("ping", this.ping); - json.addProperty("clampTabList", this.clampTabList); - json.addProperty("maxTabRows", this.maxTabRows); - //json.addProperty("maxTabCols", this.maxTabCols); - } - - public void decode(String fieldName, JsonObject json) { - this.json = json; - } - - public void parseConfigLate() { - this.drawLogo = this.getBoolean(this.json, "drawLogo", this.drawLogo); - this.arrayList = this.getBoolean(this.json, "arrayList", this.arrayList); - this.TPS = this.getBoolean(this.json, "tps", this.TPS); - this.coords = this.getBoolean(this.json, "coords", this.coords); - this.netherCoords = this.getBoolean(this.json, "netherCoords", this.netherCoords); - this.arrayListTop = this.getBoolean(this.json, "arrayListTop", this.arrayListTop); - this.serverBrand = this.getBoolean(this.json, "serverBrand", this.serverBrand); - this.rainbow = this.getBoolean(this.json, "rainbow", this.rainbow); - this.r = this.getInt(this.json, "r", this.r); - this.g = this.getInt(this.json, "g", this.g); - this.b = this.getInt(this.json, "b", this.b); - this.direction = this.getBoolean(this.json, "direction", this.direction); - this.armor = this.getBoolean(this.json, "armor", this.armor); - this.effects = this.getBoolean(this.json, "effects", this.effects); - this.fps = this.getBoolean(this.json, "fps", this.fps); - this.ping = this.getBoolean(this.json, "ping", this.ping); - this.clampTabList = this.getBoolean(this.json, "clampTabList", this.clampTabList); - this.maxTabRows = this.getInt(this.json, "maxTabRows", this.maxTabRows); - //this.maxTabCols = this.getInt(this.json, "maxTabCols", this.maxTabCols); - } - - public String name() { - return "hud"; - } - - public void bindColor() { - byte r = (byte) Math.floorDiv(this.r, 2); - byte g = (byte) Math.floorDiv(this.g, 2); - byte b = (byte) Math.floorDiv(this.b, 2); - GL11.glColor3b(r, g, b); - } - - public int getColor() { - return (255) << 24 | (this.r & 255) << 16 | (this.g & 255) << 8 | (this.b & 255); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NameTagsTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/NameTagsTranslator.java deleted file mode 100644 index 3dd4b46..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NameTagsTranslator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class NameTagsTranslator implements IConfigTranslator { - public static final NameTagsTranslator INSTANCE = new NameTagsTranslator(); - - public float scale = 1.0f; - - private NameTagsTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("scale", this.scale); - } - - public void decode(String fieldName, JsonObject json) { - this.scale = this.getFloat(json, "scale", this.scale); - } - - public String name() { - return "nametags"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NoWeatherTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/NoWeatherTranslator.java deleted file mode 100644 index 5c1179e..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NoWeatherTranslator.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class NoWeatherTranslator implements IConfigTranslator { - public static final NoWeatherTranslator INSTANCE = new NoWeatherTranslator(); - public boolean disableRain = false; - public boolean changeTime = false; - public int time = 0; - - private NoWeatherTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("disableRain", this.disableRain); - json.addProperty("changeTime", this.changeTime); - json.addProperty("time", this.time); - } - - public void decode(String fieldName, JsonObject json) { - this.disableRain = this.getBoolean(json, "disableRain", this.disableRain); - this.changeTime = this.getBoolean(json, "changeTime", this.changeTime); - this.time = this.getInt(json, "time", this.time); - } - - public String name() { - return "noWeather"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NotificationsTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/NotificationsTranslator.java deleted file mode 100644 index 3d3e289..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/NotificationsTranslator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class NotificationsTranslator implements IConfigTranslator { - public static final NotificationsTranslator INSTANCE = new NotificationsTranslator(); - public boolean queue = false; - public boolean death = false; - public boolean chat = false; - public boolean player = false; - - private NotificationsTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("queue", this.queue); - json.addProperty("death", this.death); - json.addProperty("chat", this.chat); - json.addProperty("player", this.player); - } - - public void decode(String fieldName, JsonObject json) { - this.queue = this.getBoolean(json, "queue", this.queue); - this.death = this.getBoolean(json, "death", this.death); - this.chat = this.getBoolean(json, "chat", this.chat); - this.player = this.getBoolean(json, "player", this.player); - } - - public String name() { - return "notifications"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/SpeedmineTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/SpeedmineTranslator.java deleted file mode 100644 index 87e334f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/SpeedmineTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class SpeedmineTranslator implements IConfigTranslator { - public static final SpeedmineTranslator INSTANCE = new SpeedmineTranslator(); - public float speed = 0.4f; - - private SpeedmineTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("speed", this.speed); - } - - public void decode(String fieldName, JsonObject json) { - this.speed = this.getFloat(json, "speed", this.speed); - } - - public String name() { - return "speedmine"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/StepTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/StepTranslator.java deleted file mode 100644 index 11e05df..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/StepTranslator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class StepTranslator implements IConfigTranslator { - public static final StepTranslator INSTANCE = new StepTranslator(); - public boolean legit = false; - public int height = 1; - - private StepTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("legit", this.legit); - json.addProperty("height", this.height); - } - - public void decode(String fieldName, JsonObject json) { - this.legit = this.getBoolean(json, "legit", this.legit); - this.height = this.getInt(json, "height", this.height); - } - - public String name() { - return "step"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TargettingTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/TargettingTranslator.java deleted file mode 100644 index 5896ce9..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TargettingTranslator.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class TargettingTranslator implements IConfigTranslator { - public static final TargettingTranslator INSTANCE = new TargettingTranslator(); - public boolean players = false; - public boolean animals = false; - public boolean monsters = false; - public boolean golems = false; - public boolean sleeping = false; - public boolean invisible = false; - public boolean teams = false; - public boolean friends = false; - public boolean through_walls = false; - public boolean use_cooldown = false; - public boolean silent = false; - public boolean rotate = false; - public TargetBone targetBone = TargetBone.FEET; - public float fov = 360f; - public float reach = 4.25f; - public int delay = 20; - - private TargettingTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("players", this.players); - json.addProperty("animals", this.animals); - json.addProperty("monsters", this.monsters); - json.addProperty("golems", this.golems); - json.addProperty("sleeping", this.sleeping); - json.addProperty("invisible", this.invisible); - json.addProperty("teams", this.teams); - json.addProperty("friends", this.friends); - json.addProperty("through_walls", this.through_walls); - json.addProperty("use_cooldown", this.use_cooldown); - json.addProperty("silent", this.silent); - json.addProperty("rotate", this.rotate); - json.addProperty("bone", this.targetBone.ordinal()); - json.addProperty("fov", this.fov); - json.addProperty("reach", this.reach); - json.addProperty("delay", this.delay); - } - - public void decode(String fieldName, JsonObject json) { - this.players = this.getBoolean(json, "players", this.players); - this.animals = this.getBoolean(json, "animals", this.animals); - this.monsters = this.getBoolean(json, "monsters", this.monsters); - this.golems = this.getBoolean(json, "golems", this.golems); - this.sleeping = this.getBoolean(json, "sleeping", this.sleeping); - this.invisible = this.getBoolean(json, "invisible", this.invisible); - this.teams = this.getBoolean(json, "teams", this.teams); - this.friends = this.getBoolean(json, "friends", this.friends); - this.through_walls = this.getBoolean(json, "through_walls", this.through_walls); - this.use_cooldown = this.getBoolean(json, "use_cooldown", this.use_cooldown); - this.silent = this.getBoolean(json, "silent", this.silent); - this.rotate = this.getBoolean(json, "rotate", this.rotate); - this.targetBone = TargetBone.getBone(this.getInt(json, "bone", this.targetBone.ordinal())); - this.fov = this.getFloat(json, "fov", this.fov); - this.reach = this.getFloat(json, "reach", this.reach); - this.delay = this.getInt(json, "delay", this.delay); - } - - public String name() { - return "targetting"; - } - - public enum TargetBone { - HEAD, - FEET, - MIDDLE; - - public static TargetBone getBone(int id) { - return values()[id]; - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TimerTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/TimerTranslator.java deleted file mode 100644 index 63f467f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TimerTranslator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class TimerTranslator implements IConfigTranslator { - public static final TimerTranslator INSTANCE = new TimerTranslator(); - public float multiplier = 1.0f; - public boolean tpsSync = false; - - private TimerTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("multiplier", this.multiplier); - json.addProperty("tpsSync", this.tpsSync); - } - - public void decode(String fieldName, JsonObject json) { - this.multiplier = this.getFloat(json, "multiplier", this.multiplier); - this.tpsSync = this.getBoolean(json, "tpsSync", this.tpsSync); - } - - public String name() { - return "timer"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TracersTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/TracersTranslator.java deleted file mode 100644 index 62b2d51..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/TracersTranslator.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class TracersTranslator implements IConfigTranslator { - public static final TracersTranslator INSTANCE = new TracersTranslator(); - public boolean sleeping = false; - public boolean invisible = false; - public boolean friendColors = true; - public boolean animals = false; - public boolean monsters = false; - public boolean players = false; - public boolean items = false; - public boolean everything = false; - public boolean distanceColor = true; - public float width = 2.0f; - - private TracersTranslator() { - } - - public void encode(JsonObject json) { - json.addProperty("sleeping", this.sleeping); - json.addProperty("invisible", this.invisible); - json.addProperty("friendColors", this.friendColors); - json.addProperty("animals", this.animals); - json.addProperty("monsters", this.monsters); - json.addProperty("players", this.players); - json.addProperty("items", this.items); - json.addProperty("everything", this.everything); - json.addProperty("distanceColor", this.distanceColor); - json.addProperty("width", this.width); - } - - public void decode(String fieldName, JsonObject json) { - this.sleeping = this.getBoolean(json, "sleeping", this.sleeping); - this.invisible = this.getBoolean(json, "invisible", this.invisible); - this.friendColors = this.getBoolean(json, "friendColors", this.friendColors); - this.animals = this.getBoolean(json, "animals", this.animals); - this.monsters = this.getBoolean(json, "monsters", this.monsters); - this.players = this.getBoolean(json, "players", this.players); - this.items = this.getBoolean(json, "items", this.items); - this.everything = this.getBoolean(json, "everything", this.everything); - this.distanceColor = this.getBoolean(json, "distanceColor", this.distanceColor); - this.width = this.getFloat(json, "width", this.width); - } - - public String name() { - return "tracers"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/VelocityTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/VelocityTranslator.java deleted file mode 100644 index de6a80d..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/VelocityTranslator.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonObject; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; - -public class VelocityTranslator implements IConfigTranslator { - public static final VelocityTranslator INSTANCE = new VelocityTranslator(); - public float multiplier = 1.0f; - - private VelocityTranslator() { - - } - - public void encode(JsonObject json) { - json.addProperty("multiplier", this.multiplier); - } - - public void decode(String fieldName, JsonObject json) { - this.multiplier = this.getFloat(json, "multiplier", this.multiplier); - } - - public String name() { - return "velocity"; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/config/impl/XrayTranslator.java b/src/main/java/net/daporkchop/pepsimod/util/config/impl/XrayTranslator.java deleted file mode 100644 index 36532f8..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/config/impl/XrayTranslator.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.config.impl; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import net.daporkchop.pepsimod.optimization.BlockID; -import net.daporkchop.pepsimod.util.config.IConfigTranslator; -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; - -import java.util.stream.StreamSupport; - -public class XrayTranslator implements IConfigTranslator { - public static final XrayTranslator INSTANCE = new XrayTranslator(); - public IntOpenHashSet target_blocks = new IntOpenHashSet(); - - private XrayTranslator() { - } - - public void encode(JsonObject json) { - JsonArray array = new JsonArray(); - for (int id : this.target_blocks){ - array.add(Block.REGISTRY.getObjectById(id).getRegistryName().toString()); - } - json.add("targetBlocks_v2", array); - } - - public void decode(String fieldName, JsonObject json) { - this.target_blocks.clear(); - StreamSupport.stream(this.getArray(json, "targetBlocks", new JsonArray()).spliterator(), false) - .mapToInt(JsonElement::getAsInt) - .forEach(this.target_blocks::add); - StreamSupport.stream(this.getArray(json, "targetBlocks_v2", new JsonArray()).spliterator(), false) - .map(JsonElement::getAsString) - .map(ResourceLocation::new) - .map(Block.REGISTRY::getObject) - .map(BlockID.class::cast) - .mapToInt(BlockID::getBlockId) - .forEach(this.target_blocks::add); - this.target_blocks.trim(); - } - - public String name() { - return "xray"; - } - - public boolean isTargeted(Block block) { - return this.target_blocks.contains(((BlockID) block).getBlockId()); - } - - public boolean isTargeted(BlockID block) { - return this.target_blocks.contains(block.getBlockId()); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/event/MoveEvent.java b/src/main/java/net/daporkchop/pepsimod/util/event/MoveEvent.java deleted file mode 100644 index 9d669e7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/event/MoveEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.event; - -public class MoveEvent { - public double x = 0; - public double y = 0; - public double z = 0; -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/ITickListener.java b/src/main/java/net/daporkchop/pepsimod/util/misc/ITickListener.java deleted file mode 100644 index f8ea493..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/ITickListener.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc; - -public interface ITickListener { - void tick(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/IWurstRenderListener.java b/src/main/java/net/daporkchop/pepsimod/util/misc/IWurstRenderListener.java deleted file mode 100644 index 9e6dbf7..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/IWurstRenderListener.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc; - -public interface IWurstRenderListener { - void render(float partialTicks); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/MessagePrefixes.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/MessagePrefixes.java deleted file mode 100644 index f9a6b90..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/MessagePrefixes.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer; - -import java.util.Arrays; -import java.util.EnumMap; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; - -public class MessagePrefixes { - private static Map messageMakers = new EnumMap<>(TaskType.class); - - static { - messageMakers.put(TaskType.JOIN, new MessageMaker(new String[]{ - "Welcome, %1$s", - "Greetings, %1$s", - "Hi %1$s!", - "%1$s joined the game", - "Hey there, %1$s" - })); - messageMakers.put(TaskType.LEAVE, new MessageMaker(new String[]{ - "Bye, %1$s!", - "See ya later, %1$s", - "%1$s left the game" - })); - messageMakers.put(TaskType.BREAK, new MessageMaker(new String[]{ - "I just mined %2$d %1$s!", - "I just broke %2$d %1$s!" - })); - messageMakers.put(TaskType.PLACE, new MessageMaker(new String[]{ - "I just placed %2$d %1$s!" - })); - messageMakers.put(TaskType.EAT, new MessageMaker(new String[]{ - "I just ate %2$d %1$s!" - })); - messageMakers.put(TaskType.WALK, new MessageMaker(new String[]{ - "I just walked %1$.2f meters!", - "I just walked %1$.2f blocks!" - })); - } - - public static String getMessage(TaskType type, Object... args) { - return "> " + messageMakers.get(type).getMessage(args); - } - - private static class MessageMaker { - public String[] messages; - - public MessageMaker(String[] messages) { - this.messages = messages; - } - - public String getMessage(Object... args) { - return String.format(this.messages[ThreadLocalRandom.current().nextInt(this.messages.length)], args); - } - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/QueuedTask.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/QueuedTask.java deleted file mode 100644 index b348448..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/QueuedTask.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer; - -import net.daporkchop.pepsimod.util.PepsiConstants; - -public abstract class QueuedTask extends PepsiConstants { - public final TaskType type; - - public QueuedTask(TaskType type) { - this.type = type; - } - - public abstract String getMessage(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/TaskType.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/TaskType.java deleted file mode 100644 index 66c0bf4..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/TaskType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer; - -public enum TaskType { - PLACE, // - BREAK, // - JOIN, // - LEAVE, // - EAT, - WALK // -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBasic.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBasic.java deleted file mode 100644 index 4ccd7ae..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBasic.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer.impl; - -import net.daporkchop.pepsimod.util.misc.announcer.QueuedTask; -import net.daporkchop.pepsimod.util.misc.announcer.TaskType; - -public class TaskBasic extends QueuedTask { - public String message; - - public TaskBasic(TaskType type, String message) { - super(type); - this.message = message; - } - - public String getMessage() { - return this.message; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBlock.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBlock.java deleted file mode 100644 index b56f345..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskBlock.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer.impl; - -import net.daporkchop.pepsimod.util.misc.announcer.MessagePrefixes; -import net.daporkchop.pepsimod.util.misc.announcer.QueuedTask; -import net.daporkchop.pepsimod.util.misc.announcer.TaskType; -import net.minecraft.block.Block; - -public class TaskBlock extends QueuedTask { - public Block block; - public int count = 1; - - public TaskBlock(TaskType type, Block block) { - super(type); - this.block = block; - } - - public String getMessage() { - return MessagePrefixes.getMessage(this.type, this.block.getLocalizedName(), this.count); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskMove.java b/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskMove.java deleted file mode 100644 index b76533a..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/announcer/impl/TaskMove.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.announcer.impl; - -import net.daporkchop.pepsimod.module.impl.misc.AnnouncerMod; -import net.daporkchop.pepsimod.util.PepsiUtils; -import net.daporkchop.pepsimod.util.misc.announcer.MessagePrefixes; -import net.daporkchop.pepsimod.util.misc.announcer.QueuedTask; -import net.daporkchop.pepsimod.util.misc.announcer.TaskType; -import net.minecraft.util.math.Vec3d; - -public class TaskMove extends QueuedTask { - public double dist = 0.0d; - public Vec3d lastPos = null; - - public TaskMove(TaskType type) { - super(type); - this.lastPos = mc.player.getPositionVector(); - } - - public String getMessage() { - if (!AnnouncerMod.INSTANCE.state.enabled || this.dist == 0.0d) { - return null; - } - - return MessagePrefixes.getMessage(TaskType.WALK, this.dist); - } - - public void update(Vec3d nextPos) { - if (this.lastPos != null && nextPos != null) { - this.dist += this.lastPos.distanceTo(nextPos); - } - this.lastPos = nextPos; - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/DimensionWaypoints.java b/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/DimensionWaypoints.java deleted file mode 100644 index cd6905b..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/DimensionWaypoints.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.waypoints; - -import java.util.Hashtable; - -public class DimensionWaypoints { - public Hashtable waypoints = new Hashtable<>(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/ServerWaypoints.java b/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/ServerWaypoints.java deleted file mode 100644 index aa1a521..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/ServerWaypoints.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.waypoints; - -import java.util.Hashtable; - -public class ServerWaypoints { - public Hashtable waypoints = new Hashtable<>(); -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/Waypoint.java b/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/Waypoint.java deleted file mode 100644 index db6479e..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/misc/waypoints/Waypoint.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.misc.waypoints; - -import net.minecraft.util.math.Vec3d; - -public class Waypoint { - public final String name; - public final int x; - public final int y; - public final int z; - public final int dim; - public boolean shown; - - public Waypoint(String name, double x, double y, double z, int dim) { - this(name, x, y, z, true, dim); - } - - public Waypoint(String name, double x, double y, double z, boolean shown, int dim) { - this(name, (int) Math.floor(x), (int) Math.floor(y), (int) Math.floor(z), shown, dim); - } - - public Waypoint(String name, int x, int y, int z, int dim) { - this(name, x, y, z, true, dim); - } - - public Waypoint(String name, int x, int y, int z, boolean shown, int dim) { - this.name = name; - this.x = x; - this.y = y; - this.z = z; - this.shown = shown; - this.dim = dim; - } - - public Vec3d getPosition() { - return new Vec3d(this.x, this.y, this.z); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/render/Texture.java b/src/main/java/net/daporkchop/pepsimod/util/render/Texture.java deleted file mode 100644 index 5a5798f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/render/Texture.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.render; - -import net.daporkchop.lib.unsafe.PCleaner; -import net.daporkchop.pepsimod.util.PepsiConstants; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.DynamicTexture; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.ResourceLocation; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static org.lwjgl.opengl.GL11.GL_QUADS; - -/** - * Simple texture class, originally loaded a bufferedimage from file and stored a texture id like you would expect, but I decided to take advantage of Minecraft's resource shiz. - * There's a slight chance that this is skidded from Huzuni. - * kek - */ -public class Texture extends PepsiConstants implements AutoCloseable { - protected static DynamicTexture loadTexture(BufferedImage image) { - try { - return new DynamicTexture(image); - } catch (RuntimeException e) { - if ("No OpenGL context found in the current thread.".equalsIgnoreCase(e.getMessage())) { - //load async - try { - return mc.addScheduledTask(() -> new DynamicTexture(image)).get(); - } catch (InterruptedException | ExecutionException e1) { - throw new RuntimeException(e1); - } - } else { - throw e; - } - } - } - - public final ResourceLocation texture; - protected final PCleaner cleaner; - - public Texture(byte[] in) throws IOException { - this(new ByteArrayInputStream(in)); - } - - public Texture(InputStream in) throws IOException { - this(ImageIO.read(in)); - } - - public Texture(BufferedImage img) { - this(mc.getTextureManager().getDynamicTextureLocation(UUID.randomUUID().toString(), loadTexture(img)), true); - } - - public Texture(ResourceLocation texture) { - this(texture, false); - } - - public Texture(ResourceLocation texture, boolean clean) { - this.texture = texture; - this.cleaner = clean ? PCleaner.cleaner(this, () -> mc.addScheduledTask(() -> mc.getTextureManager().deleteTexture(texture))) : null; - } - - public void render(float x, float y, float width, float height) { - this.bindTexture(); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder renderer = tessellator.getBuffer(); - renderer.begin(GL_QUADS, DefaultVertexFormats.POSITION_TEX); - renderer.pos(x, y + height, 0F).tex(0, 1).endVertex(); - renderer.pos(x + width, y + height, 0F).tex(1, 1).endVertex(); - renderer.pos(x + width, y, 0F).tex(1, 0).endVertex(); - renderer.pos(x, y, 0F).tex(0, 0).endVertex(); - tessellator.draw(); - } - - public void bindTexture() { - mc.getTextureManager().bindTexture(this.texture); - GlStateManager.enableTexture2D(); - } - - @Override - public void close() { - if (this.cleaner != null) { - this.cleaner.clean(); - } - } - - @Override - public String toString() { - return this.texture.getPath(); - } -} diff --git a/src/main/java/net/daporkchop/pepsimod/util/render/WorldRenderer.java b/src/main/java/net/daporkchop/pepsimod/util/render/WorldRenderer.java deleted file mode 100644 index 5e85e5f..0000000 --- a/src/main/java/net/daporkchop/pepsimod/util/render/WorldRenderer.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Adapted from the Wizardry License - * - * Copyright (c) 2017-2019 DaPorkchop_ - * - * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. - * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. - * - * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. - * - * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -package net.daporkchop.pepsimod.util.render; - -import net.daporkchop.pepsimod.util.RenderColor; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.Vec3d; -import org.lwjgl.opengl.GL11; - -import java.awt.*; - -import static org.lwjgl.opengl.GL11.*; - -/** - * Helps with drawing things in the world. - * - * @author DaPorkchop_ - */ -public class WorldRenderer implements AutoCloseable { - protected final double startX; - protected final double startY; - protected final double startZ; - - protected final double x; - protected final double y; - protected final double z; - - protected final float partialTicks; - - public WorldRenderer(double startX, double startY, double startZ, double x, double y, double z, float partialTicks) { - this.startX = startX; - this.startY = startY; - this.startZ = startZ; - this.x = x; - this.y = y; - this.z = z; - this.partialTicks = partialTicks; - - this.init(); - } - - public WorldRenderer init() { - glEnable(GL11.GL_BLEND); - glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL11.GL_LINE_SMOOTH); - glLineWidth(2.0f); - glDisable(GL11.GL_TEXTURE_2D); - glEnable(GL11.GL_CULL_FACE); - glDisable(GL11.GL_DEPTH_TEST); - - return this.resume(); - } - - @Override - public void close() { - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - this.pause(); - - glEnable(GL11.GL_DEPTH_TEST); - glEnable(GL11.GL_TEXTURE_2D); - glDisable(GL11.GL_CULL_FACE); - glDisable(GL11.GL_LINE_SMOOTH); - glDisable(GL11.GL_BLEND); - } - - public WorldRenderer resume() { - glBegin(GL11.GL_LINES); - return this; - } - - public WorldRenderer pause() { - glEnd(); - return this; - } - - public WorldRenderer(Vec3d start, double x, double y, double z, float partialTicks) { - this(start.x, start.y, start.z, x, y, z, partialTicks); - } - - public WorldRenderer(Vec3d start, Vec3d pos, float partialTicks) { - this(start.x, start.y, start.z, pos.x, pos.y, pos.z, partialTicks); - } - - public WorldRenderer color(float r, float g, float b) { - glColor4f(r, g, b, 1.0f); - return this; - } - - public WorldRenderer color(float r, float g, float b, float a) { - glColor4f(r, g, b, a); - return this; - } - - public WorldRenderer color(int r, int g, int b) { - glColor4f(r * 0.003921569f, g * 0.003921569f, b * 0.003921569f, 1.0f); - return this; - } - - public WorldRenderer color(int r, int g, int b, int a) { - glColor4f(r * 0.003921569f, g * 0.003921569f, b * 0.003921569f, a * 0.003921569f); - return this; - } - - public WorldRenderer color(RenderColor color) { - glColor4b(color.r, color.g, color.b, color.a); - return this; - } - - public WorldRenderer color(Color color) { - glColor4f(color.getRed() * 0.003921569f, color.getGreen() * 0.003921569f, color.getBlue() * 0.003921569f, color.getAlpha() * 0.003921569f); - return this; - } - - public WorldRenderer width(float width) { - this.pause(); - glLineWidth(width); - return this.resume(); - } - - public WorldRenderer line(double x1, double y1, double z1, double x2, double y2, double z2) { - glVertex3d(x1 - this.x, y1 - this.y, z1 - this.z); - glVertex3d(x2 - this.x, y2 - this.y, z2 - this.z); - return this; - } - - public WorldRenderer line(float x1, float y1, float z1, float x2, float y2, float z2) { - glVertex3d(x1 - this.x, y1 - this.y, z1 - this.z); - glVertex3d(x2 - this.x, y2 - this.y, z2 - this.z); - return this; - } - - public WorldRenderer line(int x1, int y1, int z1, int x2, int y2, int z2) { - glVertex3d(x1 - this.x, y1 - this.y, z1 - this.z); - glVertex3d(x2 - this.x, y2 - this.y, z2 - this.z); - return this; - } - - public WorldRenderer line(Vec3d pos1, Vec3d pos2) { - return this.line(pos1.x, pos1.y, pos1.z, pos2.x, pos2.y, pos2.z); - } - - public WorldRenderer line(Vec3d pos1, Entity pos2) { - return this.line(pos1.x, pos1.y, pos1.z, pos2.posX, pos2.posY, pos2.posZ); - } - - public WorldRenderer line(Entity pos1, Entity pos2) { - return this.line(pos1.posX, pos1.posY, pos1.posZ, pos2.posX, pos2.posY, pos2.posZ); - } - - public WorldRenderer lineFromEyes(double x, double y, double z) { - glVertex3d(this.startX, this.startY, this.startZ); - glVertex3d(x - this.x, y - this.y, z - this.z); - return this; - } - - public WorldRenderer lineFromEyes(Vec3d pos) { - return this.lineFromEyes(pos.x, pos.y, pos.z); - } - - public WorldRenderer lineFromEyes(Entity entity, float partialTicks) { - if (partialTicks == 1.0F) { - return this.lineFromEyes(entity.posX, entity.posY, entity.posZ); - } else { - double x = entity.prevPosX + (entity.posX - entity.prevPosX) * partialTicks; - double y = entity.prevPosY + (entity.posY - entity.prevPosY) * partialTicks; - double z = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * partialTicks; - return this.lineFromEyes(x, y, z); - } - } - - public WorldRenderer lineFromEyes(Entity entity) { - return this.lineFromEyes(entity, this.partialTicks); - } - - public WorldRenderer outline(AxisAlignedBB bb) { - return this.outline(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - } - - public WorldRenderer outline(Entity entity) { - double x = entity.prevPosX + (entity.posX - entity.prevPosX) * partialTicks; - double y = entity.prevPosY + (entity.posY - entity.prevPosY) * partialTicks; - double z = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * partialTicks; - double halfwidth = entity.width * 0.5d; - return this.outline( - x - halfwidth, y, z - halfwidth, - x + halfwidth, y + entity.height, z + halfwidth - ); - } - - public WorldRenderer outline(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { - return this.internal_outline( - minX - this.x, minY - this.y, minZ - this.z, - maxX - this.x, maxY - this.y, maxZ - this.z - ); - } - - protected WorldRenderer internal_outline(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { - glVertex3d(minX, minY, minZ); - glVertex3d(maxX, minY, minZ); - - glVertex3d(maxX, minY, minZ); - glVertex3d(maxX, minY, maxZ); - - glVertex3d(maxX, minY, maxZ); - glVertex3d(minX, minY, maxZ); - - glVertex3d(minX, minY, maxZ); - glVertex3d(minX, minY, minZ); - - glVertex3d(minX, minY, minZ); - glVertex3d(minX, maxY, minZ); - - glVertex3d(maxX, minY, minZ); - glVertex3d(maxX, maxY, minZ); - - glVertex3d(maxX, minY, maxZ); - glVertex3d(maxX, maxY, maxZ); - - glVertex3d(minX, minY, maxZ); - glVertex3d(minX, maxY, maxZ); - - glVertex3d(minX, maxY, minZ); - glVertex3d(maxX, maxY, minZ); - - glVertex3d(maxX, maxY, minZ); - glVertex3d(maxX, maxY, maxZ); - - glVertex3d(maxX, maxY, maxZ); - glVertex3d(minX, maxY, maxZ); - - glVertex3d(minX, maxY, maxZ); - glVertex3d(minX, maxY, minZ); - return this; - } -} diff --git a/src/main/resources/mixins.pepsimod.json b/src/main/resources/mixins.pepsimod.json index 6d85967..307e639 100644 --- a/src/main/resources/mixins.pepsimod.json +++ b/src/main/resources/mixins.pepsimod.json @@ -3,49 +3,6 @@ "compatibilityLevel": "JAVA_8", "package": "net.daporkchop.pepsimod.mixin", "refmap": "mixins.pepsimod.refmap.json", - "mixins": [ - "client.gui.MixinGuiMainMenu", - "client.network.MixinNetHandlerLoginClient", - "client.gui.MixinGuiMultiplayer", - "network.play.client.MixinCPacketPlayer", - "client.gui.MixinGuiChat", - "client.MixinMinecraft", - "client.gui.MixinGuiBossOverlay", - "network.MixinNetworkManager", - "util.MixinTabCompleter", - "entity.MixinEntity", - "util.MixinTimer", - "block.MixinBlock", - "client.renderer.MixinBlockFluidRenderer", - "client.renderer.MixinBlockModelRenderer", - "client.renderer.chunk.MixinVisGraph", - "block.MixinBlockLiquid", - "entity.MixinEntityLivingBase", - "client.renderer.MixinEntityRenderer", - "block.MixinBlockSlab", - "client.multiplayer.MixinWorldClient", - "client.entity.MixinAbstractClientPlayer", - "client.renderer.entity.MixinRender", - "client.gui.MixinGuiIngame", - "client.renderer.MixinItemRenderer", - "world.MixinWorld", - "client.network.MixinNetHandlerPlayClient", - "client.settings.MixinGameSettings", - "client.gui.MixinGuiDisconnected", - "client.gui.MixinGuiIngameMenu", - "item.MixinItemStack", - "scoreboard.MixinScoreboard", - "block.MixinBlockSoulSand", - "client.entity.MixinEntityPlayerSP", - "util.MixinMovementInputFromOptions", - "entity.passive.MixinEntityPig", - "entity.passive.MixinAbstractHorse", - "client.gui.MixinGuiConnecting", - "client.resources.MixinLocale", - "world.storage.MixinWorldInfo", - "client.settings.MixinKeyBinding", - "entity.MixinEntityAgeable", - "util.text.translation.MixinLanguageMap", - "client.gui.MixinGuiPlayerTabOverlay" + "client": [ ] -} \ No newline at end of file +} From 38cb636b66ee0078bff1e3fc27a201313fc5932e Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 14:25:20 +0200 Subject: [PATCH 04/42] somehow or other get lombok and mixin working alongside each other --- build.gradle | 15 ++++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../net/daporkchop/pepsimod/Pepsimod.java | 9 ++- .../pepsimod/mixin/MixinGuiMainMenu.java | 56 +++++++++++++++++++ src/main/resources/mixins.pepsimod.json | 1 + 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/MixinGuiMainMenu.java diff --git a/build.gradle b/build.gradle index 8af0e9d..9b20b09 100644 --- a/build.gradle +++ b/build.gradle @@ -28,10 +28,14 @@ buildscript { } dependencies { classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT" - classpath "org.spongepowered:mixingradle:0.4-SNAPSHOT" + classpath "org.spongepowered:mixingradle:0.6-SNAPSHOT" } } +plugins { + id "io.franzbecker.gradle-lombok" version "1.14" +} + apply plugin: "net.minecraftforge.gradle.forge" apply plugin: "org.spongepowered.mixin" @@ -101,6 +105,9 @@ dependencies { } processResources { + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + from(sourceSets.main.resources.srcDirs) { include "mcmod.info" expand "version": "$pepsimodVersion-$minecraftVersion", "mcversion": "$minecraftVersion" @@ -112,8 +119,8 @@ processResources { } mixin { - defaultObfuscationEnv notch - add sourceSets.main, "mixins.pepsimod.refmap.json" + defaultObfuscationEnv srg + add("main", "mixins.pepsimod.refmap.json") } jar { @@ -127,6 +134,8 @@ jar { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" + exclude "LICENSE.txt" + exclude "dummyThing" } manifest { attributes( diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6e2b9ba..bb6c710 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -17,4 +17,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip diff --git a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java index d0c96f5..b27bb18 100644 --- a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java +++ b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java @@ -16,6 +16,7 @@ package net.daporkchop.pepsimod; +import lombok.Getter; import net.daporkchop.pepsimod.util.PepsiConstants; import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; @@ -37,6 +38,13 @@ public class Pepsimod extends PepsiConstants { public static final String CHAT_PREFIX = "\u00A70\u00A7l[\u00A7c\u00A7lpepsi\u00A79\u00A7lmod\u00A70\u00A7l]\u00A7r"; + @Getter + private static final Pepsimod INSTANCE = new Pepsimod(); + + public String getVersion() { + return VERSION_FULL; + } + @Mod.EventHandler public void construction(FMLConstructionEvent event) { mc = Minecraft.getMinecraft(); @@ -60,7 +68,6 @@ public void construction(FMLConstructionEvent event) { } System.out.printf("Loading pepsimod %s...\n", VERSION_FULL); - System.exit(1); /*this.data = new DataLoader( "https://raw.githubusercontent.com/Team-Pepsi/pepsimod/master/resources/resources.json", diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/MixinGuiMainMenu.java b/src/main/java/net/daporkchop/pepsimod/mixin/MixinGuiMainMenu.java new file mode 100644 index 0000000..4135783 --- /dev/null +++ b/src/main/java/net/daporkchop/pepsimod/mixin/MixinGuiMainMenu.java @@ -0,0 +1,56 @@ +/* + * Adapted from the Wizardry License + * + * Copyright (c) 2017-2019 DaPorkchop_ + * + * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. + * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. + * + * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. + * + * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package net.daporkchop.pepsimod.mixin; + +import lombok.NonNull; +import net.daporkchop.pepsimod.Pepsimod; +import net.daporkchop.pepsimod.util.PepsiConstants; +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +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.Constant; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author DaPorkchop_ + */ +@Mixin(GuiMainMenu.class) +public abstract class MixinGuiMainMenu extends GuiScreen { + @Shadow + private String splashText; + + @ModifyConstant( + method = "Lnet/minecraft/client/gui/GuiMainMenu;drawScreen(IIF)V", + constant = @Constant(stringValue = "Copyright Mojang AB. Do not distribute!") + ) + public String changeMinecraftVersionText(@NonNull String orig) { + return String.format("pepsimod %s", Pepsimod.getINSTANCE().getVersion()); + //return String.format("pepsimod %s", PepsiConstants.VERSION_FULL); + } + + @Inject( + method = "Lnet/minecraft/client/gui/GuiMainMenu;initGui()V", + at = @At("RETURN") + ) + public void postInitGui(CallbackInfo ci) { + this.splashText = "pepsimod xd"; + } +} diff --git a/src/main/resources/mixins.pepsimod.json b/src/main/resources/mixins.pepsimod.json index 307e639..e703de0 100644 --- a/src/main/resources/mixins.pepsimod.json +++ b/src/main/resources/mixins.pepsimod.json @@ -4,5 +4,6 @@ "package": "net.daporkchop.pepsimod.mixin", "refmap": "mixins.pepsimod.refmap.json", "client": [ + "MixinGuiMainMenu" ] } From 61d5d50a3d49fad455ed69077b1945f1c0aac582 Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 14:57:40 +0200 Subject: [PATCH 05/42] make pepsimod logo from scratch (in super high resolution) --- pepsimod.png | Bin 0 -> 308606 bytes .../pepsimod/mixin/MixinGuiMainMenu.java | 56 ------------------ .../pepsimod/textures/gui/pepsibuttons.png | Bin 2365 -> 2200 bytes .../pepsimod/textures/gui/pepsilogo.png | Bin 0 -> 12886 bytes .../pepsimod/textures/gui/pepsimod-128.png | Bin 0 -> 19361 bytes .../pepsimod/textures/gui/pepsimod-256.png | Bin 0 -> 42608 bytes src/main/resources/mixins.pepsimod.json | 1 - src/main/resources/pepsilogo.png | Bin 17826 -> 0 bytes 8 files changed, 57 deletions(-) create mode 100644 pepsimod.png delete mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/MixinGuiMainMenu.java create mode 100644 src/main/resources/assets/pepsimod/textures/gui/pepsilogo.png create mode 100644 src/main/resources/assets/pepsimod/textures/gui/pepsimod-128.png create mode 100644 src/main/resources/assets/pepsimod/textures/gui/pepsimod-256.png delete mode 100644 src/main/resources/pepsilogo.png diff --git a/pepsimod.png b/pepsimod.png new file mode 100644 index 0000000000000000000000000000000000000000..98511647cc658331eec3a4c230e524196c5f1d33 GIT binary patch literal 308606 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 z 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 O0000Tia*= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/pepsimod/textures/gui/pepsimod-256.png b/src/main/resources/assets/pepsimod/textures/gui/pepsimod-256.png new file mode 100644 index 0000000000000000000000000000000000000000..170a6164d25a731c0c54b28ef749ba2d08196cb2 GIT binary patch literal 42608 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 Date: Mon, 15 Jul 2019 16:32:50 +0200 Subject: [PATCH 06/42] add a basic mixin, logos in various sizes, make lombok and mixin work together in dev too --- .config/intellij/CodeStyle.xml | 231 +++++++++--------- build.gradle | 1 - .../net/daporkchop/pepsimod/Pepsimod.java | 39 +-- .../pepsimod/PepsimodMixinLoader.java | 2 +- .../pepsimod/mixin/client/MixinMinecraft.java | 71 ++++++ .../mixin/client/gui/MixinGuiMainMenu.java | 43 ++++ .../pepsimod/util/PepsiConstants.java | 61 ++++- .../daporkchop/pepsimod/util/PepsiUtil.java | 65 +++++ .../pepsimod/textures/icon/pepsilogo-128.png | Bin 0 -> 6038 bytes .../pepsimod/textures/icon/pepsilogo-16.png | Bin 0 -> 785 bytes .../pepsilogo.png => icon/pepsilogo-256.png} | Bin 12886 -> 12886 bytes .../pepsimod/textures/icon/pepsilogo-32.png | Bin 0 -> 1391 bytes .../pepsimod/textures/icon/pepsilogo-64.png | Bin 0 -> 2739 bytes src/main/resources/mcmod.info | 2 +- src/main/resources/mixins.pepsimod.json | 1 + 15 files changed, 377 insertions(+), 139 deletions(-) create mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java create mode 100644 src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java create mode 100644 src/main/java/net/daporkchop/pepsimod/util/PepsiUtil.java create mode 100644 src/main/resources/assets/pepsimod/textures/icon/pepsilogo-128.png create mode 100644 src/main/resources/assets/pepsimod/textures/icon/pepsilogo-16.png rename src/main/resources/assets/pepsimod/textures/{gui/pepsilogo.png => icon/pepsilogo-256.png} (99%) create mode 100644 src/main/resources/assets/pepsimod/textures/icon/pepsilogo-32.png create mode 100644 src/main/resources/assets/pepsimod/textures/icon/pepsilogo-64.png diff --git a/.config/intellij/CodeStyle.xml b/.config/intellij/CodeStyle.xml index c22ff33..85c39c0 100644 --- a/.config/intellij/CodeStyle.xml +++ b/.config/intellij/CodeStyle.xml @@ -1,127 +1,132 @@ - - - - -

- - - - true - true - - - -
-
- - - - true - true - - - -
-
- - - - true - true - - - -
-
- - - true - - -
-
- - - true - - -
-
- - - true - - -
-
- - - true - - -
-
- - - true - - -
-
- - - true - - -
-
- - - - true - true - - - -
-
- - - true - - -
- - - + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9b20b09..fecfaa2 100644 --- a/build.gradle +++ b/build.gradle @@ -120,7 +120,6 @@ processResources { mixin { defaultObfuscationEnv srg - add("main", "mixins.pepsimod.refmap.json") } jar { diff --git a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java index b27bb18..ce3fcc2 100644 --- a/src/main/java/net/daporkchop/pepsimod/Pepsimod.java +++ b/src/main/java/net/daporkchop/pepsimod/Pepsimod.java @@ -18,9 +18,11 @@ import lombok.Getter; import net.daporkchop.pepsimod.util.PepsiConstants; +import net.daporkchop.pepsimod.util.PepsiUtil; import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.event.FMLConstructionEvent; @@ -31,43 +33,48 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * The main class of pepsimod's Forge mod. + * + * @author DaPorkchop_ + */ @Mod( modid = PepsiConstants.MOD_ID, useMetadata = true ) -public class Pepsimod extends PepsiConstants { - public static final String CHAT_PREFIX = "\u00A70\u00A7l[\u00A7c\u00A7lpepsi\u00A79\u00A7lmod\u00A70\u00A7l]\u00A7r"; - - @Getter +public final class Pepsimod implements PepsiConstants { + @Getter(onMethod_ = {@Mod.InstanceFactory}) private static final Pepsimod INSTANCE = new Pepsimod(); - public String getVersion() { - return VERSION_FULL; + private Pepsimod() { + if (INSTANCE != null) { + throw new IllegalStateException("pepsimod instance already created!"); + } } @Mod.EventHandler public void construction(FMLConstructionEvent event) { - mc = Minecraft.getMinecraft(); + PepsiConstants.setMC(Minecraft.getMinecraft()); - ModContainer container = FMLCommonHandler.instance().findContainerFor(pepsimod = this); - VERSION = container.getVersion(); - if ("${version}".equals(VERSION)) { - VERSION = "dev"; - VERSION_FULL = "dev-" + MinecraftForge.MC_VERSION; + ModContainer container = FMLCommonHandler.instance().findContainerFor(this); + PepsiConstants.setVersion(container.getVersion()); + if ("${version}".equals(VERSION)) { + PepsiConstants.setVersion("dev"); + PepsiConstants.setVersionFull("dev-" + MinecraftForge.MC_VERSION); } else { Matcher matcher = Pattern.compile("([.0-9]+)-([.0-9]+)").matcher(VERSION); if (!matcher.find()) { throw new IllegalStateException(String.format("Unparseable version: \"%s\"", VERSION)); } - VERSION = matcher.group(1); + PepsiConstants.setVersion(matcher.group(1)); String mcVersion = matcher.group(2); - VERSION_FULL = String.format("%s-%s", VERSION, mcVersion); - if (!MinecraftForge.MC_VERSION.equals(mcVersion)) { + PepsiConstants.setVersionFull(String.format("%s-%s", VERSION, mcVersion)); + if (!MinecraftForge.MC_VERSION.equals(mcVersion)) { throw new IllegalStateException(String.format("pepsimod expected Minecraft %s, but found %s!", MinecraftForge.MC_VERSION, mcVersion)); } } - System.out.printf("Loading pepsimod %s...\n", VERSION_FULL); + log.info("Loading pepsimod %s...\n", VERSION_FULL); /*this.data = new DataLoader( "https://raw.githubusercontent.com/Team-Pepsi/pepsimod/master/resources/resources.json", diff --git a/src/main/java/net/daporkchop/pepsimod/PepsimodMixinLoader.java b/src/main/java/net/daporkchop/pepsimod/PepsimodMixinLoader.java index e32e6c0..88bb992 100644 --- a/src/main/java/net/daporkchop/pepsimod/PepsimodMixinLoader.java +++ b/src/main/java/net/daporkchop/pepsimod/PepsimodMixinLoader.java @@ -56,7 +56,7 @@ public String getSetupClass() { @Override public void injectData(Map data) { - isObfuscatedEnvironment = (boolean) (Boolean) data.get("runtimeDeobfuscationEnabled"); + isObfuscatedEnvironment = (Boolean) data.get("runtimeDeobfuscationEnabled"); } @Override diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java new file mode 100644 index 0000000..563b392 --- /dev/null +++ b/src/main/java/net/daporkchop/pepsimod/mixin/client/MixinMinecraft.java @@ -0,0 +1,71 @@ +/* + * Adapted from the Wizardry License + * + * Copyright (c) 2017-2019 DaPorkchop_ + * + * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. + * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. + * + * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. + * + * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package net.daporkchop.pepsimod.mixin.client; + +import net.daporkchop.pepsimod.PepsimodMixinLoader; +import net.daporkchop.pepsimod.util.PepsiConstants; +import net.daporkchop.pepsimod.util.PepsiUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Util; +import org.lwjgl.opengl.Display; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +import java.awt.image.BufferedImage; +import java.nio.ByteBuffer; + +/** + * @author DaPorkchop_ + */ +@Mixin(Minecraft.class) +public abstract class MixinMinecraft implements PepsiConstants { + @ModifyConstant( + method = "Lnet/minecraft/client/Minecraft;createDisplay()V", + constant = @Constant(stringValue = "Minecraft 1.12.2") + ) + private String changeWindowTitle(String oldTitle) { + return String.format("pepsimod %s", PepsimodMixinLoader.isObfuscatedEnvironment ? "VERSION_FULL" : "(dev environment)"); + } + + /** + * Use the Pepsi logo as the window icon instead of the default crafting table. + * + * @author DaPorkchop_ + * @reason we change the whole thing! + */ + @Overwrite + private void setWindowIcon() { + if (Util.getOSType() != Util.EnumOS.OSX) { + ByteBuffer[] buffers = new ByteBuffer[PepsiUtil.PEPSI_LOGOS.length]; + for (int i = buffers.length - 1; i >= 0; i--) { + int size = PepsiUtil.PEPSI_LOGO_SIZES[i]; + ByteBuffer buffer = ByteBuffer.allocate((size * size) << 2); + BufferedImage img = PepsiUtil.PEPSI_LOGOS[i]; + for (int y = 0; y < size; y++) { + for (int x = 0; x < size; x++) { + int c = img.getRGB(x, y); + buffer.putInt(c << 8 | ((c >> 24) & 255)); + } + } + buffers[i] = (ByteBuffer) buffer.flip(); + } + Display.setIcon(buffers); + } + } +} diff --git a/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java new file mode 100644 index 0000000..c5a869d --- /dev/null +++ b/src/main/java/net/daporkchop/pepsimod/mixin/client/gui/MixinGuiMainMenu.java @@ -0,0 +1,43 @@ +/* + * Adapted from the Wizardry License + * + * Copyright (c) 2017-2019 DaPorkchop_ + * + * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. + * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. + * + * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. + * + * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package net.daporkchop.pepsimod.mixin.client.gui; + +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +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 DaPorkchop_ + */ +@Mixin(GuiMainMenu.class) +public abstract class MixinGuiMainMenu extends GuiScreen { + @Shadow + private String splashText; + + @Inject( + method = "Lnet/minecraft/client/gui/GuiMainMenu;initGui()V", + at = @At("TAIL") + ) + private void postInitGui(CallbackInfo ci) { + this.splashText = "pepsimod xd"; + } +} diff --git a/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java b/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java index ebae35e..3353a7b 100644 --- a/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java +++ b/src/main/java/net/daporkchop/pepsimod/util/PepsiConstants.java @@ -16,15 +16,62 @@ package net.daporkchop.pepsimod.util; +import lombok.NonNull; import net.daporkchop.pepsimod.Pepsimod; import net.minecraft.client.Minecraft; -import net.minecraftforge.common.MinecraftForge; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -public abstract class PepsiConstants { - public static final String MOD_ID = "pepsimod"; - public static String VERSION = "unknown"; - public static String VERSION_FULL = "unknown"; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; - public static Minecraft mc = null; - public static Pepsimod pepsimod = null; +/** + * Constant values used throughout the mod. + * + * @author DaPorkchop_ + */ +public interface PepsiConstants { + Minecraft mc = PepsiUtil.getNull(); + Pepsimod pepsimod = Pepsimod.getINSTANCE(); + Logger log = LogManager.getFormatterLogger("pepsimod"); + + String MOD_ID = "pepsimod"; + String VERSION = PepsiUtil.getSelfValue("unknown"); + String VERSION_FULL = PepsiUtil.getSelfValue("unknown"); + + static void setMC(@NonNull Minecraft mc) { + try { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + Field field = PepsiConstants.class.getDeclaredField("mc"); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, mc); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static void setVersion(@NonNull String version) { + try { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + Field field = PepsiConstants.class.getDeclaredField("VERSION"); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, version); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static void setVersionFull(@NonNull String version) { + try { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + Field field = PepsiConstants.class.getDeclaredField("VERSION_FULL"); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, version); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/net/daporkchop/pepsimod/util/PepsiUtil.java b/src/main/java/net/daporkchop/pepsimod/util/PepsiUtil.java new file mode 100644 index 0000000..3a4fe92 --- /dev/null +++ b/src/main/java/net/daporkchop/pepsimod/util/PepsiUtil.java @@ -0,0 +1,65 @@ +/* + * Adapted from the Wizardry License + * + * Copyright (c) 2017-2019 DaPorkchop_ + * + * Permission is hereby granted to any persons and/or organizations using this software to copy, modify, merge, publish, and distribute it. + * Said persons and/or organizations are not allowed to use the software or any derivatives of the work for commercial use or any other means to generate income, nor are they allowed to claim this software as their own. + * + * The persons and/or organizations are also disallowed from sub-licensing and/or trademarking this software without explicit permission from DaPorkchop_. + * + * Any persons and/or organizations using this software must disclose their source code and have it publicly available, include this license, provide sufficient credit to the original author of the project (IE: DaPorkchop_), as well as provide a link to the original project. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package net.daporkchop.pepsimod.util; + +import net.minecraftforge.fml.common.FMLLog; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; + +/** + * Common methods used throughout the mod. + * + * @author DaPorkchop_ + */ +public final class PepsiUtil implements PepsiConstants { + public static final int[] PEPSI_LOGO_SIZES = {16, 32, 64, 128, 256}; + public static final BufferedImage[] PEPSI_LOGOS = new BufferedImage[PEPSI_LOGO_SIZES.length]; + + static { + for (int i = PEPSI_LOGOS.length - 1; i >= 0; i--) { + try (InputStream in = PepsiUtil.class.getResourceAsStream(String.format("/assets/pepsimod/textures/icon/pepsilogo-%d.png", PEPSI_LOGO_SIZES[i]))) { + PEPSI_LOGOS[i] = ImageIO.read(in); + } catch (Exception e) { + log.error("Unable to load pepsilogo at %1$dx%1$d resolution!", PEPSI_LOGO_SIZES[i]); + } + } + } + + /** + * This returns {@code null} in a very roundabout way. This is to work around warnings in IntelliJ that certain values are always + * {@code null} when they're actually initialized reflectively at runtime. + * @param the type of {@code null} to get + * @return {@code null} + */ + public static T getNull() { + return null; + } + + /** + * This returns the input value in a very roundabout way. This is to work around warnings in IntelliJ that certain values are constant when + * they're actually initialized reflectively at runtime. + * @param val the value to get + * @param the type of value to get + * @return the input value + */ + public static T getSelfValue(T val) { + return val; + } +} diff --git a/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-128.png b/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-128.png new file mode 100644 index 0000000000000000000000000000000000000000..9e67f4853ef1a6008b0e8348dfb81dfb119c95db GIT binary patch literal 6038 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 QK>z>%07*qoM6N<$g6}@G#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-16.png b/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-16.png new file mode 100644 index 0000000000000000000000000000000000000000..51ede9bd3b5546079254d074b003f5fc87703282 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`kNVGw3Kp1&dmD9B#o z>Fdh=n4ON;{QvV87$89JEY&Tu0tUKSNsu2XvVifx z#H_5MrlB=$_S}VwmMmSieC5iu>#yCob?f$>yAOT?P5Sc(XcQ8t6Ku@`=}YojUaOJO=I?yVFO;XOS8?5UI6Cs=y?guPV$U;Y z@LAY49^A*by-#SZ(7mRqVP3J%W-B&uZMn;O((LywR>mKB`X{C-|NFvh+Nv;huKmY9 z8@c7WPi?yX=XAC23%|*_#b(FP?B?Xr+!R^)Oh3-jY5$@{J-eRo=bslb!)3YBqBk#< z_ZuG@ysrdpF2XskIMF-;t4-GE|GUqW@00006VoOIv0RI600RN!9r;`8x1pG-v zK~z}7tygB;QrGS88d%v&mJG)n4cUcyeGxHk`ch5b) z-*?XUx{?%NAfosG%LtzmekF7f6oN{S39SSjAurG#BObKDR6-pxQ`kzi2Cs}M@H<8_@~H#rGWh-F_86P zgh{;0T3&V7_e!Y4J9&^f~xZIt!@c^vYQ*WC7Ek7NFr@0A0Zqg9S+d ze*D89yyh4SIB$7tt2@1hLQavx5u{xBXDH97(g1k;_bVW!m*BHozjD%}P8J}WUwlbq zt0FQoJj_e2@SW*Y**IpvUs=yh89?a6t0< zvzI~2C_!n}ZgB$l7w+R1oGhT#vi`jhJE4BUEVOJW4vM_#&#Ndc*^XhWcMAdGbOLEx z4zm*)Sb)w}*ARRdQkK)-Gn2a?2`K1mMR5iCj zcIkIOu?4kv?#|Z*jH|c9Mg+>&9(| z3&@#Z)4>*)_fDPLLIxjk?l7dQ`kgOf-Dj%ky6mng-VI5adb1NPxfIjC{Dv-~ZoJe9 zuU4Oe$d@bK)@g(*J{p$H8^Q@`kLz+T^H&dQPzQ*R`D-Jts1~H99zseS!B{seXurM9 zZG4>OK`oh|b{w}goEH@ixvO? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-64.png b/src/main/resources/assets/pepsimod/textures/icon/pepsilogo-64.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b960b5c79badd90b402906c86f316a2833fb9f GIT binary patch literal 2739 zcmV;k3QYBhP)pF2XskIMF-;t4-GFX06$%{00006VoOIv0RI600RN!9r;`8x3P4Fj zK~#9!&07g@Rn-~3Kxqr8Y$_n2GcaRm1=(a1fsTx#7DEC7WUU2SXa}pAVVR*7R5WNp z7LukFp|YouhDE|U6#RkH}55RTi!i0|GYPE zx#xWU{{QD3MG4_xjA>;0tSwO#(MqChqCBDkqH-cI$VK!M(P^SxMDauui8?g)d`k>3 zp!*Re5jj}!qm(F}Xh=hIMhv*T5PHARSg?7ZdgVu~K5!IW8JnSO>AUEhy9Dk|`zyOU z?G<$XVKI~~dIu}kY=Ekq!>C@k%C!Q$Jg1syQN%UE3-FcZm4dAZD>v4tQZkQp6ZR zleI8jXY2BnM0D^N6pxHW0?lk49%uHhPcVDW5rI*+AxvW&J*#N&c&yrW2tBi*XVSmO zYibs$)9XD%7iAT%%-qB5J%)p=eP3Gm(7-|aqKAfRjIehd!YbEgnb@v5)%yh_Laq%4 z_?E`|C|$>Ot#qHt2Yc_)r~&UWJoLc5kj99fBe44LXCSYI#!O?4Eknix1AHsveX1;V z=d3s^yyrK~2D~04?tP5ioiI-&2B4%78;!NL3N`p6!usGw0oosa61n4w1n@dUCQ&OEaTJYc?=34h3Z&Bi+V1nP~V6yq626%LRxE%`H z_F*J_>o9=AC9MyABvGdW@(Gf+PZLT-;L+BhAKD)oX&LZ*EyZJ}VQR6lk98CaI}xvT}Py-7b#d`pv%^ha3M z_MzYo_``s6w~9b{=53j2D?HdG2Dn73%d;y>N}tMX=bXjhZ%@rljzAgp23vpRoaeu0 z)gLInC>|LLVX5asllCHcH4LP&s5}>s9p=0*GjEK{fHhiKZ7&9+*0vt_&I4IR+C~ht zv#PxCE-Fz8?85C5kjrMl0H@~sHtztfjb*{4r>Nh!fZNJd+ytJBXG(M;Te;(uU;qm6 z?ZppEUYrX-_3*;w_$U>pum^!M;M!+;G(J>l>Z&VVyo z!{hyJNE2EEJeA(u?%gN93R?Q5mDQj{0HFb73X8U$5Psk?XTWX#u54KXSf%pgk*FeZ zZP4KPcxA&;P$s7^4+AD8vx&+3#Iq|n11h!Bcm6Wq+f|Woat>zB>93l1fBYWCKe6?U zbZ9v}t(F0?$!z3`?Vd>BDS(`_;@o_nF49h~_^DW9vm>yr@38~<*P)*3OHMF)bq>f*Fmhp# zt9{>b5DLkQann(T9DF_1_k_VD7PtAhnCwbq5+RE7JjE?}c2-Di-c!n#S21N`68Z#h zBtkqjHvV#0F%Bd(UnFh`Mgfv6mwhhZy+xu@?wOdNm; z)xfbUcWR|>lfY9{=(b?JJpUtg8zNhFVmKNiyvtM){YPIXzXAfDn3Kny9r7B#QQ(5e zIljIPQ`h(perhUf_wqkw^?%yDFQB)@4;{x~+TuLC zQDTGcW4XZq$ImYO1XRi4&u6A1cU(M!^Bc5D`v3ahH(u3WyuKzT*EdG|+ZNLfJQ8?U z`ldjf9DaYR2+|Mc!NGFWarjMOZbJa&Cz(z_E_&R zzO{fSGvq8Cy+&b0(mFH)H-&fnp`aMH9RC4cN;{yo`+bJipRWa+5_-V(3m}v>M?df- z{W@Au^JRYB?QwoWguHrTn?6|b%uKA_f5Zb5B*d=j8sPRz9EZM(w{q!f{df(u=D2;W4cItu(-jN|c{gUgd@p=L_J~O~=$u zbJqedHarrZoYK5t>q$PD^;@z{m27iKgGcS_9g!ibNLY(%S)G#@_}xthuJ~`R+GYMa zRdZB)(}AmVb4#}YYQbNrFj7@S{U9lGGcSEVJRw+ zd2KjYfV39)^Q&0yrQ5RS@8;J*YU9d^#)Rxsmp~c0Jn|~t6v=b&q>^LKQ{8b!PSEQJ-pk88dES%QNae@E zX1O-k$i>Nb%_XnB)CD|u82Hnn tu`4Z_P`u_MI!pAiVN$U~9m9Qn{{N9NI&^y=0(bxb002ovPDHLkV1hLnNdo`? literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index ac85bc9..cd1c344 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -11,7 +11,7 @@ "DaPorkchop_" ], "credits": "Pepsi, for being amazing", - "logoFile": "assets/pepsimod/textures/gui/pepsimod.png", + "logoFile": "assets/pepsimod/textures/gui/pepsimod-256.png", "screenshots": [], "dependencies": [] } diff --git a/src/main/resources/mixins.pepsimod.json b/src/main/resources/mixins.pepsimod.json index 307e639..fe2cce3 100644 --- a/src/main/resources/mixins.pepsimod.json +++ b/src/main/resources/mixins.pepsimod.json @@ -4,5 +4,6 @@ "package": "net.daporkchop.pepsimod.mixin", "refmap": "mixins.pepsimod.refmap.json", "client": [ + "client.MixinMinecraft" ] } From a4ee11c69c9f232b800f854fddc2ec829f0bf3d0 Mon Sep 17 00:00:00 2001 From: DaMatrix Date: Mon, 15 Jul 2019 17:39:04 +0200 Subject: [PATCH 07/42] make a basic resources system --- .config/intellij/CodeStyle.xml | 5 +- README.md | 11 +- build.gradle | 2 +- resources/data/mainmenu.json | 2 +- .../textures/banner-128.png | Bin .../textures/banner-256.png | Bin resources/textures/banner.png | Bin 8296 -> 0 bytes .../net/daporkchop/pepsimod/Pepsimod.java | 16 +- .../pepsimod/mixin/client/MixinMinecraft.java | 4 +- .../mixin/client/gui/MixinGuiMainMenu.java | 10 +- .../pepsimod/util/PepsiConstants.java | 4 +- .../daporkchop/pepsimod/util/PepsiUtil.java | 16 +- .../pepsimod/util/resources/MainMenu.java | 63 ++++++++ .../pepsimod/util/resources/Resource.java | 38 +++++ .../pepsimod/util/resources/Resources.java | 139 ++++++++++++++++++ src/main/resources/mcmod.info | 2 +- src/main/resources/mixins.pepsimod.json | 1 + 17 files changed, 287 insertions(+), 26 deletions(-) rename src/main/resources/assets/pepsimod/textures/gui/pepsimod-128.png => resources/textures/banner-128.png (100%) rename src/main/resources/assets/pepsimod/textures/gui/pepsimod-256.png => resources/textures/banner-256.png (100%) delete mode 100644 resources/textures/banner.png create mode 100644 src/main/java/net/daporkchop/pepsimod/util/resources/MainMenu.java create mode 100644 src/main/java/net/daporkchop/pepsimod/util/resources/Resource.java create mode 100644 src/main/java/net/daporkchop/pepsimod/util/resources/Resources.java diff --git a/.config/intellij/CodeStyle.xml b/.config/intellij/CodeStyle.xml index 85c39c0..4e940b9 100644 --- a/.config/intellij/CodeStyle.xml +++ b/.config/intellij/CodeStyle.xml @@ -18,7 +18,9 @@ @@ -28,7 +30,6 @@