Skip to content

Commit bc953e5

Browse files
committed
Merge branch 'fabric' of github.com:Earthcomputer/clientcommands into fabric
2 parents 2d16743 + af230b9 commit bc953e5

File tree

9 files changed

+441
-36
lines changed

9 files changed

+441
-36
lines changed

src/main/java/net/cortex/clientAddon/cracker/Lattice_cracker.java

Lines changed: 256 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package net.cortex.clientAddon.cracker;
2+
3+
import net.earthcomputer.clientcommands.features.EnchantmentCracker;
4+
import net.minecraft.client.MinecraftClient;
5+
import net.minecraft.client.network.ClientPlayerEntity;
6+
import net.minecraft.client.network.packet.EntitySpawnS2CPacket;
7+
import net.minecraft.entity.EntityType;
8+
import net.minecraft.network.MessageType;
9+
import net.minecraft.server.network.packet.PlayerMoveC2SPacket;
10+
import net.minecraft.text.TranslatableText;
11+
import net.minecraft.util.Formatting;
12+
13+
import java.util.Random;
14+
import static net.earthcomputer.clientcommands.features.EnchantmentCracker.MULTIPLIER;
15+
16+
public class SeedCracker {
17+
public interface OnCrack {void callback(long seed); }
18+
19+
20+
public static OnCrack callback;
21+
public static long[] bits=new long[20];
22+
public static int expectedItems=0;
23+
public static boolean cracking=false;
24+
25+
//returns True on success or false on failer
26+
private static boolean throwItems()
27+
{
28+
ClientPlayerEntity player = MinecraftClient.getInstance().player;
29+
player.setPositionAndAngles(player.x, player.y, player.z, 0, 90);
30+
MinecraftClient.getInstance().getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.LookOnly(0, 90, true)); // point to correct location
31+
for (int i = 0; i < 20; i++) {
32+
EnchantmentCracker.EnchantManipulationStatus status = EnchantmentCracker.throwItem();
33+
if (status != EnchantmentCracker.EnchantManipulationStatus.OK && status != EnchantmentCracker.EnchantManipulationStatus.NOT_CRACKED) {
34+
MinecraftClient.getInstance().inGameHud.addChatMessage(MessageType.GAME_INFO, new TranslatableText("itemCrack.notEnoughItems").formatted(Formatting.RED));
35+
EnchantmentCracker.LOGGER.info("Unable to use rng SeedCracker |not enough items|");
36+
return false;
37+
}
38+
}
39+
return true;
40+
}
41+
public static void attemptCrack()
42+
{
43+
cracking=false;
44+
long seed= Lattice_cracker.crack(SeedCracker.bits);
45+
46+
if(seed==0)//Basicaly if seed is zero it means it failed to try to crack again
47+
{
48+
SeedCracker.crack(SeedCracker.callback);
49+
return;
50+
}
51+
//Else, got a seed
52+
53+
Random rand=new Random();
54+
rand.setSeed(seed ^ MULTIPLIER);
55+
rand.nextFloat();
56+
rand.nextFloat();
57+
//rand.nextFloat();
58+
59+
/*
60+
for(int i=0;i<13;i++) {
61+
long x = (((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL;
62+
System.out.print("Expected: "+padLeftZeros(Long.toBinaryString(x), 4)+" ");
63+
System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" ");
64+
System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" ");
65+
System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" \n");
66+
}*/
67+
68+
callback.callback(EnchantmentCracker.getSeed(rand));//extract seed and call callback
69+
}
70+
public static void crack(OnCrack Callback){
71+
callback=Callback;
72+
if(throwItems())
73+
{
74+
cracking=true;
75+
expectedItems=20;
76+
}
77+
}
78+
79+
public static void onEntityCreation(EntitySpawnS2CPacket packet) {
80+
if (packet.getEntityTypeId() == EntityType.ITEM && SeedCracker.expectedItems>0) {
81+
82+
long rand_val = (long) ((Math.atan2(packet.getVelocityz(), packet.getVelocityX()) + Math.PI) / (Math.PI * 2) * ((float) (1 << 24)));
83+
long top_bits = rand_val;
84+
short value = (short) (((top_bits >> (24 - 4)) ^ 0x8L )&0xFL);//INSTEAD OF ^0x8L MAYBE DO +math.pi OR SOMETHING ELSE
85+
SeedCracker.bits[20-SeedCracker.expectedItems]=(long)value;//could be improved
86+
SeedCracker.expectedItems--;
87+
}
88+
if(SeedCracker.expectedItems==0&&SeedCracker.cracking)//if its the last item
89+
{
90+
SeedCracker.attemptCrack();
91+
}
92+
/*
93+
else
94+
{
95+
long rand_val = (long) ((Math.atan2(this.getVelocityz(), this.getVelocityX()) + Math.PI) / (Math.PI * 2) * ((float) (1 << 24)));
96+
long top_bits = rand_val;
97+
short value = (short) ((top_bits >> (24 - 4)) ^ 0x8L);
98+
System.out.println("Entity item spawn: Top 4 bits of direction: "+padLeftZeros(Long.toBinaryString(value), 4));
99+
}*/
100+
}
101+
}

