make ping able to hold all packets
All checks were successful
/ Build BaseBand DSM & Broadway (push) Successful in 2m39s

This commit is contained in:
Daniella / Tove 2024-10-03 22:48:36 +02:00
parent 90f711b567
commit 9d948144b0
Signed by: TudbuT
GPG key ID: B3CF345217F202D3
4 changed files with 94 additions and 15 deletions

View file

@ -9,6 +9,7 @@ import de.com.baseband.client.feature.Feature;
import de.com.baseband.client.feature.Features;
import de.com.baseband.client.feature.modules.client.Client;
import de.com.baseband.client.feature.modules.render.HUD;
import de.com.baseband.client.mixin.MixinProxy;
import de.com.baseband.client.registry.Configuration;
import de.com.baseband.client.registry.Updater;
import de.com.baseband.client.util.interact.Chat;
@ -57,6 +58,7 @@ public class BaseBand {
}
mc = Minecraft.getMinecraft();
MixinProxy.minecraft = mc;
MinecraftForge.EVENT_BUS.register(STATIC_EVENT_HANDLER);

View file

@ -1,5 +1,6 @@
package de.com.baseband.client.feature.modules.ingame;
import de.com.baseband.client.BaseBand;
import de.com.baseband.client.event.events.PacketEvent;
import de.com.baseband.client.feature.Feature;
import de.com.baseband.client.feature.category.Ingame;
@ -7,19 +8,33 @@ import de.com.baseband.client.registry.annotation.Config;
import de.com.baseband.client.registry.annotation.Description;
import de.com.baseband.client.registry.annotation.Range;
import net.minecraft.network.play.client.CPacketKeepAlive;
import net.minecraft.network.play.server.SPacketKeepAlive;
import net.minecraft.network.Packet;
import java.util.LinkedList;
import java.util.Queue;
@Ingame
public class Ping extends Feature {
PacketHolder holder = null;
Queue<PacketHolder> holderSend = new LinkedList<>();
Queue<PacketHolder> holderRecv = new LinkedList<>();
long totalRecieved = 0;
long totalSent = 0;
@Config("Seconds")
@Description("How many seconds to add to your ping.\n" +
@Config("Hold all packets")
@Description("Hold all packets, not just ping.\nEnable this to increase your §lreal ping§r.")
public boolean holdAll = false;
@Config("Milliseconds")
@Description("How many milliseconds to add to your ping.\n" +
"§lWarning§r: You might get timed out on high settings (Time-out happens at 15 seconds including real ping).")
@Range("0..14")
public int seconds;
@Range("0..14000")
public int milliseconds;
Packet<?> allowRecv = null;
Packet<?> allowSend = null;
@Override
public String toString() {
@ -28,40 +43,92 @@ public class Ping extends Feature {
@Override
public void onEveryTick() {
meta = seconds + "s: " + totalRecieved + (holder == null ? "" : "§cH§7");
meta = milliseconds + "ms: " +
(holderSend.isEmpty() ? "-" : "§c" + holderSend.size()) + "↑§f/" +
(holderRecv.isEmpty() ? "-" : "§c" + holderRecv.size()) + "↓§7";
}
@Override
public void onTick() {
if (mc.player != null && holder != null && holder.passed()) {
mc.player.connection.sendPacket(holder.packet);
holder = null;
if(notIngame())
return;
while (true) {
PacketHolder holder = this.holderSend.peek();
if(holder == null || !holder.passed())
break;
this.holderSend.remove();
allowSend = holder.packet;
mc.player.connection.sendPacket(allowSend);
}
while (true) {
PacketHolder holder = this.holderRecv.peek();
if(holder == null || !holder.passed())
break;
this.holderRecv.remove();
allowRecv = holder.packet;
try {
mc.player.connection.getNetworkManager().channelRead(null, allowRecv);
} catch (Exception e) {
BaseBand.notifyAll("!! BaseBand encountered a BUG. Please report as soon as possible and include the game log.");
new RuntimeException("[BaseBand BUG] Cannot emulate packet read", e).printStackTrace();
}
}
}
public void onDisable() {
totalRecieved = 0;
totalSent = 0;
if(notIngame()) {
holderSend.clear();
holderRecv.clear();
return;
}
while(!holderSend.isEmpty()) {
allowSend = holderSend.remove().packet;
mc.player.connection.sendPacket(allowSend);
}
while(!holderRecv.isEmpty()) {
allowRecv = holderRecv.remove().packet;
try {
mc.player.connection.getNetworkManager().channelRead(null, allowRecv);
} catch (Exception e) {
BaseBand.notifyAll("!! BaseBand encountered a BUG. Please report as soon as possible and include the game log.");
new RuntimeException("[BaseBand BUG] Cannot emulate packet read", e).printStackTrace();
}
}
}
public void onPacket(PacketEvent.Send e) {
if (e.getPacket() instanceof CPacketKeepAlive && holder == null) {
if(allowSend == e.getPacket())
return;
if (e.getPacket() instanceof CPacketKeepAlive || holdAll) {
totalSent++;
holderSend.add(new PacketHolder(e.getPacket(), System.currentTimeMillis()));
e.setCancelled(true);
}
}
public void onPacket(PacketEvent.Receive e) {
if(allowRecv == e.getPacket())
return;
if (e.getPacket() instanceof SPacketKeepAlive || holdAll) {
totalRecieved++;
holder = new PacketHolder((CPacketKeepAlive) e.getPacket(), System.currentTimeMillis());
holderRecv.add(new PacketHolder(e.getPacket(), System.currentTimeMillis()));
e.setCancelled(true);
}
}
public class PacketHolder {
long time;
CPacketKeepAlive packet;
Packet<?> packet;
public PacketHolder(CPacketKeepAlive packet, long time) {
public PacketHolder(Packet<?> packet, long time) {
this.time = time;
this.packet = packet;
}
public boolean passed() {
return (System.currentTimeMillis() - time) >= (seconds * 1000L);
return (System.currentTimeMillis() - time) >= (milliseconds / 2L);
}
}
}

View file

@ -16,6 +16,7 @@ import de.com.baseband.client.util.adapt.FieldFinder;
import de.com.baseband.client.util.net.ScreenshotHelper;
import de.com.baseband.prod.LoadHandler;
import de.tudbut.tools.Tools;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ChatLine;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.multiplayer.WorldClient;
@ -43,6 +44,8 @@ public class MixinProxy {
@Unique
public static final Field FIELD_PITCH = FieldFinder.findUnmarked(CPacketPlayer.class, float.class, 1);
public static Minecraft minecraft;
public static void saveScreenshot(int n, int n2, Framebuffer framebuffer) {
if(!Features.isFeatureEnabled(Client.class))
return;

View file

@ -4,21 +4,28 @@ import de.com.baseband.client.mixin.MixinProxy;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
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(NetworkManager.class)
@SideOnly(Side.CLIENT)
public class MixinNetworkManager {
@Inject(method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/Packet;)V", at = @At("HEAD"), cancellable = true)
public void channelRead0(ChannelHandlerContext p_channelRead0_1_, Packet<?> p_channelRead0_2_, CallbackInfo ci) {
if(MixinProxy.minecraft.player != null && MixinProxy.minecraft.player.connection.getNetworkManager() != (Object) this)
return;
MixinProxy.onPacketReceive(p_channelRead0_2_, ci);
}
@Inject(method = "sendPacket(Lnet/minecraft/network/Packet;)V", at = @At("HEAD"), cancellable = true)
public void channelRead0(Packet<?> packetIn, CallbackInfo ci) {
public void sendPacket(Packet<?> packetIn, CallbackInfo ci) {
if(MixinProxy.minecraft.player != null && MixinProxy.minecraft.player.connection.getNetworkManager() != (Object) this)
return;
MixinProxy.onPacketSend(packetIn, ci);
}