/* * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge * Copyright (C) 2021-2024 FlorianMichael/EnZaXD and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package de.florianmichael.viaforge.mixin.impl.fixes; import com.mojang.authlib.GameProfile; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import de.florianmichael.viaforge.common.ViaForgeCommon; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.world.World; 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; @Mixin(EntityPlayerSP.class) public class MixinEntityPlayerSP extends AbstractClientPlayer { @Shadow private boolean prevOnGround; public MixinEntityPlayerSP(World worldIn, GameProfile playerProfile) { super(worldIn, playerProfile); } @Redirect(method = "onUpdateWalkingPlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/client/entity/EntityPlayerSP;prevOnGround:Z", ordinal = 0)) public boolean emulateIdlePacket(EntityPlayerSP instance) { if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) { // <= 1.8 spams the idle packet instead of only sending it when the ground state changes // So we invert the original logic: // if (prevOnGround != onGround) sendPacket // To be like: // if (!onGround != onGround) sendPacket // Which is the same as: // if (true) sendPacket return !onGround; } return prevOnGround; } }