src/main/java/net/earthcomputer/clientcommands/ClientCommands.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ public static void registerCommands(CommandDispatcher<ServerCommandSource> dispa
3030
WikiCommand.register(dispatcher);
3131
CEnchantCommand.register(dispatcher);
3232

33+
CrackRNGCommand.register(dispatcher);
34+
3335
if (MinecraftClient.getInstance().isIntegratedServerRunning()) {
34-
CrackPlayerRNGCommand.register(dispatcher);
36+
CheatCrackRNGCommand.register(dispatcher);
3537
}
3638
}
3739
}

src/main/java/net/earthcomputer/clientcommands/command/CrackPlayerRNGCommand.java renamed to src/main/java/net/earthcomputer/clientcommands/command/CheatCrackRNGCommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@
88
import static net.earthcomputer.clientcommands.command.ClientCommandManager.*;
99
import static net.minecraft.server.command.CommandManager.*;
1010

11-
public class CrackPlayerRNGCommand {
11+
public class CheatCrackRNGCommand {
1212

1313
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
14-
addClientSideCommand("ccrackplayerrng");
14+
addClientSideCommand("ccheatcrackrng");
1515

16-
dispatcher.register(literal("ccrackplayerrng")
16+
dispatcher.register(literal("ccheatcrackrng")
1717
.executes(ctx -> crackPlayerRNG(ctx.getSource())));
1818
}
1919

2020
private static int crackPlayerRNG(ServerCommandSource source) {
2121
long seed = EnchantmentCracker.singlePlayerCrackRNG();
22-
sendFeedback(new TranslatableText("commands.ccrackplayerrng.success", Long.toHexString(seed)));
22+
sendFeedback(new TranslatableText("commands.ccrackrng.success", Long.toHexString(seed)));
2323
return (int) seed;
2424
}
2525

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.earthcomputer.clientcommands.command;
2+
3+
import com.mojang.brigadier.CommandDispatcher;
4+
import net.cortex.clientAddon.cracker.SeedCracker;
5+
import net.earthcomputer.clientcommands.TempRules;
6+
import net.earthcomputer.clientcommands.features.EnchantmentCracker;
7+
import net.minecraft.server.command.ServerCommandSource;
8+
import net.minecraft.text.TranslatableText;
9+
10+
import static net.earthcomputer.clientcommands.command.ClientCommandManager.addClientSideCommand;
11+
import static net.earthcomputer.clientcommands.command.ClientCommandManager.sendFeedback;
12+
import static net.earthcomputer.clientcommands.features.EnchantmentCracker.EnumCrackState.CRACKED_PLAYER_SEED;
13+
import static net.earthcomputer.clientcommands.features.EnchantmentCracker.MULTIPLIER;
14+
import static net.minecraft.server.command.CommandManager.literal;
15+
16+
public class CrackRNGCommand {
17+
18+
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
19+
addClientSideCommand("ccrackrng");
20+
21+
dispatcher.register(literal("ccrackrng")
22+
.executes(ctx -> crackPlayerRNG(ctx.getSource())));
23+
}
24+
25+
private static int crackPlayerRNG(ServerCommandSource source) {
26+
SeedCracker.crack(seed -> {
27+
sendFeedback(new TranslatableText("commands.ccrackrng.success", Long.toHexString(seed)));
28+
EnchantmentCracker.playerRand.setSeed(seed ^ MULTIPLIER);
29+
TempRules.enchCrackState=CRACKED_PLAYER_SEED;
30+
});
31+
return 0;
32+
}
33+
34+
}

src/main/java/net/earthcomputer/clientcommands/features/EnchantmentCracker.java

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public class EnchantmentCracker {
9494
* we want and determine n.
9595
*/
9696

97-
private static final Logger LOGGER = LogManager.getLogger("EnchantmentCracker");
97+
public static final Logger LOGGER = LogManager.getLogger("EnchantmentCracker");
9898

9999
// RNG CHECK
100100
/*
@@ -287,14 +287,14 @@ public static void drawEnchantmentGUIOverlay() {
287287
* This section is in charge of the logic of the cracking
288288
*/
289289

290-
private static final long MULTIPLIER = 0x5deece66dL;
291-
private static final long ADDEND = 0xbL;
292-
private static final long MASK = (1L << 48) - 1;
290+
public static final long MULTIPLIER = 0x5deece66dL;
291+
public static final long ADDEND = 0xbL;
292+
public static final long MASK = (1L << 48) - 1;
293293

294294
private static Set<Integer> possibleXPSeeds = new HashSet<>(1 << 20);
295295
private static boolean onFirstXPSeed = true;
296296
private static Set<Long> possiblePlayerRandSeeds = new HashSet<>(1 << 16);
297-
private static Random playerRand = new Random();
297+
public static Random playerRand = new Random();
298298
private static boolean doneEnchantment = false;
299299
public static BlockPos enchantingTablePos = null;
300300

@@ -558,13 +558,8 @@ public void body() {
558558

559559
@Override
560560
public void onCompleted() {
561-
Slot matchingSlot = player.container.slotList.stream()
562-
.filter(Slot::hasStack).findAny().orElse(null);
563-
assert matchingSlot != null;
564-
expectedThrows++;
565-
for (int i = 0; i < 4; i++) playerRand.nextInt();
566-
567-
MinecraftClient.getInstance().interactionManager.method_2906(player.container.syncId, matchingSlot.id, 0, SlotActionType.THROW, player);
561+
EnchantManipulationStatus status = throwItem();
562+
assert status == EnchantManipulationStatus.OK;
568563

569564
scheduleDelay();
570565
}
@@ -615,12 +610,11 @@ public static EnchantManipulationStatus throwItemsUntil(Predicate<Random> condit
615610
}
616611
*/
617612

618-
/*
619613
public static EnchantManipulationStatus throwItemsUntil(Predicate<Random> condition, int max) {
620614
if (TempRules.enchCrackState != EnumCrackState.CRACKED)
621615
return EnchantManipulationStatus.NOT_CRACKED;
622616

623-
long seed = ReflectionHelper.<AtomicLong, Random>getPrivateValue(Random.class, playerRand, "seed").get();
617+
long seed = getSeed(playerRand);
624618
Random rand = new Random(seed ^ MULTIPLIER);
625619

626620
int itemsNeeded = 0;
@@ -632,28 +626,37 @@ public static EnchantManipulationStatus throwItemsUntil(Predicate<Random> condit
632626
if (itemsNeeded > max)
633627
return EnchantManipulationStatus.IMPOSSIBLE;
634628

635-
EntityPlayerSP player = Minecraft.getMinecraft().player;
636-
637629
for (int i = 0; i < itemsNeeded; i++) {
638-
EnchantManipulationStatus status = manipulateEnchantmentsSanityCheck(player);
630+
EnchantManipulationStatus status = throwItem();
639631
if (status != EnchantManipulationStatus.OK)
640632
return status;
641-
Slot matchingSlot = player.inventoryContainer.inventorySlots.stream()
642-
.filter(Slot::getHasStack).findAny().orElse(null);
643-
if (matchingSlot == null) {
644-
return EnchantManipulationStatus.EMPTY_INVENTORY;
645-
}
633+
}
634+
635+
return EnchantManipulationStatus.OK;
636+
}
637+
638+
public static EnchantManipulationStatus throwItem() {
639+
ClientPlayerEntity player = MinecraftClient.getInstance().player;
640+
641+
EnchantManipulationStatus status = manipulateEnchantmentsSanityCheck(player);
642+
if (status != EnchantManipulationStatus.OK && status != EnchantManipulationStatus.NOT_CRACKED)
643+
return status;
644+
Slot matchingSlot = player.container.slotList.stream()
645+
.filter(Slot::hasStack).findAny().orElse(null);
646+
if (matchingSlot == null) {
647+
return EnchantManipulationStatus.EMPTY_INVENTORY;
648+
}
649+
if (status != EnchantManipulationStatus.NOT_CRACKED) {
646650
expectedThrows++;
647651
for (int j = 0; j < 4; j++) {
648652
playerRand.nextInt();
649653
}
650-
Minecraft.getMinecraft().playerController.windowClick(player.inventoryContainer.windowId,
651-
matchingSlot.slotNumber, 0, ClickType.THROW, player);
652654
}
655+
MinecraftClient.getInstance().interactionManager.method_2906(player.container.syncId,
656+
matchingSlot.id, 0, SlotActionType.THROW, player);
653657

654-
return EnchantManipulationStatus.OK;
658+
return status;
655659
}
656-
*/
657660

658661
public static long singlePlayerCrackRNG() {
659662
ServerPlayerEntity serverPlayer = MinecraftClient.getInstance().getServer().getPlayerManager().getPlayer(MinecraftClient.getInstance().player.getUuid());
@@ -763,7 +766,7 @@ public static List<InfoEnchantment> getEnchantmentsInTable(int slot) {
763766
}
764767
RANDOM_SEED.setAccessible(true);
765768
}
766-
private static long getSeed(Random rand) {
769+
public static long getSeed(Random rand) {
767770
try {
768771
return ((AtomicLong) RANDOM_SEED.get(rand)).get();
769772
} catch (ReflectiveOperationException e) {
@@ -787,4 +790,4 @@ public String asString() {
787790
}
788791
}
789792

790-
}
793+
}

src/main/java/net/earthcomputer/clientcommands/mixin/MixinClientPlayNetworkHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package net.earthcomputer.clientcommands.mixin;
22

33
import com.mojang.brigadier.CommandDispatcher;
4+
import net.cortex.clientAddon.cracker.SeedCracker;
45
import net.earthcomputer.clientcommands.ClientCommands;
56
import net.minecraft.client.network.ClientPlayNetworkHandler;
67
import net.minecraft.client.network.packet.CommandTreeS2CPacket;
8+
import net.minecraft.client.network.packet.EntitySpawnS2CPacket;
79
import net.minecraft.server.command.CommandSource;
810
import net.minecraft.server.command.ServerCommandSource;
911
import org.spongepowered.asm.mixin.Mixin;
@@ -24,4 +26,9 @@ public void onOnCommandTree(CommandTreeS2CPacket packet, CallbackInfo ci) {
2426
ClientCommands.registerCommands((CommandDispatcher<ServerCommandSource>) (Object) commandDispatcher);
2527
}
2628

29+
@Inject(method = "onEntitySpawn", at = @At("RETURN"))
30+
public void onOnEntitySpawn(EntitySpawnS2CPacket packet, CallbackInfo ci) {
31+
SeedCracker.onEntityCreation(packet);
32+
}
33+
2734
}

src/main/resources/assets/clientcommands/lang/en_us.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"commands.ccalc.expected": "Expected %s",
55
"commands.ccalc.invalidArgumentCount": "Function \"%s\" cannot take %d arguments",
66

7-
"commands.ccrackplayerrng.success": "Player RNG cracked: %d",
7+
"commands.ccrackrng.success": "Player RNG cracked: %d",
88

99
"commands.cenchant.expectedWithWithout": "Expected \"with\"/\"without\"",
1010
"commands.cenchant.incompatible": "Incompatible enchantments",
@@ -93,6 +93,8 @@
9393

9494
"enchCrack.addInfo": "Add Info",
9595

96-
"enchCrack.toolBreakWarning": "Warning: tool has %d durability left"
96+
"enchCrack.toolBreakWarning": "Warning: tool has %d durability left",
97+
98+
"itemCrack.notEnoughItems": "Unable to use RNG SeedCracker: Not Enough Items in Player Hand"
9799

98100
}

src/main/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"fabric": "*"
1212
},
1313
"mixins": {
14-
"client": "mixins.clientcommands.json"
14+
"client": ["mixins.clientcommands.json"]
1515
}
1616
}

0 commit comments

Comments
 (0)