Re-add Debug Hud information list

This commit is contained in:
FlorianMichael 2023-11-26 12:33:46 +01:00
parent a19c7085e9
commit 55e9c024cf
No known key found for this signature in database
GPG Key ID: C2FB87E71C425126
9 changed files with 222 additions and 8 deletions

View File

@ -48,7 +48,6 @@ import java.io.File;
* TODO | Migration v3
* - Rename all methods
* - Use ViaProxy config patch for some clientside fixes options (Remove ViaFabricPlusVLViaConfig and MixinViaLegacyConfig)
* - Re-add Debug Hud information list
* - Fix auto detect to not be a huge mess
* - Fix MixinAbstractDonkeyEntity
* - Boats are probably broken. Check entity height offset fix

View File

@ -33,6 +33,8 @@ public class ViaFabricPlusMixinPlugin implements IMixinConfigPlugin {
private static final String MC_FIXES_PACKAGE = "fixes.minecraft.";
private static final String COMPAT_PACKAGE = "compat.";
public static String VFP_VERSION;
public static boolean DASH_LOADER_PRESENT;
public static boolean ARMOR_SKIN_PRESENT;
public static boolean IPNEXT_PRESENT;
@ -41,6 +43,8 @@ public class ViaFabricPlusMixinPlugin implements IMixinConfigPlugin {
public void onLoad(String mixinPackage) {
final FabricLoader loader = FabricLoader.getInstance();
VFP_VERSION = loader.getModContainer("viafabricplus").get().getMetadata().getVersion().getFriendlyString();
DASH_LOADER_PRESENT = loader.isModLoaded("dashloader");
ARMOR_SKIN_PRESENT = loader.isModLoaded("armorskin");
IPNEXT_PRESENT = loader.isModLoaded("inventoryprofilesnext");

View File

@ -0,0 +1,28 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 FlorianMichael/EnZaXD
* Copyright (C) 2023 RK_01/RaphiMC 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.injection.access;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
public interface IBlobCache {
Map<Long, CompletableFuture<byte[]>> viaFabricPlus$getPending();
}

View File

@ -19,9 +19,28 @@
package de.florianmichael.viafabricplus.injection.mixin.base.integration;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.ProtocolInfo;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import de.florianmichael.viafabricplus.fixes.tracker.JoinGameTracker;
import de.florianmichael.viafabricplus.injection.ViaFabricPlusMixinPlugin;
import de.florianmichael.viafabricplus.injection.access.IBlobCache;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.protocolhack.provider.viabedrock.ViaFabricPlusBlobCacheProvider;
import de.florianmichael.viafabricplus.settings.impl.GeneralSettings;
import de.florianmichael.viafabricplus.util.ChatUtil;
import de.florianmichael.viafabricplus.util.StringUtil;
import net.lenni0451.reflect.stream.RStream;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.DebugHud;
import net.raphimc.viabedrock.protocol.data.enums.bedrock.ServerMovementModes;
import net.raphimc.viabedrock.protocol.providers.BlobCacheProvider;
import net.raphimc.viabedrock.protocol.storage.BlobCache;
import net.raphimc.viabedrock.protocol.storage.GameSessionStorage;
import net.raphimc.vialegacy.protocols.classic.protocolc0_28_30toc0_28_30cpe.storage.ExtensionProtocolMetadataStorage;
import net.raphimc.vialegacy.protocols.release.protocol1_2_1_3to1_1.storage.SeedStorage;
import net.raphimc.vialegacy.protocols.release.protocol1_8to1_7_6_10.storage.EntityTracker;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -29,15 +48,88 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@SuppressWarnings("DataFlowIssue")
@Mixin(DebugHud.class)
public abstract class MixinDebugHud {
@Inject(method = "getLeftText", at = @At("RETURN"))
public void addViaFabricPlusInformation(CallbackInfoReturnable<List<String>> cir) {
if (MinecraftClient.getInstance().isInSingleplayer() || !GeneralSettings.global().showExtraInformationInDebugHud.getValue()) return;
if (!GeneralSettings.global().showExtraInformationInDebugHud.getValue()) {
return;
}
if (MinecraftClient.getInstance().isInSingleplayer() || ProtocolHack.getTargetVersion() == ProtocolHack.NATIVE_VERSION) {
return;
}
final UserConnection userConnection = ProtocolHack.getPlayNetworkUserConnection();
final List<String> information = new ArrayList<>();
information.add("");
// Title
information.add(ChatUtil.PREFIX + " " + ViaFabricPlusMixinPlugin.VFP_VERSION);
// common
final ProtocolInfo info = userConnection.getProtocolInfo();
information.add(
"P: " + info.getPipeline().pipes().size() +
" / C: " + ProtocolVersion.getProtocol(info.getProtocolVersion()) +
" / S: " + ProtocolVersion.getProtocol(info.getServerProtocolVersion())
);
// bedrock
final JoinGameTracker joinGameTracker = userConnection.get(JoinGameTracker.class);
if (joinGameTracker != null) {
final int movementMode = userConnection.get(GameSessionStorage.class).getMovementMode();
String movement = "Server with rewind";
if (movementMode == ServerMovementModes.CLIENT) {
movement = "Client";
} else if (movementMode == ServerMovementModes.SERVER) {
movement = "Server";
}
information.add("Bedrock Level: " + joinGameTracker.getLevelId() + " / Enchantment Seed: " + joinGameTracker.getEnchantmentSeed() + " / Movement: " + movement);
}
final BlobCache blobCache = userConnection.get(BlobCache.class);
if (blobCache != null) {
final var blobCacheProvider = (ViaFabricPlusBlobCacheProvider) Via.getManager().getProviders().get(BlobCacheProvider.class);
final long totalSize = blobCacheProvider.getSize();
final int blobCount = blobCacheProvider.getBlobs().size();
final int pendingCount = ((IBlobCache) blobCache).viaFabricPlus$getPending().size();
if (totalSize != 0 || blobCount != 0 || pendingCount != 0) {
information.add("Blob Cache: S: " + StringUtil.formatBytes(totalSize) + " / C: " + blobCount + " / Pending: " + pendingCount);
}
}
// r1_7_10
final EntityTracker entityTracker1_7_10 = userConnection.get(EntityTracker.class);
if (entityTracker1_7_10 != null) {
information.add(
"1.7 Entities: " + entityTracker1_7_10.getTrackedEntities().size() +
" / Virtual holograms: " + entityTracker1_7_10.getVirtualHolograms().size()
);
}
// r1_1 and bedrock
final SeedStorage seedStorage = userConnection.get(SeedStorage.class);
if (seedStorage != null) {
information.add("World Seed: " + seedStorage.seed);
} else if (joinGameTracker != null) {
information.add("World Seed: " + joinGameTracker.getSeed());
}
// c0.30cpe
final ExtensionProtocolMetadataStorage extensionProtocolMetadataStorage = userConnection.get(ExtensionProtocolMetadataStorage.class);
if (extensionProtocolMetadataStorage != null) {
information.add("CPE extensions: " + extensionProtocolMetadataStorage.getExtensionCount());
}
information.add("");
cir.getReturnValue().addAll(information);
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.viabedrock;
package de.florianmichael.viafabricplus.injection.mixin.viabedrock;
import com.viaversion.viaversion.api.connection.UserConnection;
import de.florianmichael.viafabricplus.fixes.tracker.JoinGameTracker;

View File

@ -0,0 +1,42 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 FlorianMichael/EnZaXD
* Copyright (C) 2023 RK_01/RaphiMC 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.injection.mixin.viabedrock;
import de.florianmichael.viafabricplus.injection.access.IBlobCache;
import net.raphimc.viabedrock.protocol.storage.BlobCache;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@Mixin(value = BlobCache.class, remap = false)
public class MixinBlobCache implements IBlobCache {
@Shadow
@Final
private Map<Long, CompletableFuture<byte[]>> pending;
@Override
public Map<Long, CompletableFuture<byte[]>> viaFabricPlus$getPending() {
return pending;
}
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.viabedrock;
package de.florianmichael.viafabricplus.injection.mixin.viabedrock;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Type;
@ -40,7 +40,7 @@ public abstract class MixinJoinPackets {
return seed;
}
@Redirect(method = "lambda$register$2", at = @At(value = "INVOKE", target = "Lcom/viaversion/viaversion/api/protocol/packet/PacketWrapper;read(Lcom/viaversion/viaversion/api/type/Type;)Ljava/lang/Object;", ordinal = 56))
@Redirect(method = "lambda$register$2", at = @At(value = "INVOKE", target = "Lcom/viaversion/viaversion/api/protocol/packet/PacketWrapper;read(Lcom/viaversion/viaversion/api/type/Type;)Ljava/lang/Object;", ordinal = 55))
private static Object trackLevelId(PacketWrapper instance, Type<StringType> tType) throws Exception {
final Object levelId = instance.read(tType);
instance.user().get(JoinGameTracker.class).setLevelId((String) levelId);

View File

@ -0,0 +1,48 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 FlorianMichael/EnZaXD
* Copyright (C) 2023 RK_01/RaphiMC 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.util;
import java.text.DecimalFormat;
// Stolen from https://github.com/FlorianMichael/RClasses/blob/main/common/src/main/java/de/florianmichael/rclasses/common/StringUtils.java
public class StringUtil {
/**
* Convention: IEC 60027-2
*/
private final static String[] BYTES_UNIT = {"B", "KiB", "MiB", "GiB", "TiB"};
private final static DecimalFormat OPTIONAL_FORMAT = new DecimalFormat("#.##");
/**
* Formats a value in bytes to a human-readable format
*
* @param value The raw value in bytes
* @return The formatted value in bytes
*/
public static String formatBytes(final long value) {
int index = (int) (Math.log(value) / Math.log(1024.0));
double data = value / Math.pow(1024.0, index);
if (index < 0) index = 0;
if (Double.isNaN(data)) data = 0;
return OPTIONAL_FORMAT.format(data) + " " + BYTES_UNIT[index];
}
}

View File

@ -134,8 +134,8 @@
"fixes.minecraft.screen.screenhandler.MixinCraftingScreenHandler",
"fixes.minecraft.screen.screenhandler.MixinPlayerScreenHandler",
"fixes.minecraft.screen.screenhandler.MixinScreenHandler",
"fixes.viabedrock.MixinBedrockProtocol",
"fixes.viabedrock.MixinJoinPackets",
"viabedrock.MixinBedrockProtocol",
"viabedrock.MixinJoinPackets",
"fixes.vialegacy.MixinClassicProtocolExtension",
"fixes.vialegacy.MixinClientboundPacketsc0_30cpe",
"fixes.vialegacy.MixinExtensionProtocolMetadataStorage",
@ -173,6 +173,7 @@
"fixes.minecraft.entity.MixinSkeletonHorseEntity",
"fixes.minecraft.item.MixinArmorItem",
"fixes.minecraft.item.MixinBowItem",
"fixes.minecraft.item.MixinShearsItem"
"fixes.minecraft.item.MixinShearsItem",
"viabedrock.MixinBlobCache"
]
}