/* * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus * Copyright (C) 2021-2023 FlorianMichael/MrLookAtMe (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.viafabricplus.information.impl; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viafabricplus.definition.bedrock.storage.JoinGameStorage; import de.florianmichael.viafabricplus.definition.bedrock.ModelFormats; import de.florianmichael.viafabricplus.information.AbstractInformationGroup; import de.florianmichael.viafabricplus.util.ScreenUtil; import de.florianmichael.vialoadingbase.platform.ProtocolRange; import net.lenni0451.reflect.stream.RStream; import net.lenni0451.reflect.stream.field.FieldStream; import net.raphimc.viabedrock.api.BedrockProtocolVersion; import net.raphimc.viabedrock.api.chunk.BedrockChunk; import net.raphimc.viabedrock.api.model.entity.Entity; import net.raphimc.viabedrock.protocol.storage.BlobCache; import net.raphimc.viabedrock.protocol.storage.ChunkTracker; import net.raphimc.viabedrock.protocol.storage.GameSessionStorage; import java.util.List; import java.util.Map; import java.util.Set; public class BedrockInformation extends AbstractInformationGroup { public BedrockInformation() { super(ProtocolRange.singleton(BedrockProtocolVersion.bedrockLatest)); } @Override public void applyInformation(UserConnection userConnection, List output) { final BlobCache blobCache = userConnection.get(BlobCache.class); if (blobCache != null) { final long totalSize = blobCache.getTotalSize(); final int blobCount = blobCache.getBlobCount(); final int pendingCount = blobCache.getPendingCount(); if (totalSize != 0 || blobCount != 0 || pendingCount != 0) { output.add("Blob Cache:"); } if (totalSize != 0) output.add("Total size: " + ScreenUtil.formatBytes(totalSize)); if (blobCount != 0) output.add("Blob count: " + blobCount); if (pendingCount != 0) output.add("Pending count: " + pendingCount); } final ChunkTracker chunkTracker = userConnection.get(ChunkTracker.class); if (chunkTracker != null) { final FieldStream fields = RStream.of(chunkTracker).fields(); final int subChunkRequests = fields.by("subChunkRequests").>get().size(); final int pendingSubChunks = fields.by("pendingSubChunks").>get().size(); final int chunks = fields.by("chunks").>get().size(); if (subChunkRequests != 0 || pendingSubChunks != 0 || chunks != 0) { if (!output.isEmpty()) output.add(""); output.add("Chunk Tracker:"); } if (subChunkRequests != 0) output.add("Sub-chunk requests: " + subChunkRequests); if (pendingSubChunks != 0) output.add("Pending Sub-chunks: " + pendingSubChunks); if (chunks != 0) output.add("Chunks: " + chunks); } final net.raphimc.viabedrock.protocol.storage.EntityTracker entityTracker = userConnection.get(net.raphimc.viabedrock.protocol.storage.EntityTracker.class); if (entityTracker != null) { if (!output.isEmpty()) output.add(""); final int entities = RStream.of(entityTracker).fields().by("entities").>get().size(); if (entities != 0) { output.add("Entity Tracker: " + entities); } } final JoinGameStorage joinGameStorage = userConnection.get(JoinGameStorage.class); if (!joinGameStorage.getLevelId().isEmpty() || joinGameStorage.getSeed() != 0 || joinGameStorage.getEnchantmentSeed() != 0) { if (!output.isEmpty()) output.add(""); output.add("Join Game:"); } if (joinGameStorage.getSeed() != 0) output.add("World Seed: " + joinGameStorage.getSeed()); if (!joinGameStorage.getLevelId().isEmpty()) output.add("Level Id: " + joinGameStorage.getLevelId()); if (joinGameStorage.getEnchantmentSeed() != 0) output.add("Enchantment Seed: " + joinGameStorage.getEnchantmentSeed()); final GameSessionStorage gameSessionStorage = userConnection.get(GameSessionStorage.class); if (gameSessionStorage != null) { output.add("Movement mode: " + ModelFormats.formatMovementMode(gameSessionStorage.getMovementMode())); } } }