sync outgoing packets

This commit is contained in:
FlorianMichael 2023-04-23 18:50:26 +02:00
parent 597d57b50f
commit 929ab2f588
2 changed files with 27 additions and 24 deletions

View File

@ -17,6 +17,7 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.api.type.Type;
@ -99,35 +100,36 @@ public abstract class MixinClientPlayerInteractionManager {
@Redirect(method = "clickSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V"))
private void modifySlotClickPacket(ClientPlayNetworkHandler instance, Packet<?> packet) {
try {
if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(ProtocolVersion.v1_16_4) && packet instanceof ClickSlotC2SPacket clickSlot) {
ItemStack slotItemBeforeModification;
if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(ProtocolVersion.v1_16_4) && packet instanceof ClickSlotC2SPacket clickSlot) {
ItemStack slotItemBeforeModification;
if (this.viafabricplus_shouldEmpty(clickSlot.getActionType(), clickSlot.getSlot()))
slotItemBeforeModification = ItemStack.EMPTY;
else if (clickSlot.getSlot() < 0 || clickSlot.getSlot() >= viafabricplus_oldItems.size())
slotItemBeforeModification = viafabricplus_oldCursorStack;
else
slotItemBeforeModification = viafabricplus_oldItems.get(clickSlot.getSlot());
if (this.viafabricplus_shouldEmpty(clickSlot.getActionType(), clickSlot.getSlot()))
slotItemBeforeModification = ItemStack.EMPTY;
else if (clickSlot.getSlot() < 0 || clickSlot.getSlot() >= viafabricplus_oldItems.size())
slotItemBeforeModification = viafabricplus_oldCursorStack;
else
slotItemBeforeModification = viafabricplus_oldItems.get(clickSlot.getSlot());
final PacketWrapper clickSlotPacket = PacketWrapper.create(ServerboundPackets1_16_2.CLICK_WINDOW, networkHandler.getConnection().channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).get());
final UserConnection viaConnection = networkHandler.getConnection().channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).get();
viaConnection.getChannel().eventLoop().submit(() -> {
final PacketWrapper clickSlotPacket = PacketWrapper.create(ServerboundPackets1_16_2.CLICK_WINDOW, viaConnection);
clickSlotPacket.write(Type.UNSIGNED_BYTE, (short) clickSlot.getSyncId());
clickSlotPacket.write(Type.SHORT, (short) clickSlot.getSlot());
clickSlotPacket.write(Type.BYTE, (byte) clickSlot.getButton());
assert client.player != null;
clickSlotPacket.write(Type.SHORT, ((IScreenHandler) client.player.currentScreenHandler).viafabricplus_getAndIncrementLastActionId());
clickSlotPacket.write(Type.VAR_INT, clickSlot.getActionType().ordinal());
clickSlotPacket.write(Type.FLAT_VAR_INT_ITEM, ItemTranslator.minecraftToViaVersion(clickSlotPacket.user(), slotItemBeforeModification, ProtocolVersion.v1_16.getVersion()));
clickSlotPacket.sendToServer(Protocol1_17To1_16_4.class);
try {
clickSlotPacket.sendToServer(Protocol1_17To1_16_4.class);
} catch (Exception ignored) {}
});
viafabricplus_oldCursorStack = null;
viafabricplus_oldItems = null;
viafabricplus_oldCursorStack = null;
viafabricplus_oldItems = null;
return;
}
} catch (Exception ignored) {
return;
}
instance.sendPacket(packet);

View File

@ -76,9 +76,6 @@ public abstract class MixinMinecraftClient implements IMinecraftClient {
return instance.isAccepted();
}
/**
* This code removes the cooldown if
*/
@Redirect(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;attackCooldown:I", ordinal = 1))
public int unwrapOperation(MinecraftClient instance) {
if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(ProtocolVersion.v1_8)) {
@ -117,15 +114,19 @@ public abstract class MixinMinecraftClient implements IMinecraftClient {
}
@Inject(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;hasRidingInventory()Z"))
private void onInventoryKeyPressed(CallbackInfo ci) throws Exception {
private void onInventoryKeyPressed(CallbackInfo ci) {
if (getNetworkHandler() != null && DebugSettings.INSTANCE.sendOpenInventoryPacket.getValue()) {
final UserConnection viaConnection = MinecraftClient.getInstance().getNetworkHandler().getConnection().channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).get();
if (viaConnection != null && viaConnection.getProtocolInfo().getPipeline().contains(Protocol1_12To1_11_1.class)) {
final PacketWrapper clientStatus = PacketWrapper.create(ServerboundPackets1_9_3.CLIENT_STATUS, viaConnection);
clientStatus.write(Type.VAR_INT, 2); // Open Inventory Achievement
viaConnection.getChannel().eventLoop().submit(() -> {
final PacketWrapper clientStatus = PacketWrapper.create(ServerboundPackets1_9_3.CLIENT_STATUS, viaConnection);
clientStatus.write(Type.VAR_INT, 2); // Open Inventory Achievement
clientStatus.sendToServer(Protocol1_12To1_11_1.class);
try {
clientStatus.sendToServer(Protocol1_12To1_11_1.class);
} catch (Exception ignored) {}
});
}
}
}