diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 9260c713..a7452559 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -36,8 +36,8 @@ jobs:
- uses: "0xDylan/action-auto-releases-n20@v1.1"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
- automatic_release_tag: "latest"
- prerelease: false
- title: "Latest Build (1.21)"
+ automatic_release_tag: "nightly"
+ prerelease: true
+ title: "Nightly Build (1.21)"
files: |
./build/libs/*.jar
diff --git a/DIFFERENCES.md b/DIFFERENCES.md
new file mode 100644
index 00000000..03978f15
--- /dev/null
+++ b/DIFFERENCES.md
@@ -0,0 +1,2 @@
+# Differences from original ThunderHack Recode:
+// TODO
\ No newline at end of file
diff --git a/README.md b/README.md
index 38315300..22f456d5 100644
--- a/README.md
+++ b/README.md
@@ -1,26 +1,27 @@
-
+
-
-

-
-[](https://discord.gg/bJajFP3kCX)
+[](https://discord.gg/bJajFP3kCX)
+[](https://discord.gg/7radMBMnNZ)
+
## Information
+ThunderHack Recode is closed, so... I think it is my time to shine!
+
- Minecraft version: ```Fabric``` 1.21 (or whatever version's the latest)
-- Default ClickGui keybind - **```P```** (<--- it is not, you should go to the Discord server and ask for the real keybind)
+- Default ClickGui keybind - **```P```**
- Default prefix - **```@```**
- Middle click the module to bind it.
-- Be aware Expensive, DoxWare 2.0, gumballoff, Treoderia "Recode", Deluxe Client, and Quick Client are both ratted and renames of this client.
+- ~~Be aware Expensive, DoxWare 2.0, gumballoff, Treoderia "Recode", Deluxe Client, and Quick Client are both ratted and renames of this client.~~ Um, actually, they are renames of original ThunderHack Recode, not this fork
## Requires these mods:
@@ -34,12 +35,18 @@
## Credits
+### ThunderHack Recode
+
- [Ai_24](https://www.youtube.com/@Ai_24) for cool showcase
- [KiLAB Gaming](https://www.youtube.com/@KiLABGaming) for complete overview
- [@meteordevelopment](https://github.com/meteordevelopment) for orbit
- [@ladysnake](https://github.com/ladysnake) for satin
- [@0x3C50](https://github.com/0x3C50/Renderer) for the renderer
+### ThunderHack Recode Improved
+- [@Coderx-Gamer](https://github.com/Coderx-Gamer/) for UI-Utils mod (I took a look at his code for GUI move -> Close without packet)
+- [@crazymoose77756](https://github.com/crazymoose77756) and leftys for Meteor Paper Dupe (I added it into PastedPaperDupe module)
+
## Screenshots
GUI
diff --git a/gradle.properties b/gradle.properties
index 60c7d76a..92fc4991 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,7 +5,7 @@ minecraft_version=1.21
yarn_mappings=1.21+build.2
loader_version=0.15.11
-mod_version=1.7
+mod_version=1.7.1
maven_group=thunder.hack
archives_base_name=thunderhack
diff --git a/src/main/java/thunder/hack/core/manager/client/ConfigManager.java b/src/main/java/thunder/hack/core/manager/client/ConfigManager.java
index 9769d760..b8bd433f 100644
--- a/src/main/java/thunder/hack/core/manager/client/ConfigManager.java
+++ b/src/main/java/thunder/hack/core/manager/client/ConfigManager.java
@@ -118,7 +118,7 @@ public void load(String name) {
public void loadCloud(String name) {
Command.sendMessage(isRu() ? "Загружаю.." : "Downloading..");
- try (BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/Pan4ur/THRecodeUtil/main/configs/" + name + ".th").openStream());
+ try (BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/ulybaka1337/THRecodeImprovedUtil/main/configs/" + name + ".th").openStream());
FileOutputStream fileOutputStream = new FileOutputStream(new File(CONFIGS_FOLDER, name + ".th"))) {
byte[] dataBuffer = new byte[1024];
int bytesRead;
@@ -402,7 +402,7 @@ public List getConfigList() {
public List getCloudConfigs() {
List list = new ArrayList<>();
try {
- URL url = new URL("https://raw.githubusercontent.com/Pan4ur/THRecodeUtil/main/cloudConfigs.txt");
+ URL url = new URL("https://raw.githubusercontent.com/ulybaka1337/THRecodeImprovedUtil/main/cloudConfigs.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
@@ -446,4 +446,4 @@ public File getCurrentConfig() {
currentConfig = new File(CONFIGS_FOLDER, name + ".th");
return currentConfig;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/thunder/hack/core/manager/client/ModuleManager.java b/src/main/java/thunder/hack/core/manager/client/ModuleManager.java
index 06f60039..639175c5 100644
--- a/src/main/java/thunder/hack/core/manager/client/ModuleManager.java
+++ b/src/main/java/thunder/hack/core/manager/client/ModuleManager.java
@@ -57,7 +57,7 @@ public class ModuleManager implements IManager {
public static MouseElytraFix mouseElytraFix = new MouseElytraFix();
public static TotemAnimation totemAnimation = new TotemAnimation();
public static PortalGodMode portalGodMode = new PortalGodMode();
- public static OptifineCapes optifineCapes = new OptifineCapes();
+ public static Capes capes = new Capes();
public static Notifications notifications = new Notifications();
public static NoEntityTrace noEntityTrace = new NoEntityTrace();
public static MessageAppend messageAppend = new MessageAppend();
@@ -260,6 +260,8 @@ public class ModuleManager implements IManager {
public static FOV fov = new FOV();
public static ESP esp = new ESP();
public static RPC rpc = new RPC();
+ public static PastedPaperDupe paperdupe = new PastedPaperDupe();
+ public static Religion religion = new Religion();
public ModuleManager() {
for (Field field : getClass().getDeclaredFields()) {
diff --git a/src/main/java/thunder/hack/features/modules/client/Capes.java b/src/main/java/thunder/hack/features/modules/client/Capes.java
new file mode 100644
index 00000000..6af9a485
--- /dev/null
+++ b/src/main/java/thunder/hack/features/modules/client/Capes.java
@@ -0,0 +1,17 @@
+package thunder.hack.features.modules.client;
+
+import thunder.hack.features.modules.Module;
+import thunder.hack.setting.Setting;
+
+public class Capes extends Module {
+ public Capes() {
+ super("Capes", Category.CLIENT);
+ }
+
+ public Setting optifineCapes = new Setting<>("Optifine", true);
+ public Setting minecraftcapesCapes = new Setting<>("Minecraftcapes.net", false);
+ public Setting thCapes = new Setting<>("ThunderHack", true);
+ public Setting priority = new Setting<>("Priority", capePriority.Optifine, v -> optifineCapes.getValue() && minecraftcapesCapes.getValue());
+
+ public enum capePriority { Optifine, Minecraftcapes }
+}
diff --git a/src/main/java/thunder/hack/features/modules/client/OptifineCapes.java b/src/main/java/thunder/hack/features/modules/client/OptifineCapes.java
deleted file mode 100644
index 95c4c9ab..00000000
--- a/src/main/java/thunder/hack/features/modules/client/OptifineCapes.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package thunder.hack.features.modules.client;
-
-import thunder.hack.features.modules.Module;
-
-public final class OptifineCapes extends Module {
- public OptifineCapes() {
- super("OptifineCapes", Category.CLIENT);
- }
-}
diff --git a/src/main/java/thunder/hack/features/modules/client/RPC.java b/src/main/java/thunder/hack/features/modules/client/RPC.java
index 3ba352e9..8871089d 100644
--- a/src/main/java/thunder/hack/features/modules/client/RPC.java
+++ b/src/main/java/thunder/hack/features/modules/client/RPC.java
@@ -83,7 +83,8 @@ public void startRpc() {
if (!started) {
started = true;
DiscordEventHandlers handlers = new DiscordEventHandlers();
- rpc.Discord_Initialize("1093053626198523935", handlers, true, "");
+ // rpc.Discord_Initialize("1093053626198523935", handlers, true, "");
+ rpc.Discord_Initialize("1294239539711442974", handlers, true, "");
presence.startTimestamp = (System.currentTimeMillis() / 1000L);
presence.largeImageText = "v" + ThunderHack.VERSION + " [" + ThunderHack.GITHUB_HASH + "]";
rpc.Discord_UpdatePresence(presence);
@@ -109,7 +110,7 @@ public void startRpc() {
}
presence.button_label_1 = "Download";
- presence.button_url_1 = "https://github.com/Pan4ur/ThunderHack-Recode/";
+ presence.button_url_1 = "https://github.com/ulybaka1337/ThunderHack-Recode-Improved/";
switch (mode.getValue()) {
case Recode -> presence.largeImageKey = "https://i.imgur.com/yY0z2Uq.gif";
diff --git a/src/main/java/thunder/hack/features/modules/client/Religion.java b/src/main/java/thunder/hack/features/modules/client/Religion.java
new file mode 100644
index 00000000..095cd72c
--- /dev/null
+++ b/src/main/java/thunder/hack/features/modules/client/Religion.java
@@ -0,0 +1,53 @@
+package thunder.hack.features.modules.client;
+
+import meteordevelopment.orbit.EventHandler;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.mob.ZoglinEntity;
+import net.minecraft.entity.passive.PigEntity;
+import net.minecraft.entity.passive.SheepEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket;
+import org.jetbrains.annotations.NotNull;
+import thunder.hack.core.Managers;
+import thunder.hack.features.modules.Module;
+import thunder.hack.setting.Setting;
+import thunder.hack.events.impl.PacketEvent;
+
+import static thunder.hack.features.modules.client.ClientSettings.isRu;
+import static thunder.hack.features.modules.combat.Criticals.getEntity;
+
+public class Religion extends Module {
+ public Religion() { super("Religion", Category.CLIENT); }
+
+ public final Setting ReligionSetting = new Setting<>("YourReligion", YourReligion.Christianity, v -> true);
+
+ public enum YourReligion { Christianity, Islam, Satanism, Atheism }
+ public int sheepHits = 0;
+
+ @EventHandler
+ @SuppressWarnings("unused")
+ private void onPacketSend(PacketEvent.@NotNull Send e) {
+ if (!(e.getPacket() instanceof PlayerInteractEntityC2SPacket pac)) return;
+
+ Entity entity = getEntity(pac);
+ if (entity == null) return;
+
+ if ((entity instanceof PigEntity || entity instanceof ZoglinEntity) && ReligionSetting.is(YourReligion.Islam)) e.cancel();
+
+ if (entity instanceof PlayerEntity) {
+ if (ReligionSetting.is(YourReligion.Christianity) && Managers.FRIEND.isFriend(entity.getName().getString())) {
+ sendMessage(isRu() ? "Люби ближнего твоего, как самого себя!" : "Love your neighbour as yourself!");
+ e.cancel();
+ } else if (ReligionSetting.is(YourReligion.Christianity)) {
+ sendMessage(isRu() ? "Не убивай!" : "Do not kill!");
+ e.cancel();
+ }
+ }
+
+ if ((entity instanceof SheepEntity) && ReligionSetting.is(YourReligion.Satanism)) {
+ sheepHits++;
+ sendMessage(isRu() ? String.format("Сатана хочет больше! Ударов по овцам: %d", sheepHits) : String.format("Satan needs more! Times you hit a sheep: %d", sheepHits));
+ }
+
+ }
+}
diff --git a/src/main/java/thunder/hack/features/modules/combat/AutoTotem.java b/src/main/java/thunder/hack/features/modules/combat/AutoTotem.java
index b8b58f69..1d0b0766 100644
--- a/src/main/java/thunder/hack/features/modules/combat/AutoTotem.java
+++ b/src/main/java/thunder/hack/features/modules/combat/AutoTotem.java
@@ -42,6 +42,7 @@
public final class AutoTotem extends Module {
private final Setting mode = new Setting<>("Mode", Mode.Matrix);
private final Setting offhand = new Setting<>("Item", OffHand.Totem);
+ private final Setting pomoyka = new Setting<>("DoNotSwapBack", false, v -> offhand.is(OffHand.Totem));
private final Setting bindSwap = new Setting<>("BindSwap", new BooleanSettingGroup(false), v -> offhand.is(OffHand.Totem));
private final Setting swapButton = new Setting<>("SwapButton", new Bind(GLFW.GLFW_KEY_CAPS_LOCK, false, false)).addToGroup(bindSwap);
private final Setting swapMode = new Setting<>("Swap", Swap.GappleShield).addToGroup(bindSwap);
@@ -89,7 +90,7 @@ public AutoTotem() {
public void onSync(EventSync e) {
swapTo(getItemSlot());
- if (rcGap.not(RCGap.Off) && (mc.player.getMainHandStack().getItem() instanceof SwordItem) && mc.options.useKey.isPressed() && !mc.player.isUsingItem())
+ if (rcGap.not(RCGap.Off) && (mc.player.getMainHandStack().getItem() instanceof SwordItem) && mc.options.useKey.isPressed() && !mc.player.isUsingItem() && !pomoyka.getValue())
((IMinecraftClient) mc).idoItemUse();
delay--;
@@ -246,7 +247,8 @@ public int getItemSlot() {
if (offHandItem != Items.TOTEM_OF_UNDYING && !mc.player.getOffHandStack().isEmpty())
prevItem = offHandItem;
- item = prevItem;
+ if (!pomoyka.getValue())
+ item = prevItem;
if (bindSwap.getValue().isEnabled())
if (isKeyPressed(swapButton) && bindDelay.every(250)) {
@@ -272,7 +274,9 @@ public int getItemSlot() {
else item = Items.TOTEM_OF_UNDYING;
}
}
- prevItem = item;
+
+ prevItem = item;
+
}
}
@@ -401,7 +405,7 @@ else if (gapple.found() || offHandItem == Items.ENCHANTED_GOLDEN_APPLE)
}
for (int i = 9; i < 45; i++) {
- if (mc.player.getOffHandStack().getItem() == item) return -1;
+ if (item != null && mc.player.getOffHandStack().getItem() == item) return -1;
if (mc.player.getInventory().getStack(i >= 36 ? i - 36 : i).getItem().equals(item)) {
itemSlot = i >= 36 ? i - 36 : i;
break;
diff --git a/src/main/java/thunder/hack/features/modules/misc/AutoLeave.java b/src/main/java/thunder/hack/features/modules/misc/AutoLeave.java
index 871ec119..1211060a 100644
--- a/src/main/java/thunder/hack/features/modules/misc/AutoLeave.java
+++ b/src/main/java/thunder/hack/features/modules/misc/AutoLeave.java
@@ -5,10 +5,12 @@
import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+import org.lwjgl.glfw.GLFW;
import thunder.hack.core.Managers;
import thunder.hack.core.manager.client.ModuleManager;
import thunder.hack.features.modules.Module;
import thunder.hack.setting.Setting;
+import thunder.hack.setting.impl.Bind;
import thunder.hack.setting.impl.SettingGroup;
import thunder.hack.utility.Timer;
import thunder.hack.utility.player.InventoryUtility;
@@ -33,6 +35,9 @@ public AutoLeave() {
private final Setting staff = new Setting<>("Staff", LeaveMode.None).addToGroup(leaveIf);
private final Setting players = new Setting<>("Players", LeaveMode.Leave).addToGroup(leaveIf);
private final Setting distance = new Setting<>("Distance", 256, 4, 256, v -> players.getValue() != LeaveMode.None).addToGroup(leaveIf);
+ public final Setting leaveOnBind = new Setting<>("LeaveOnBind", false, v -> true).addToGroup(leaveIf);
+ public final Setting leaveBind = new Setting<>("LeaveBind", new Bind(GLFW.GLFW_KEY_N, false, false), v -> leaveOnBind.is(true)).addToGroup(leaveIf);
+ public final Setting leaveChat = new Setting<>("MessageOnLeave", "", v -> true);
private final Timer chatDelay = new Timer();
@@ -82,9 +87,13 @@ public void onUpdate() {
if (staff.getValue() != LeaveMode.None && ModuleManager.staffBoard.isDisabled() && mc.player.age % 5 == 0)
sendMessage(isRu() ? "Включи StaffBoard!" : "Turn on StaffBoard!");
+
+ if (isKeyPressed(leaveBind) && leaveOnBind.getValue())
+ leave(isRu() ? "Ливнул т.к. прожат бинд" : "Logged out because bind is pressed");
}
private void leave(String message) {
+
if (!chatDelay.passedMs(1000))
return;
chatDelay.reset();
@@ -92,6 +101,14 @@ private void leave(String message) {
if (autoDisable.getValue())
disable(message);
+ if (leaveChat.getValue() != null || leaveChat.getValue() != "") {
+ if (leaveChat.getValue().contains("/")) {
+ mc.getNetworkHandler().sendChatCommand(leaveChat.getValue());
+ } else {
+ mc.getNetworkHandler().sendChatMessage(leaveChat.getValue());
+ }
+ }
+
if (fastLeave.getValue()) sendPacket(new UpdateSelectedSlotC2SPacket(228));
else mc.player.networkHandler.getConnection().disconnect(Text.of("[AutoLeave] " + message));
}
diff --git a/src/main/java/thunder/hack/features/modules/misc/ChestStealer.java b/src/main/java/thunder/hack/features/modules/misc/ChestStealer.java
index 795bb969..f54d8d6a 100644
--- a/src/main/java/thunder/hack/features/modules/misc/ChestStealer.java
+++ b/src/main/java/thunder/hack/features/modules/misc/ChestStealer.java
@@ -11,8 +11,10 @@
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.Direction;
+import thunder.hack.core.manager.client.ModuleManager;
import thunder.hack.events.impl.PlayerUpdateEvent;
import thunder.hack.features.modules.Module;
+import thunder.hack.features.modules.client.Religion;
import thunder.hack.setting.Setting;
import thunder.hack.setting.impl.ItemSelectSetting;
import thunder.hack.utility.Timer;
@@ -21,6 +23,7 @@
import java.util.ArrayList;
import java.util.Random;
+import static thunder.hack.features.modules.client.ClientSettings.isRu;
import static thunder.hack.features.modules.render.StorageEsp.getBlockEntities;
public class ChestStealer extends Module {
@@ -39,6 +42,14 @@ public ChestStealer() {
private final Timer timer = new Timer();
private final Random rnd = new Random();
+ @Override
+ public void onEnable() {
+ if (ModuleManager.religion.isOn() && ModuleManager.religion.ReligionSetting.is(Religion.YourReligion.Christianity)) {
+ ModuleManager.religion.sendMessage(isRu() ? "Не укради!" : "Do not steal!");
+ disable();
+ }
+ }
+
public void onRender3D(MatrixStack stack) {
if (mc.player.currentScreenHandler instanceof GenericContainerScreenHandler chest) {
for (int i = 0; i < chest.getInventory().size(); i++) {
diff --git a/src/main/java/thunder/hack/features/modules/misc/EbatteSratte.java b/src/main/java/thunder/hack/features/modules/misc/EbatteSratte.java
index d6efe654..ca5a22b1 100644
--- a/src/main/java/thunder/hack/features/modules/misc/EbatteSratte.java
+++ b/src/main/java/thunder/hack/features/modules/misc/EbatteSratte.java
@@ -38,6 +38,32 @@ public class EbatteSratte extends Module {
"СКАЖЕШЬ - БАТЯ ПИДОР, ПРОМОЛЧИШЬ - МАТЬ ШЛЮХА"
};
+ private static final String[] ULYBAKA1337 = new String[]{
+ "маме твоей ебало бил",
+ "отсосите мне нежно пж",
+ "сука ебало закрой сын ущемленной мрази",
+ "зачем я твою мамку убил кроме того что она ебаная шваль",
+ "быть нищиебом означает ебать твою нищию мразотную семейку",
+ "почему твой папка пидарас",
+ "почему твоя мамка божество минета",
+ "хахаха сын обиды ебаной",
+ "ущемил всю твою мразотную семейку своим членом",
+ "почему ваша бабка отсосала всему населению планеты земля",
+ "кто мне вчера отсосал если не твоя мать",
+ "мой отец убийца зсу, и твоей мразотной семейки азовцев тоже",
+ "у тебя папка умирает в окопах!!!",
+ "мне мать твоя сосала и пересасывала",
+ "что в хуй че с хуя кто батя твой кроме пидараса",
+ "затерпи хуи по традиции твоей семейки",
+ "сука сын мрази закрой ебало",
+ "твою мать ебала черная оргия а ты со слезами на глазах затерпел",
+ "устроил золотой дождь твоей мерзкой семейке",
+ "кто папка твой кроме мерзкого выблядка",
+ "кому сосал кроме меня",
+ "отсоси ртом своей мамки мне нежно",
+ "как дрочить если не ртом твоей мамки"
+ };
+
private final Timer timer = new Timer();
private ArrayList words = new ArrayList<>();
@@ -61,7 +87,14 @@ public void onAttackEntity(@NotNull EventAttack event) {
int n;
+ if (words.isEmpty() && mode.getValue() == Messages.Custom) {
+ disable();
+ return;
+ }
+
+
if (mode.getValue() == Messages.Default) n = (int) Math.floor(Math.random() * WORDS.length);
+ else if (mode.getValue() == Messages.UlybakaHuevo) n = (int) Math.floor(Math.random() * ULYBAKA1337.length);
else n = (int) Math.floor(Math.random() * words.size());
String chatPrefix = switch (server.getValue()) {
@@ -137,6 +170,7 @@ public enum Server {
public enum Messages {
Default,
+ UlybakaHuevo,
Custom
}
}
diff --git a/src/main/java/thunder/hack/features/modules/misc/PacketCanceler.java b/src/main/java/thunder/hack/features/modules/misc/PacketCanceler.java
index 488228bc..d4dbaaff 100644
--- a/src/main/java/thunder/hack/features/modules/misc/PacketCanceler.java
+++ b/src/main/java/thunder/hack/features/modules/misc/PacketCanceler.java
@@ -9,7 +9,7 @@
import thunder.hack.setting.Setting;
public final class PacketCanceler extends Module {
- private final Setting cliclSlot = new Setting<>("ClickSlotC2SPacket", false);
+ private final Setting clickSlot = new Setting<>("ClickSlotC2SPacket", false);
private final Setting playerMovePosAndOnGround = new Setting<>("PositionAndOnGround", false);
private final Setting playerMoveOnGroundOnly = new Setting<>("OnGroundOnly", false);
private final Setting playerMoveLookAndOnGround = new Setting<>("LookAndOnGround", false);
@@ -20,7 +20,7 @@ public PacketCanceler() {
@EventHandler
@SuppressWarnings("unused")
private void onPacketSend(PacketEvent.@NotNull Send e) {
- if (e.getPacket() instanceof ClickSlotC2SPacket && cliclSlot.getValue()) {
+ if (e.getPacket() instanceof ClickSlotC2SPacket && clickSlot.getValue()) {
e.cancel();
} else if (e.getPacket() instanceof PlayerMoveC2SPacket.PositionAndOnGround && playerMovePosAndOnGround.getValue()) {
e.cancel();
diff --git a/src/main/java/thunder/hack/features/modules/misc/PastedPaperDupe.java b/src/main/java/thunder/hack/features/modules/misc/PastedPaperDupe.java
new file mode 100644
index 00000000..073c55d5
--- /dev/null
+++ b/src/main/java/thunder/hack/features/modules/misc/PastedPaperDupe.java
@@ -0,0 +1,45 @@
+package thunder.hack.features.modules.misc;
+
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
+import meteordevelopment.orbit.EventHandler;
+import thunder.hack.features.modules.Module;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket;
+import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
+import net.minecraft.screen.slot.SlotActionType;
+import thunder.hack.events.impl.EventPostTick;
+
+import java.util.List;
+import java.util.Optional;
+
+public class PastedPaperDupe extends Module {
+
+ public PastedPaperDupe() {
+ super("PastedPaperDupe", Category.MISC);
+ }
+
+ @EventHandler
+ private void onTick(EventPostTick event) {
+ if(!(mc.player.getInventory().getMainHandStack().getItem() == Items.WRITABLE_BOOK)) {
+ disable("Please hold a writable book!");
+ return;
+ }
+ for (int i = 9; i < 44; i++) {
+ if (36 + mc.player.getInventory().selectedSlot == i) continue;
+ mc.player.networkHandler.sendPacket(new ClickSlotC2SPacket(
+ mc.player.currentScreenHandler.syncId,
+ mc.player.currentScreenHandler.getRevision(),
+ i,
+ 1,
+ SlotActionType.THROW,
+ ItemStack.EMPTY,
+ Int2ObjectMaps.emptyMap()
+ ));
+ }
+ mc.player.networkHandler.sendPacket(new BookUpdateC2SPacket(
+ mc.player.getInventory().selectedSlot, List.of(""), Optional.of("The quick brown fox jumps over the lazy dog"
+ )));
+ toggle();
+ }
+}
diff --git a/src/main/java/thunder/hack/features/modules/movement/GuiMove.java b/src/main/java/thunder/hack/features/modules/movement/GuiMove.java
index 5a25279c..a563666b 100644
--- a/src/main/java/thunder/hack/features/modules/movement/GuiMove.java
+++ b/src/main/java/thunder/hack/features/modules/movement/GuiMove.java
@@ -2,23 +2,31 @@
import meteordevelopment.orbit.EventHandler;
import net.minecraft.client.gui.screen.ChatScreen;
+import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket;
import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
+import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.SlotActionType;
+import org.lwjgl.glfw.GLFW;
import thunder.hack.events.impl.EventClickSlot;
import thunder.hack.events.impl.PacketEvent;
import thunder.hack.features.modules.Module;
import thunder.hack.setting.Setting;
+import thunder.hack.setting.impl.Bind;
+import thunder.hack.setting.impl.BooleanSettingGroup;
+import thunder.hack.utility.Timer;
import thunder.hack.utility.player.MovementUtility;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicBoolean;
+import static thunder.hack.features.modules.client.ClientSettings.isRu;
+
public class GuiMove extends Module {
public GuiMove() {
super("GuiMove", Category.MOVEMENT);
@@ -27,6 +35,12 @@ public GuiMove() {
private final Setting clickBypass = new Setting<>("Bypass", Bypass.None);
private final Setting rotateOnArrows = new Setting<>("RotateOnArrows", true);
private final Setting sneak = new Setting<>("sneak", false);
+ private final Setting closeWithoutPacketGroup = new Setting<>("CloseWithoutPacket", new BooleanSettingGroup(false), v -> true);
+ private final Setting closeBind = new Setting<>("CloseAndReopenBind", new Bind(GLFW.GLFW_KEY_B, false, false), v -> true).addToGroup(closeWithoutPacketGroup);
+
+ private Screen screen;
+ private ScreenHandler screenHandler;
+ private Timer bindDelay = new Timer();
private final Queue storedClicks = new LinkedList<>();
private AtomicBoolean pause = new AtomicBoolean();
@@ -59,6 +73,33 @@ public void onUpdate() {
if (sneak.getValue())
mc.options.sneakKey.setPressed(isKeyPressed(InputUtil.fromTranslationKey(mc.options.sneakKey.getBoundKeyTranslationKey()).getCode()));
+
+ }
+
+ if (closeWithoutPacketGroup.getValue().isEnabled()) {
+ closeWithoutPacket();
+ }
+ }
+
+ // thanks ui utils for this!
+ public void closeWithoutPacket() {
+ if (isKeyPressed(closeBind) && bindDelay.every(250)) {
+
+ if (mc.currentScreen instanceof ChatScreen) {
+ return;
+ }
+
+ if (mc.currentScreen != null) {
+ screen = mc.currentScreen;
+ screenHandler = mc.player.currentScreenHandler;
+ mc.setScreen(null);
+ if (mc.currentScreen != screen) sendMessage(isRu() ? "Интерфейс сохранен! Нажмите еще раз чтобы открыть" : "GUI have been saved! Press again to open.");
+ } else {
+ mc.setScreen(screen);
+ mc.player.currentScreenHandler = screenHandler;
+ sendMessage(isRu() ? "Интерфейс открыт." : "GUI Opened.");
+ }
+
}
}
diff --git a/src/main/java/thunder/hack/features/modules/movement/Jesus.java b/src/main/java/thunder/hack/features/modules/movement/Jesus.java
index d6c95ea3..2828775d 100644
--- a/src/main/java/thunder/hack/features/modules/movement/Jesus.java
+++ b/src/main/java/thunder/hack/features/modules/movement/Jesus.java
@@ -2,10 +2,14 @@
import meteordevelopment.orbit.EventHandler;
import net.minecraft.block.*;
+import thunder.hack.core.manager.client.ModuleManager;
import thunder.hack.events.impl.EventCollision;
import thunder.hack.features.modules.Module;
+import thunder.hack.features.modules.client.Religion;
import thunder.hack.setting.Setting;
+import static thunder.hack.features.modules.client.ClientSettings.isRu;
+
public class Jesus extends Module {
public Jesus() {
super("Jesus", Category.MOVEMENT);
@@ -14,12 +18,21 @@ public Jesus() {
public final Setting mode = new Setting<>("Mode", Mode.SOLID);
@EventHandler
+ @SuppressWarnings("unused")
public void onCollide(EventCollision e) {
if (e.getState().getBlock() instanceof FluidBlock) {
e.setState(mode.is(Mode.SOLID) ? Blocks.ENDER_CHEST.getDefaultState() : Blocks.OBSIDIAN.getDefaultState());
}
}
+ @Override
+ public void onEnable() {
+ if (ModuleManager.religion.isOn() && !ModuleManager.religion.ReligionSetting.is(Religion.YourReligion.Christianity)) {
+ ModuleManager.religion.sendMessage(isRu() ? "Ты не веришь в Иисуса!" : "You do not believe in Jesus!");
+ disable();
+ }
+ }
+
public enum Mode {
SOLID, SOLID2
}
diff --git a/src/main/java/thunder/hack/features/modules/player/AutoSex.java b/src/main/java/thunder/hack/features/modules/player/AutoSex.java
index 126a57b0..e26e04ef 100644
--- a/src/main/java/thunder/hack/features/modules/player/AutoSex.java
+++ b/src/main/java/thunder/hack/features/modules/player/AutoSex.java
@@ -2,7 +2,9 @@
import net.minecraft.entity.player.PlayerEntity;
import thunder.hack.core.Managers;
+import thunder.hack.core.manager.client.ModuleManager;
import thunder.hack.features.modules.Module;
+import thunder.hack.features.modules.client.Religion;
import thunder.hack.setting.Setting;
import thunder.hack.utility.Timer;
import thunder.hack.utility.math.MathUtility;
@@ -10,6 +12,8 @@
import java.util.Arrays;
import java.util.List;
+import static thunder.hack.features.modules.client.ClientSettings.isRu;
+
public class AutoSex extends Module {
private final Setting targetRange = new Setting<>("Target Range", 5, 1, 10);
private final Setting mode = new Setting<>("Sex Mode", SexMode.Active);
@@ -41,6 +45,14 @@ public AutoSex() {
super("AutoSex", Category.PLAYER);
}
+ @Override
+ public void onEnable() {
+ if (ModuleManager.religion.isOn() && ModuleManager.religion.ReligionSetting.is(Religion.YourReligion.Christianity)) {
+ ModuleManager.religion.sendMessage(isRu() ? "Не пролюбодействуй!" : "Do not do adulty!");
+ disable();
+ }
+ }
+
@Override
public void onUpdate() {
if (fullNullCheck()) return;
diff --git a/src/main/java/thunder/hack/features/modules/render/ESP.java b/src/main/java/thunder/hack/features/modules/render/ESP.java
index bb8746e7..d3424898 100644
--- a/src/main/java/thunder/hack/features/modules/render/ESP.java
+++ b/src/main/java/thunder/hack/features/modules/render/ESP.java
@@ -71,8 +71,10 @@ public ESP() {
private final Setting outline = new Setting<>("Outline", true).addToGroup(boxEsp);
private final Setting colorMode = new Setting<>("ColorMode", Colors.SyncColor).addToGroup(boxEsp);
private final Setting renderHealth = new Setting<>("renderHealth", true).addToGroup(boxEsp);
+ private final Setting healthOutline = new Setting<>("healthOutline", true).addToGroup(boxEsp);
private final Setting boxColors = new Setting<>("BoxColors", new SettingGroup(false, 0));
+ private final Setting boxOutline = new Setting<>("BoxOutline", new ColorSetting(new Color(0x000000))).addToGroup(boxColors);
private final Setting playersC = new Setting<>("PlayersC", new ColorSetting(new Color(0xFF9200))).addToGroup(boxColors);
private final Setting friendsC = new Setting<>("FriendsC", new ColorSetting(new Color(0x30FF00))).addToGroup(boxColors);
private final Setting crystalsC = new Setting<>("CrystalsC", new ColorSetting(new Color(0x00BBFF))).addToGroup(boxColors);
@@ -82,6 +84,8 @@ public ESP() {
private final Setting othersC = new Setting<>("OthersC", new ColorSetting(new Color(0xFF0062))).addToGroup(boxColors);
public final Setting healthB = new Setting<>("healthB", new ColorSetting(new Color(0xff1100))).addToGroup(boxColors);
public final Setting healthU = new Setting<>("healthU", new ColorSetting(new Color(0x2fff00))).addToGroup(boxColors);
+ private final Setting healthbg = new Setting<>("healthBG", new ColorSetting(new Color(0x000000))).addToGroup(boxColors);
+ private final Setting healthOutlineC = new Setting<>("healthOutlineC", new ColorSetting(new Color(0x000000))).addToGroup(boxColors);
private float dizorentAnimation = 0f;
@@ -396,14 +400,15 @@ public void drawBox(BufferBuilder bufferBuilder, @NotNull Entity ent, Matrix4f m
double endPosX = position.z;
double endPosY = position.w;
- if(outline.getValue()) {
- Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1F), (float) posY, (float) (posX + 0.5), (float) (endPosY + 0.5), Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK);
- Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1F), (float) (posY - 0.5), (float) (endPosX + 0.5), (float) (posY + 0.5 + 0.5), Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK);
- Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (endPosX - 0.5 - 0.5), (float) posY, (float) (endPosX + 0.5), (float) (endPosY + 0.5), Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK);
- Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1), (float) (endPosY - 0.5 - 0.5), (float) (endPosX + 0.5), (float) (endPosY + 0.5), Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK);
+ if (outline.getValue()) {
+ // ебаный пиздец
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1F), (float) posY, (float) (posX + 0.5), (float) (endPosY + 0.5), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject());
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1F), (float) (posY - 0.5), (float) (endPosX + 0.5), (float) (posY + 0.5 + 0.5), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject());
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (endPosX - 0.5 - 0.5), (float) posY, (float) (endPosX + 0.5), (float) (endPosY + 0.5), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject());
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 1), (float) (endPosY - 0.5 - 0.5), (float) (endPosX + 0.5), (float) (endPosY + 0.5), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject(), boxOutline.getValue().getColorObject());
}
- switch(colorMode.getValue()) {
+ switch (colorMode.getValue()) {
case Custom -> {
Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 0.5f), (float) posY, (float) (posX + 0.5 - 0.5), (float) endPosY, col, col, col, col);
Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) posX, (float) (endPosY - 0.5f), (float) endPosX, (float) endPosY, col, col, col, col);
@@ -419,13 +424,21 @@ public void drawBox(BufferBuilder bufferBuilder, @NotNull Entity ent, Matrix4f m
}
- if(ent instanceof LivingEntity lent && lent.getHealth() != 0 && renderHealth.getValue()) {
- Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) posY, (float) posX - 3, (float) endPosY, Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK);
- switch(colorMode.getValue()) {
- case Custom -> Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) (endPosY + (posY - endPosY) * lent.getHealth() / lent.getMaxHealth()), (float) posX - 3, (float) endPosY, healthB.getValue().getColorObject(), healthB.getValue().getColorObject(), healthU.getValue().getColorObject(), healthU.getValue().getColorObject());
- case SyncColor -> Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) (endPosY + (posY - endPosY) * lent.getHealth() / lent.getMaxHealth()), (float) posX - 3, (float) endPosY, HudEditor.getColor(90), HudEditor.getColor(90), HudEditor.getColor(270), HudEditor.getColor(270));
+ if (ent instanceof LivingEntity lent && lent.getHealth() != 0 && renderHealth.getValue()) {
+
+ if (healthOutline.getValue())
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5.5), (float) (posY - 0.5), (float) (posX - 2.5), (float) (endPosY + 0.5), healthOutlineC.getValue().getColorObject(), healthOutlineC.getValue().getColorObject(), healthOutlineC.getValue().getColorObject(), healthOutlineC.getValue().getColorObject());
+
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) posY, (float) posX - 3, (float) endPosY, healthbg.getValue().getColorObject(), healthbg.getValue().getColorObject(), healthbg.getValue().getColorObject(), healthbg.getValue().getColorObject());
+
+ switch (colorMode.getValue()) {
+ case Custom ->
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) (endPosY + (posY - endPosY) * lent.getHealth() / lent.getMaxHealth()), (float) posX - 3, (float) endPosY, healthB.getValue().getColorObject(), healthB.getValue().getColorObject(), healthU.getValue().getColorObject(), healthU.getValue().getColorObject());
+ case SyncColor ->
+ Render2DEngine.setRectPoints(bufferBuilder, matrix, (float) (posX - 5), (float) (endPosY + (posY - endPosY) * lent.getHealth() / lent.getMaxHealth()), (float) posX - 3, (float) endPosY, HudEditor.getColor(90), HudEditor.getColor(90), HudEditor.getColor(270), HudEditor.getColor(270));
}
- } }
+ }
+ }
}
@NotNull
diff --git a/src/main/java/thunder/hack/features/modules/render/PenisESP.java b/src/main/java/thunder/hack/features/modules/render/PenisESP.java
index 81ac1567..cf64a9e2 100644
--- a/src/main/java/thunder/hack/features/modules/render/PenisESP.java
+++ b/src/main/java/thunder/hack/features/modules/render/PenisESP.java
@@ -27,8 +27,9 @@ public PenisESP() {
private final Setting friendSize = new Setting<>("FriendSize", 1.5f, 0.1f, 3.0f);
private final Setting enemySize = new Setting<>("EnemySize", 0.5f, 0.1f, 3.0f);
private final Setting gradation = new Setting<>("Gradation", 30, 20, 100);
+ private final Setting fimoz = new Setting<>("Fimoz", false);
private final Setting penisColor = new Setting<>("PenisColor", new ColorSetting(new Color(231, 180, 122, 255)));
- private final Setting headColor = new Setting<>("HeadColor", new ColorSetting(new Color(240, 50, 180, 255)));
+ private final Setting headColor = new Setting<>("HeadColor", new ColorSetting(new Color(240, 50, 180, 255)), v -> !fimoz.getValue());
@Override
public void onRender2D(DrawContext event) {
@@ -103,7 +104,11 @@ public void drawPenis(PlayerEntity player, MatrixStack event, double size, Vec3d
});
drawBall(player, 0.1, gradation.getValue(), start, penisColor.getValue().getColorObject(), 1);
- drawBall(player, 0.1, gradation.getValue(), end, headColor.getValue().getColorObject(), 2);
+ if (fimoz.getValue()) {
+ drawBall(player, 0.1, gradation.getValue(), end, penisColor.getValue().getColorObject(), 2);
+ } else {
+ drawBall(player, 0.1, gradation.getValue(), end, headColor.getValue().getColorObject(), 2);
+ }
}
public List getVec3ds(Vec3d vec3d, double radius) {
diff --git a/src/main/java/thunder/hack/gui/mainmenu/MainMenuScreen.java b/src/main/java/thunder/hack/gui/mainmenu/MainMenuScreen.java
index 0a535c43..85e9bde0 100644
--- a/src/main/java/thunder/hack/gui/mainmenu/MainMenuScreen.java
+++ b/src/main/java/thunder/hack/gui/mainmenu/MainMenuScreen.java
@@ -92,7 +92,7 @@ public void render(@NotNull DrawContext context, int mouseX, int mouseY, float d
FontRenderers.sf_medium.drawCenteredString(context.getMatrices(), "<-- Back to default menu", halfOfWidth, halfOfHeight + 70, hovered ? -1 : Render2DEngine.applyOpacity(-1, 0.6f));
// FontRenderers.sf_medium.drawString(context.getMatrices(), "By Pan4ur & 06ED", halfOfWidth * 2 - FontRenderers.sf_medium.getStringWidth("By Pan4ur & 06ED") - 5f, halfOfHeight * 2 - 10, Render2DEngine.applyOpacity(-1, 0.4f));
- onlineText:
+ /*onlineText:
{
String onlineUsers = String.format("online: %s%s", Formatting.DARK_GREEN, Managers.TELEMETRY.getOnlinePlayers().size());
@@ -108,7 +108,7 @@ public void render(@NotNull DrawContext context, int mouseX, int mouseY, float d
Render2DEngine.drawBloom(context.getMatrices(), Render2DEngine.applyOpacity(Color.GREEN, (float) (0.5f + (Math.sin((double) System.currentTimeMillis() / 500)) / 2f)), 9f);
context.getMatrices().pop();
- }
+ }*/
Render2DEngine.drawHudBase(context.getMatrices(), mc.getWindow().getScaledWidth() - 40, mc.getWindow().getScaledHeight() - 40, 30, 30, 5, Render2DEngine.isHovered(mouseX, mouseY, mc.getWindow().getScaledWidth() - 40, mc.getWindow().getScaledHeight() - 40, 30, 30) ? 0.7f : 1f);
RenderSystem.setShaderColor(1f, 1f, 1f, Render2DEngine.isHovered(mouseX, mouseY, mc.getWindow().getScaledWidth() - 40, mc.getWindow().getScaledHeight() - 40, 30, 30) ? 0.7f : 1f);
diff --git a/src/main/java/thunder/hack/injection/MixinPlayerListEntry.java b/src/main/java/thunder/hack/injection/MixinPlayerListEntry.java
index 05b55ef4..e242e56e 100644
--- a/src/main/java/thunder/hack/injection/MixinPlayerListEntry.java
+++ b/src/main/java/thunder/hack/injection/MixinPlayerListEntry.java
@@ -12,7 +12,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import thunder.hack.core.manager.client.ModuleManager;
-import thunder.hack.utility.OptifineCapes;
+import thunder.hack.utility.CapeHandler;
import thunder.hack.utility.ThunderUtility;
import java.io.BufferedReader;
@@ -47,10 +47,22 @@ private void getCapeTexture(CallbackInfoReturnable cir) {
private void getTexture(GameProfile profile) {
if (loadedCapeTexture) return;
loadedCapeTexture = true;
-
Util.getMainWorkerExecutor().execute(() -> {
+
+ if (ModuleManager.capes.isEnabled())
+ CapeHandler.loadPlayerCape(profile, id -> {
+ customCapeTexture = id;
+ });
+
+ if (!ModuleManager.capes.thCapes.getValue()) return;
+
+ for (String str : ThunderUtility.starGazer) {
+ if (profile.getName().toLowerCase().equals(str.toLowerCase()))
+ customCapeTexture = Identifier.of("thunderhack", "textures/capes/starcape.png");
+ }
+
try {
- URL capesList = new URL("https://raw.githubusercontent.com/Pan4ur/THRecodeUtil/main/capes/capeBase.txt");
+ URL capesList = new URL("https://raw.githubusercontent.com/ulybaka1337/THRecodeImprovedUtil/main/capes/capeBase.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(capesList.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
@@ -64,16 +76,6 @@ private void getTexture(GameProfile profile) {
}
} catch (Exception ignored) {
}
-
- for (String str : ThunderUtility.starGazer) {
- if (profile.getName().toLowerCase().equals(str.toLowerCase()))
- customCapeTexture = Identifier.of("thunderhack", "textures/capes/starcape.png");
- }
-
- if (ModuleManager.optifineCapes.isEnabled())
- OptifineCapes.loadPlayerCape(profile, id -> {
- customCapeTexture = id;
- });
});
}
}
\ No newline at end of file
diff --git a/src/main/java/thunder/hack/utility/CapeHandler.java b/src/main/java/thunder/hack/utility/CapeHandler.java
new file mode 100644
index 00000000..3def405d
--- /dev/null
+++ b/src/main/java/thunder/hack/utility/CapeHandler.java
@@ -0,0 +1,138 @@
+package thunder.hack.utility;
+
+import com.mojang.authlib.GameProfile;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.texture.NativeImage;
+import net.minecraft.client.texture.NativeImageBackedTexture;
+import net.minecraft.util.Identifier;
+import thunder.hack.core.manager.client.ModuleManager;
+import thunder.hack.features.modules.client.Capes;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public final class CapeHandler {
+ /**
+ * author: @dragonostic
+ * of-capes
+ */
+
+ public interface ReturnCapeTexture {
+ void response(Identifier id);
+ }
+
+ public static void loadPlayerCape(GameProfile player, ReturnCapeTexture response) {
+ try {
+ String uuid = player.getId().toString();
+ NativeImageBackedTexture optifineCape = getCapeFromURL(String.format("http://s.optifine.net/capes/%s.png", player.getName()));
+ NativeImageBackedTexture minecraftcapesCape = getCapeFromURL(String.format("https://api.minecraftcapes.net/profile/%s/cape/map", player.getId().toString().replace("-","")));
+ NativeImageBackedTexture minecraftcapesCapeCrack = getCapeFromURL(String.format("https://api.minecraftcapes.net/profile/%s/cape/map", getUUID(player)));
+ switch (ModuleManager.capes.priority.getValue()) {
+ case Capes.capePriority.Optifine:
+ if (optifineCape != null && ModuleManager.capes.optifineCapes.getValue()) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, optifineCape);
+ response.response(capeTexture);
+ } else if (ModuleManager.capes.minecraftcapesCapes.getValue() && minecraftcapesCape != null) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, minecraftcapesCape);
+ response.response(capeTexture);
+ } else if(ModuleManager.capes.minecraftcapesCapes.getValue()) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, minecraftcapesCapeCrack);
+ response.response(capeTexture);
+ }
+ break;
+ case Capes.capePriority.Minecraftcapes:
+ if (minecraftcapesCape != null && ModuleManager.capes.minecraftcapesCapes.getValue()) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, minecraftcapesCape);
+ response.response(capeTexture);
+ } else if (minecraftcapesCapeCrack != null && ModuleManager.capes.minecraftcapesCapes.getValue()) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, minecraftcapesCapeCrack);
+ response.response(capeTexture);
+ } else if (ModuleManager.capes.optifineCapes.getValue()) {
+ Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, optifineCape);
+ response.response(capeTexture);
+ }
+ break;
+ }
+ } catch (Exception ignored) {
+ }
+ }
+
+ public static String getUUID(GameProfile player) {
+ StringBuffer content = null;
+ try {
+ URL request = new URL(String.format("https://api.mojang.com/users/profiles/minecraft/%s", player.getName()));
+ HttpsURLConnection connection = (HttpsURLConnection) request.openConnection();
+ connection.setRequestMethod("GET");
+ connection.setConnectTimeout(5000);
+ connection.setReadTimeout(5000);
+ String inputLine;
+ BufferedReader in = new BufferedReader(
+ new InputStreamReader(connection.getInputStream()));
+ content = new StringBuffer();
+
+ while ((inputLine = in.readLine()) != null) {
+ content.append(inputLine);
+ }
+
+ in.close();
+ connection.disconnect();
+ } catch (Exception ignored) {
+ }
+ // ЭТО САМЫЙ СЕКСУАЛЬНЫЙ JSON ПАРСЕР В ИСТОРИИ ЧЕЛОВЕЧЕСТВА
+ // надо потом переписать
+ Pattern uuidPattern = Pattern.compile("id");
+ Matcher uuidMatch = uuidPattern.matcher(content.toString());
+ if (!uuidMatch.find())
+ return null;
+ String[] parsin = content.toString().split("\"");
+ return parsin[3];
+ }
+
+ public static NativeImageBackedTexture getCapeFromURL(String capeStringURL) {
+ try {
+ URL capeURL = new URL(capeStringURL);
+ return getCapeFromStream(capeURL.openStream());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public static NativeImageBackedTexture getCapeFromStream(InputStream image) {
+ NativeImage cape = null;
+ try {
+ cape = NativeImage.read(image);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ if (cape != null) {
+ return new NativeImageBackedTexture(parseCape(cape));
+ }
+ return null;
+ }
+
+ public static NativeImage parseCape(NativeImage image) {
+ int imageWidth = 64;
+ int imageHeight = 32;
+ int imageSrcWidth = image.getWidth();
+ int srcHeight = image.getHeight();
+ for (int imageSrcHeight = image.getHeight(); imageWidth < imageSrcWidth || imageHeight < imageSrcHeight; imageHeight *= 2) {
+ imageWidth *= 2;
+ }
+
+ NativeImage imgNew = new NativeImage(imageWidth, imageHeight, true);
+ for (int x = 0; x < imageSrcWidth; x++) {
+ for (int y = 0; y < srcHeight; y++) {
+ imgNew.setColor(x, y, image.getColor(x, y));
+ }
+ }
+ image.close();
+ return imgNew;
+ }
+}
diff --git a/src/main/java/thunder/hack/utility/OptifineCapes.java b/src/main/java/thunder/hack/utility/OptifineCapes.java
deleted file mode 100644
index ccbee348..00000000
--- a/src/main/java/thunder/hack/utility/OptifineCapes.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package thunder.hack.utility;
-
-import com.mojang.authlib.GameProfile;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.texture.NativeImage;
-import net.minecraft.client.texture.NativeImageBackedTexture;
-import net.minecraft.util.Identifier;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-public final class OptifineCapes {
- /**
- * author: @dragonostic
- * of-capes
- */
-
- public interface ReturnCapeTexture {
- void response(Identifier id);
- }
-
- public static void loadPlayerCape(GameProfile player, ReturnCapeTexture response) {
- try {
- String uuid = player.getId().toString();
- NativeImageBackedTexture nIBT = getCapeFromURL(String.format("http://s.optifine.net/capes/%s.png", player.getName()));
- Identifier capeTexture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("th-cape-" + uuid, nIBT);
- response.response(capeTexture);
- } catch (Exception ignored) {
- }
- }
-
- public static NativeImageBackedTexture getCapeFromURL(String capeStringURL) {
- try {
- URL capeURL = new URL(capeStringURL);
- return getCapeFromStream(capeURL.openStream());
- } catch (IOException e) {
- return null;
- }
- }
-
- public static NativeImageBackedTexture getCapeFromStream(InputStream image) {
- NativeImage cape = null;
- try {
- cape = NativeImage.read(image);
- } catch (IOException e) {
- e.printStackTrace();
- }
- if (cape != null) {
- return new NativeImageBackedTexture(parseCape(cape));
- }
- return null;
- }
-
- public static NativeImage parseCape(NativeImage image) {
- int imageWidth = 64;
- int imageHeight = 32;
- int imageSrcWidth = image.getWidth();
- int srcHeight = image.getHeight();
-
- for (int imageSrcHeight = image.getHeight(); imageWidth < imageSrcWidth || imageHeight < imageSrcHeight; imageHeight *= 2) {
- imageWidth *= 2;
- }
-
- NativeImage imgNew = new NativeImage(imageWidth, imageHeight, true);
- for (int x = 0; x < imageSrcWidth; x++) {
- for (int y = 0; y < srcHeight; y++) {
- imgNew.setColor(x, y, image.getColor(x, y));
- }
- }
- image.close();
- return imgNew;
- }
-}
diff --git a/src/main/java/thunder/hack/utility/ThunderUtility.java b/src/main/java/thunder/hack/utility/ThunderUtility.java
index 8010f524..4c472440 100644
--- a/src/main/java/thunder/hack/utility/ThunderUtility.java
+++ b/src/main/java/thunder/hack/utility/ThunderUtility.java
@@ -56,7 +56,7 @@ public static Identifier getCustomImg(String name) throws IOException {
public static void syncVersion() {
try {
- if (!new BufferedReader(new InputStreamReader(new URL("https://raw.githubusercontent.com/Pan4ur/THRecodeUtil/main/syncVersion121.txt").openStream())).readLine().equals(ThunderHack.VERSION))
+ if (!new BufferedReader(new InputStreamReader(new URL("https://raw.githubusercontent.com/ulybaka1337/THRecodeImprovedUtil/main/syncVersion121.txt").openStream())).readLine().equals(ThunderHack.VERSION))
ThunderHack.isOutdated = true;
} catch (Exception ignored) {
}
@@ -92,7 +92,7 @@ public static void parseStarGazer() {
public static void syncContributors() {
try {
- URL list = new URL("https://raw.githubusercontent.com/Pan4ur/THRecodeUtil/main/thTeam.txt");
+ URL list = new URL("https://raw.githubusercontent.com/ulybaka1337/THRecodeImprovedUtil/main/thTeam.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(list.openStream(), StandardCharsets.UTF_8));
String inputLine;
int i = 0;
@@ -129,10 +129,10 @@ public static String readManifestField(String fieldName) {
public static void parseCommits() {
try {
- URL url = new URL("https://api.github.com/repos/Pan4ur/ThunderHack-Recode/commits?per_page=50");
+ URL url = new URL("https://api.github.com/repos/ulybaka1337/ThunderHack-Recode-Improved/commits?per_page=50");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
- changeLog.add("Changelog [Recode; Date: " + ThunderHack.BUILD_DATE + "; GitHash:" + ThunderHack.GITHUB_HASH + "]");
+ changeLog.add("Latest Commits [Recode Improved]");
changeLog.add("\n");
String inputLine;
diff --git a/src/main/resources/assets/thunderhack/lang/en_us.json b/src/main/resources/assets/thunderhack/lang/en_us.json
index b3f5594a..3b69248b 100644
--- a/src/main/resources/assets/thunderhack/lang/en_us.json
+++ b/src/main/resources/assets/thunderhack/lang/en_us.json
@@ -72,6 +72,7 @@
"descriptions.misc.visualrange": "Alerts you about players in the visual range.",
"descriptions.misc.worldtweaks": "Tweaks for world.",
"descriptions.misc.xray": "Diamonds? No problem.",
+ "descriptions.misc.pastedpaperdupe": "Paper dupe by crazymoose77756 and lefty ported into thunderhack.\nRequires writable book. Relog before use",
"descriptions.render.animations": "Nice hand animations.",
"descriptions.render.aspectratio": "Allows you to change the screen aspect ratio.",
diff --git a/src/main/resources/assets/thunderhack/textures/capes/aprarm.png b/src/main/resources/assets/thunderhack/textures/capes/aprarm.png
new file mode 100644
index 00000000..3b3989cf
Binary files /dev/null and b/src/main/resources/assets/thunderhack/textures/capes/aprarm.png differ
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index 3b38e35e..3e03df07 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -1,9 +1,9 @@
{
"schemaVersion": 1,
"id": "thunderhack",
- "version": "1.7",
+ "version": "1.7.1",
"icon": "icon.png",
- "name": "ThunderHack",
+ "name": "ThunderHack Recode Improved",
"description": "Player Assistance Mod",
"authors": [
{
@@ -17,6 +17,12 @@
"contact": {
"discord": "dinner_enjoyer"
}
+ },
+ {
+ "name": "ulybaka1337",
+ "contact": {
+ "discord": "ulybaka"
+ }
}
],
"license": "GNU General Public License v3.0",
@@ -28,9 +34,9 @@
]
},
"contact": {
- "sources": "https://github.com/Pan4ur/ThunderHack-Recode",
- "homepage": "https://thunderhack-site.vercel.app",
- "issues": "https://github.com/Pan4ur/ThunderHack-Recode/issues"
+ "sources": "https://github.com/ulybaka1337/ThunderHack-Recode-Improved",
+ "homepage": "https://discord.gg/7radMBMnNZ",
+ "issues": "https://github.com/ulybaka1337/ThunderHack-Recode-Improved/issues"
},
"mixins": [
"thunderhack.mixins.json"