Rewrite handling of almost all clientside fixes

Fixed https://github.com/ViaVersion/ViaFabricPlus/issues/237
This commit is contained in:
FlorianMichael 2023-09-02 23:46:01 +02:00
parent 5fe5d24145
commit 7b6355ada8
No known key found for this signature in database
GPG Key ID: C2FB87E71C425126
45 changed files with 393 additions and 534 deletions

View File

@ -23,12 +23,10 @@ import de.florianmichael.viafabricplus.base.file.ViaJarReplacer;
import de.florianmichael.viafabricplus.base.event.FinishMinecraftLoadCallback;
import de.florianmichael.viafabricplus.base.event.PreLoadCallback;
import de.florianmichael.viafabricplus.base.settings.SettingsSystem;
import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.definition.account.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.classic.protocol.CustomClassicProtocolExtensions;
import de.florianmichael.viafabricplus.definition.FontRenderer1_12_2;
import de.florianmichael.viafabricplus.definition.ArmorPointCalculation;
import de.florianmichael.viafabricplus.information.InformationSystem;
import de.florianmichael.viafabricplus.mappings.CharacterMappings;
import de.florianmichael.viafabricplus.mappings.ItemReleaseVersionMappings;
@ -82,9 +80,8 @@ public class ViaFabricPlus {
BedrockAccountHandler.create();
// Fixes which requires to be loaded pre
ChatLengthCalculation.create();
ClientsideFixes.init();
CharacterMappings.load();
FontRenderer1_12_2.init();
// Protocol Translator
ProtocolHack.init();
@ -101,7 +98,6 @@ public class ViaFabricPlus {
// Version related mappings
PackFormatsMappings.load();
ItemReleaseVersionMappings.create();
ArmorPointCalculation.load();
});
}

View File

@ -21,7 +21,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
import de.florianmichael.viafabricplus.base.settings.base.SettingGroup;
import de.florianmichael.viafabricplus.base.settings.type_impl.BooleanSetting;
import de.florianmichael.viafabricplus.base.settings.type_impl.ButtonSetting;
import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.account.BedrockAccountHandler;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ConfirmScreen;
import net.minecraft.client.gui.screen.NoticeScreen;

View File

@ -1,71 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ArmorType;
import net.minecraft.client.MinecraftClient;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.registry.Registries;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ArmorPointCalculation {
public final static List<Item> ARMOR_ITEMS_IN_1_8 = Arrays.asList(
Items.LEATHER_HELMET,
Items.LEATHER_CHESTPLATE,
Items.LEATHER_BOOTS,
Items.CHAINMAIL_HELMET,
Items.CHAINMAIL_CHESTPLATE,
Items.CHAINMAIL_LEGGINGS,
Items.CHAINMAIL_BOOTS,
Items.IRON_HELMET,
Items.IRON_CHESTPLATE,
Items.IRON_LEGGINGS,
Items.IRON_BOOTS,
Items.DIAMOND_HELMET,
Items.DIAMOND_CHESTPLATE,
Items.DIAMOND_LEGGINGS,
Items.DIAMOND_BOOTS,
Items.GOLDEN_HELMET,
Items.GOLDEN_CHESTPLATE,
Items.GOLDEN_LEGGINGS,
Items.GOLDEN_BOOTS
);
private final static Map<Item, Integer> armorTracker = new HashMap<>();
public static void load() {
for (Item armorItem : ARMOR_ITEMS_IN_1_8) {
armorTracker.put(armorItem, ArmorType.findByType(Registries.ITEM.getId(armorItem).toString()).getArmorPoints());
}
}
private static int getArmorPoints(final ItemStack itemStack) {
if (!armorTracker.containsKey(itemStack.getItem())) return 0;
return armorTracker.get(itemStack.getItem());
}
public static int sum() {
return MinecraftClient.getInstance().player.getInventory().armor.stream().mapToInt(ArmorPointCalculation::getArmorPoints).sum();
}
}

View File

@ -0,0 +1,67 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import net.minecraft.client.font.Glyph;
import net.minecraft.client.font.GlyphRenderer;
import net.minecraft.client.font.RenderableGlyph;
import java.util.function.Function;
/**
* Implementation of a "Very Missing" Glyph which doesn't have any rendering at all ("Missing" in <= 1.12.2)
*/
public enum BuiltinEmptyGlyph1_12_2 implements Glyph {
VERY_MISSING;
@Override
public float getAdvance() {
return 1;
}
@Override
public GlyphRenderer bake(Function<RenderableGlyph, GlyphRenderer> function) {
return function.apply(new RenderableGlyph() {
@Override
public int getWidth() {
return 0;
}
@Override
public int getHeight() {
return 0;
}
@Override
public float getOversample() {
return 1.0f;
}
@Override
public void upload(int x, int y) {
}
@Override
public boolean hasColor() {
return true;
}
});
}
}

View File

@ -1,58 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import net.raphimc.vialoader.util.VersionEnum;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.base.event.LoadClassicProtocolExtensionCallback;
import net.minecraft.client.MinecraftClient;
import net.raphimc.vialoader.util.VersionEnum;
import net.raphimc.vialegacy.api.LegacyProtocolVersion;
import net.raphimc.vialegacy.protocols.classic.protocolc0_28_30toc0_28_30cpe.data.ClassicProtocolExtension;
public class ChatLengthCalculation {
public static ChatLengthCalculation INSTANCE;
private int maxLength = 256;
public static void create() {
INSTANCE = new ChatLengthCalculation();
ChangeProtocolVersionCallback.EVENT.register(protocolVersion -> {
INSTANCE.maxLength = 256;
if (protocolVersion.isOlderThanOrEqualTo(VersionEnum.r1_10)) {
INSTANCE.maxLength = 100;
if (protocolVersion.isOlderThanOrEqualTo(VersionEnum.c0_28toc0_30)) {
INSTANCE.maxLength = 64 - MinecraftClient.getInstance().getSession().getUsername().length() - 2;
}
}
});
LoadClassicProtocolExtensionCallback.EVENT.register(classicProtocolExtension -> {
if (classicProtocolExtension == ClassicProtocolExtension.LONGER_MESSAGES) {
INSTANCE.maxLength = Short.MAX_VALUE * 2;
}
});
}
public int getMaxLength() {
return maxLength;
}
}

View File

@ -0,0 +1,208 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import com.mojang.blaze3d.systems.RenderSystem;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ArmorType;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.base.event.FinishMinecraftLoadCallback;
import de.florianmichael.viafabricplus.base.event.LoadClassicProtocolExtensionCallback;
import de.florianmichael.viafabricplus.injection.access.IFontStorage;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.FontStorage;
import net.minecraft.client.network.ServerAddress;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.registry.Registries;
import net.raphimc.vialegacy.protocols.classic.protocolc0_28_30toc0_28_30cpe.data.ClassicProtocolExtension;
import net.raphimc.vialoader.util.VersionEnum;
import net.raphimc.vialoader.util.VersionRange;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
/**
* This class contains random fields and methods that are used to fix bugs on the client side
*/
public class ClientsideFixes {
/**
* A list of blocks that need to be reloaded when the protocol version changes to change bounding boxes
*/
private static List<Block> RELOADABLE_BLOCKS;
/**
* Legacy versions do not support SRV records, so we need to resolve them manually
*/
public final static VersionRange LEGACY_SRV_RESOLVE = VersionRange.andOlder(VersionEnum.r1_2_4tor1_2_5).add(VersionRange.single(VersionEnum.bedrockLatest));
/**
* Tracks if the client is using DashLoader, so we can skip some fixes in the font rendering since they break DashLoader
*/
public final static boolean DASH_LOADER = FabricLoader.getInstance().isModLoaded("dashloader");
/**
* Contains the armor points of all armor items in legacy versions (<= 1.8.x)
*/
private final static Map<Item, Integer> LEGACY_ARMOR_POINTS = new HashMap<>();
/**
* Contains all tasks that are waiting for a packet to be received, this system can be used to sync ViaVersion tasks with the correct thread
*/
private final static Map<String, Consumer<PacketByteBuf>> PENDING_EXECUTION_TASKS = new ConcurrentHashMap<>();
/**
* This identifier is an internal identifier that is used to identify packets that are sent by ViaFabricPlus
*/
public final static String PACKET_SYNC_IDENTIFIER = UUID.randomUUID() + ":" + UUID.randomUUID();
/**
* The current chat limit
*/
private static int currentChatLimit = 256;
public static void init() {
FinishMinecraftLoadCallback.EVENT.register(() -> {
// Loads the armor points of all armor items in legacy versions (<= 1.8.x)
for (Item armorItem : Arrays.asList(Items.LEATHER_HELMET, Items.LEATHER_CHESTPLATE, Items.LEATHER_BOOTS,
Items.CHAINMAIL_HELMET, Items.CHAINMAIL_CHESTPLATE, Items.CHAINMAIL_LEGGINGS, Items.CHAINMAIL_BOOTS,
Items.IRON_HELMET, Items.IRON_CHESTPLATE, Items.IRON_LEGGINGS, Items.IRON_BOOTS, Items.DIAMOND_HELMET,
Items.DIAMOND_CHESTPLATE, Items.DIAMOND_LEGGINGS, Items.DIAMOND_BOOTS, Items.GOLDEN_HELMET,
Items.GOLDEN_CHESTPLATE, Items.GOLDEN_LEGGINGS, Items.GOLDEN_BOOTS)) {
LEGACY_ARMOR_POINTS.put(armorItem, ArmorType.findByType(Registries.ITEM.getId(armorItem).toString()).getArmorPoints());
}
RELOADABLE_BLOCKS = Arrays.asList(Blocks.ANVIL, Blocks.WHITE_BED, Blocks.ORANGE_BED,
Blocks.MAGENTA_BED, Blocks.LIGHT_BLUE_BED, Blocks.YELLOW_BED, Blocks.LIME_BED, Blocks.PINK_BED, Blocks.GRAY_BED,
Blocks.LIGHT_GRAY_BED, Blocks.CYAN_BED, Blocks.PURPLE_BED, Blocks.BLUE_BED, Blocks.BROWN_BED, Blocks.GREEN_BED,
Blocks.RED_BED, Blocks.BLACK_BED, Blocks.BREWING_STAND, Blocks.CAULDRON, Blocks.CHEST, Blocks.PITCHER_CROP,
Blocks.END_PORTAL, Blocks.END_PORTAL_FRAME, Blocks.FARMLAND, Blocks.OAK_FENCE, Blocks.HOPPER, Blocks.LADDER,
Blocks.LILY_PAD, Blocks.GLASS_PANE, Blocks.WHITE_STAINED_GLASS_PANE, Blocks.ORANGE_STAINED_GLASS_PANE,
Blocks.MAGENTA_STAINED_GLASS_PANE, Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, Blocks.YELLOW_STAINED_GLASS_PANE,
Blocks.LIME_STAINED_GLASS_PANE, Blocks.PINK_STAINED_GLASS_PANE, Blocks.GRAY_STAINED_GLASS_PANE,
Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, Blocks.CYAN_STAINED_GLASS_PANE, Blocks.PURPLE_STAINED_GLASS_PANE,
Blocks.BLUE_STAINED_GLASS_PANE, Blocks.BROWN_STAINED_GLASS_PANE, Blocks.GREEN_STAINED_GLASS_PANE,
Blocks.RED_STAINED_GLASS_PANE, Blocks.BLACK_STAINED_GLASS_PANE, Blocks.PISTON, Blocks.PISTON_HEAD,
Blocks.SNOW, Blocks.COBBLESTONE_WALL, Blocks.MOSSY_COBBLESTONE_WALL
);
});
// Reloads some clientside stuff when the protocol version changes
ChangeProtocolVersionCallback.EVENT.register(protocolVersion -> {
// Reloads all bounding boxes
for (Block block : RELOADABLE_BLOCKS) {
block.getDefaultState().initShapeCache();
}
// Calculates the current chat limit, since it changes depending on the protocol version
currentChatLimit = 256;
if (protocolVersion.isOlderThanOrEqualTo(VersionEnum.r1_10)) {
currentChatLimit = 100;
if (protocolVersion.isOlderThanOrEqualTo(VersionEnum.c0_28toc0_30)) {
currentChatLimit = 64 - MinecraftClient.getInstance().getSession().getUsername().length() - 2;
}
}
if (DASH_LOADER) {
// Reloads all font storages to fix the font renderer
for (FontStorage storage : MinecraftClient.getInstance().fontManager.fontStorages.values()) {
RenderSystem.recordRenderCall(() -> ((IFontStorage) storage).viafabricplus_clearCaches());
}
}
});
// Calculates the current chat limit, since it changes depending on the protocol version
LoadClassicProtocolExtensionCallback.EVENT.register(classicProtocolExtension -> {
if (classicProtocolExtension == ClassicProtocolExtension.LONGER_MESSAGES) {
currentChatLimit = Short.MAX_VALUE * 2;
}
});
}
/**
* Parses a server address and returns a {@link ServerAddress} object that is compatible with the specified version
*
* @param version The version to use
* @param address The address to parse
* @return The parsed {@link ServerAddress}
*/
public static ServerAddress parse(VersionEnum version, String address) {
final ServerAddress modern = ServerAddress.parse(address);
if (LEGACY_SRV_RESOLVE.contains(version) && !modern.equals(ServerAddress.INVALID)) {
final var addressParts = address.split(":");
return new ServerAddress(addressParts[0], addressParts.length > 1 ? Integer.parseInt(addressParts[1]) : 25565);
}
return modern;
}
/**
* Returns the sync task for the specified uuid and removes it from the list
*
* @param uuid The uuid of the sync task
* @return The sync task
*/
public static Consumer<PacketByteBuf> getSyncTask(final String uuid) {
final var task = PENDING_EXECUTION_TASKS.get(uuid);
PENDING_EXECUTION_TASKS.remove(uuid);
return task;
}
/**
* Checks if there is a sync task for the specified uuid
*
* @param uuid The uuid to check
* @return True if there is a sync task, otherwise false
*/
public static boolean hasSyncTask(final String uuid) {
return PENDING_EXECUTION_TASKS.containsKey(uuid);
}
/**
* Executes a sync task and returns the uuid of the task
*
* @param task The task to execute
* @return The uuid of the task
*/
public static String executeSyncTask(final Consumer<PacketByteBuf> task) {
final var uuid = UUID.randomUUID().toString();
PENDING_EXECUTION_TASKS.put(uuid, task);
return uuid;
}
/**
* Returns the armor points of an armor item in legacy versions (<= 1.8.x)
*
* @param itemStack The item stack to get the armor points from
* @return The armor points of the item stack
*/
public static int getLegacyArmorPoints(final ItemStack itemStack) {
if (!LEGACY_ARMOR_POINTS.containsKey(itemStack.getItem())) return 0; // Just in case
return LEGACY_ARMOR_POINTS.get(itemStack.getItem());
}
public static int getCurrentChatLimit() {
return currentChatLimit;
}
}

View File

@ -1,86 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import com.mojang.blaze3d.systems.RenderSystem;
import de.florianmichael.viafabricplus.base.settings.groups.VisualSettings;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.injection.access.IFontStorage;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.Glyph;
import net.minecraft.client.font.GlyphRenderer;
import net.minecraft.client.font.RenderableGlyph;
import java.util.function.Function;
public class FontRenderer1_12_2 {
public final static boolean DASH_LOADER = FabricLoader.getInstance().isModLoaded("dashloader");
public static void init() {
if (DASH_LOADER) return;
// Reload all font renderer storage
ChangeProtocolVersionCallback.EVENT.register(protocolVersion ->
MinecraftClient.getInstance().fontManager.fontStorages.values().
forEach(fontStorage -> RenderSystem.recordRenderCall(() -> ((IFontStorage) fontStorage).viafabricplus_clearCaches())));
}
/**
* Implementation of a "Very Missing" Glyph which doesn't have any rendering at all ("Missing" in <= 1.12.2)
*/
public enum BuiltinEmptyGlyph1_12_2 implements Glyph {
VERY_MISSING;
@Override
public float getAdvance() {
return 1;
}
@Override
public GlyphRenderer bake(Function<RenderableGlyph, GlyphRenderer> function) {
return function.apply(new RenderableGlyph() {
@Override
public int getWidth() {
return 0;
}
@Override
public int getHeight() {
return 0;
}
@Override
public float getOversample() {
return 1.0f;
}
@Override
public void upload(int x, int y) {
}
@Override
public boolean hasColor() {
return true;
}
});
}
}
}

View File

@ -1,35 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import net.minecraft.client.network.ServerAddress;
import net.raphimc.vialoader.util.VersionEnum;
import net.raphimc.vialoader.util.VersionRange;
public class LegacyServerAddress {
public final static VersionRange SRV_RANGE = VersionRange.andOlder(VersionEnum.r1_2_4tor1_2_5).add(VersionRange.single(VersionEnum.bedrockLatest));
public static ServerAddress parse(VersionEnum version, String address) {
final ServerAddress modern = ServerAddress.parse(address);
if (SRV_RANGE.contains(version) && !modern.equals(ServerAddress.INVALID)) {
final var addressParts = address.split(":");
return new ServerAddress(addressParts[0], addressParts.length > 1 ? Integer.parseInt(addressParts[1]) : 25565);
}
return modern;
}
}

View File

@ -1,46 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import net.minecraft.network.PacketByteBuf;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
public class PacketSyncBase {
public final static String PACKET_SYNC_IDENTIFIER = UUID.randomUUID() + ":" + UUID.randomUUID();
private final static Map<String, Consumer<PacketByteBuf>> tasks = new ConcurrentHashMap<>();
public static Consumer<PacketByteBuf> get(final String uuid) {
final var task = tasks.get(uuid);
tasks.remove(uuid);
return task;
}
public static boolean has(final String uuid) {
return tasks.containsKey(uuid);
}
public static String track(final Consumer<PacketByteBuf> task) {
final String uuid = UUID.randomUUID().toString();
tasks.put(uuid, task);
return uuid;
}
}

View File

@ -1,49 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition;
import com.viaversion.viaversion.api.connection.StoredObject;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Position;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.protocols.protocol1_18_2to1_18.Protocol1_18_2To1_18;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
public class SpawnPositionTracker extends StoredObject {
private Position spawnPosition = new Position(8, 64, 8);
private float angle = 0F;
public SpawnPositionTracker(final UserConnection user) {
super(user);
}
public void setSpawnPosition(final Position spawnPosition, final float angle) {
this.spawnPosition = spawnPosition;
this.angle = angle;
}
public void sendSpawnPosition() throws Exception {
final PacketWrapper spawnPosition = PacketWrapper.create(ClientboundPackets1_18.SPAWN_POSITION, this.getUser());
spawnPosition.write(Type.POSITION1_14, this.spawnPosition); // position
spawnPosition.write(Type.FLOAT, this.angle); // angle
spawnPosition.send(Protocol1_18_2To1_18.class);
}
}

View File

@ -15,7 +15,7 @@
* 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.definition.bedrock;
package de.florianmichael.viafabricplus.definition.account;
import com.google.gson.JsonObject;
import de.florianmichael.viafabricplus.ViaFabricPlus;

View File

@ -15,7 +15,7 @@
* 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.definition.classic;
package de.florianmichael.viafabricplus.definition.account;
import com.google.gson.JsonObject;
import de.florianmichael.classic4j.model.classicube.highlevel.CCAccount;

View File

@ -1,30 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2023 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.definition.bedrock;
import net.raphimc.viabedrock.protocol.data.enums.bedrock.ServerMovementModes;
public class ModelFormats {
public static String formatMovementMode(final int movementMode) {
if (movementMode == ServerMovementModes.CLIENT) return "Client";
if (movementMode == ServerMovementModes.SERVER) return "Server";
return "Server with rewind";
}
}

View File

@ -15,7 +15,7 @@
* 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.definition;
package de.florianmichael.viafabricplus.definition.tracker;
import com.viaversion.viaversion.api.connection.StoredObject;
import com.viaversion.viaversion.api.connection.UserConnection;

View File

@ -15,23 +15,34 @@
* 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.definition;
package de.florianmichael.viafabricplus.definition.tracker;
import com.viaversion.viaversion.api.connection.StoredObject;
import com.viaversion.viaversion.api.connection.UserConnection;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import java.util.HashMap;
import java.util.Map;
public class Meta18Storage extends StoredObject {
public class WolfHealthTracker extends StoredObject {
private final Map<Integer, Float> healthDataMap = new HashMap<>();
public Meta18Storage(UserConnection user) {
public WolfHealthTracker(UserConnection user) {
super(user);
}
public Map<Integer, Float> getHealthDataMap() {
return healthDataMap;
}
public static WolfHealthTracker get() {
final var connection = ProtocolHack.getMainUserConnection();
if (connection == null) return null;
if (!connection.has(WolfHealthTracker.class)) {
connection.put(new WolfHealthTracker(connection));
}
return connection.get(WolfHealthTracker.class);
}
}

View File

@ -15,18 +15,18 @@
* 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.definition.bedrock.storage;
package de.florianmichael.viafabricplus.definition.tracker.bedrock;
import com.viaversion.viaversion.api.connection.StoredObject;
import com.viaversion.viaversion.api.connection.UserConnection;
public class JoinGameStorage extends StoredObject {
public class JoinGameTracker extends StoredObject {
private long seed;
private String levelId;
private long enchantmentSeed;
public JoinGameStorage(UserConnection user) {
public JoinGameTracker(UserConnection user) {
super(user);
}

View File

@ -19,14 +19,14 @@ package de.florianmichael.viafabricplus.information.impl;
import com.viaversion.viaversion.api.Via;
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.definition.tracker.bedrock.JoinGameTracker;
import de.florianmichael.viafabricplus.information.AbstractInformationGroup;
import de.florianmichael.viafabricplus.protocolhack.provider.viabedrock.ViaFabricPlusBlobCacheProvider;
import net.lenni0451.reflect.stream.RStream;
import net.lenni0451.reflect.stream.field.FieldStream;
import net.raphimc.viabedrock.api.chunk.BedrockChunk;
import net.raphimc.viabedrock.api.model.entity.Entity;
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.ChunkTracker;
@ -45,6 +45,13 @@ public class BedrockInformation extends AbstractInformationGroup {
super(VersionRange.single(VersionEnum.bedrockLatest));
}
public String formatMovementMode(final int movementMode) {
if (movementMode == ServerMovementModes.CLIENT) return "Client";
if (movementMode == ServerMovementModes.SERVER) return "Server";
return "Server with rewind";
}
@Override
public void applyInformation(UserConnection userConnection, List<String> output) {
final ViaFabricPlusBlobCacheProvider blobCache = (ViaFabricPlusBlobCacheProvider) Via.getManager().getProviders().get(BlobCacheProvider.class);
@ -86,18 +93,18 @@ public class BedrockInformation extends AbstractInformationGroup {
output.add("Entity Tracker: " + entities);
}
}
final JoinGameStorage joinGameStorage = userConnection.get(JoinGameStorage.class);
if (!joinGameStorage.getLevelId().isEmpty() || joinGameStorage.getSeed() != 0 || joinGameStorage.getEnchantmentSeed() != 0) {
final JoinGameTracker joinGameTracker = userConnection.get(JoinGameTracker.class);
if (!joinGameTracker.getLevelId().isEmpty() || joinGameTracker.getSeed() != 0 || joinGameTracker.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());
if (joinGameTracker.getSeed() != 0) output.add("World Seed: " + joinGameTracker.getSeed());
if (!joinGameTracker.getLevelId().isEmpty()) output.add("Level Id: " + joinGameTracker.getLevelId());
if (joinGameTracker.getEnchantmentSeed() != 0) output.add("Enchantment Seed: " + joinGameTracker.getEnchantmentSeed());
final GameSessionStorage gameSessionStorage = userConnection.get(GameSessionStorage.class);
if (gameSessionStorage != null) {
output.add("Movement mode: " + ModelFormats.formatMovementMode(gameSessionStorage.getMovementMode()));
output.add("Movement mode: " + formatMovementMode(gameSessionStorage.getMovementMode()));
}
}
}

View File

@ -18,7 +18,7 @@
package de.florianmichael.viafabricplus.injection.mixin.base;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.definition.LegacyServerAddress;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.injection.access.IServerInfo;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import net.minecraft.client.network.ServerAddress;
@ -46,7 +46,7 @@ public class MixinConnectScreen_1 {
@Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/util/Optional;get()Ljava/lang/Object;"))
public Object mapSocketAddress(Optional<InetSocketAddress> instance) {
if (LegacyServerAddress.SRV_RANGE.contains(ProtocolHack.getTargetVersion())) {
if (ClientsideFixes.LEGACY_SRV_RESOLVE.contains(ProtocolHack.getTargetVersion())) {
return new InetSocketAddress(field_33737.getAddress(), field_33737.getPort());
}
final InetSocketAddress address = instance.get();

View File

@ -17,19 +17,31 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.base;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.base.event.FinishMinecraftLoadCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.RunArgs;
import net.raphimc.vialoader.util.VersionEnum;
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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(MinecraftClient.class)
public class MixinMinecraftClient {
public abstract class MixinMinecraftClient {
@Shadow public abstract boolean isInSingleplayer();
@Inject(method = "<init>", at = @At("RETURN"))
public void postLoad(RunArgs args, CallbackInfo ci) {
FinishMinecraftLoadCallback.EVENT.invoker().onFinishMinecraftLoad();
}
@Inject(method = "setWorld", at = @At("HEAD"))
public void preSetWorld(CallbackInfo ci) {
if (isInSingleplayer()) {
ChangeProtocolVersionCallback.EVENT.invoker().onChangeProtocolVersion(VersionEnum.r1_20tor1_20_1);
}
}
}

View File

@ -17,7 +17,7 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.base;
import de.florianmichael.viafabricplus.definition.LegacyServerAddress;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.screen.base.ProtocolSelectionScreen;
import de.florianmichael.viafabricplus.base.settings.groups.GeneralSettings;
@ -66,6 +66,6 @@ public class MixinMultiplayerScreen extends Screen {
@Redirect(method = "connect(Lnet/minecraft/client/network/ServerInfo;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;"))
public ServerAddress doOwnParse(String address) {
return LegacyServerAddress.parse(ProtocolHack.getTargetVersion(viafabricplus_lastConnect), address);
return ClientsideFixes.parse(ProtocolHack.getTargetVersion(viafabricplus_lastConnect), address);
}
}

View File

@ -21,7 +21,7 @@ import com.llamalad7.mixinextras.injector.WrapWithCondition;
import com.mojang.authlib.GameProfile;
import de.florianmichael.viafabricplus.ViaFabricPlus;
import de.florianmichael.viafabricplus.base.settings.groups.VisualSettings;
import de.florianmichael.viafabricplus.definition.PacketSyncBase;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
@ -177,11 +177,11 @@ public abstract class MixinClientPlayNetworkHandler {
final var channel = packet.getChannel().toString();
final var data = packet.getData();
if (channel.equals(PacketSyncBase.PACKET_SYNC_IDENTIFIER)) {
if (channel.equals(ClientsideFixes.PACKET_SYNC_IDENTIFIER)) {
final var uuid = data.readString();
if (PacketSyncBase.has(uuid)) {
PacketSyncBase.get(uuid).accept(data);
if (ClientsideFixes.hasSyncTask(uuid)) {
ClientsideFixes.getSyncTask(uuid).accept(data);
ci.cancel();
}
}

View File

@ -18,7 +18,8 @@
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft;
import de.florianmichael.viafabricplus.base.settings.groups.VisualSettings;
import de.florianmichael.viafabricplus.definition.FontRenderer1_12_2;
import de.florianmichael.viafabricplus.definition.BuiltinEmptyGlyph1_12_2;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.injection.access.IFontStorage;
import de.florianmichael.viafabricplus.mappings.CharacterMappings;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
@ -82,26 +83,26 @@ public abstract class MixinFontStorage implements IFontStorage {
@Inject(method = "findGlyph", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/Font;getGlyph(I)Lnet/minecraft/client/font/Glyph;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
public void injectFindGlyph(int codePoint, CallbackInfoReturnable<FontStorage.GlyphPair> cir, Glyph glyph, Iterator var3, Font font) {
if (FontRenderer1_12_2.DASH_LOADER || !this.id.getNamespace().equals("minecraft")) return;
if (ClientsideFixes.DASH_LOADER || !this.id.getNamespace().equals("minecraft")) return;
if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(VersionEnum.r1_19_4)) {
if (viafabricplus_isForbiddenCharacter(font, codePoint)) cir.setReturnValue(FontStorage.GlyphPair.MISSING);
if (VisualSettings.INSTANCE.changeFontRendererBehaviour.isEnabled() && cir.getReturnValue() == FontStorage.GlyphPair.MISSING) {
cir.setReturnValue(new FontStorage.GlyphPair(FontRenderer1_12_2.BuiltinEmptyGlyph1_12_2.VERY_MISSING, FontRenderer1_12_2.BuiltinEmptyGlyph1_12_2.VERY_MISSING));
cir.setReturnValue(new FontStorage.GlyphPair(BuiltinEmptyGlyph1_12_2.VERY_MISSING, BuiltinEmptyGlyph1_12_2.VERY_MISSING));
}
}
}
@Inject(method = "findGlyphRenderer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/Font;getGlyph(I)Lnet/minecraft/client/font/Glyph;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
public void injectFindGlyphRenderer(int codePoint, CallbackInfoReturnable<GlyphRenderer> cir, Iterator var2, Font font) {
if (FontRenderer1_12_2.DASH_LOADER || !this.id.getNamespace().equals("minecraft")) return;
if (ClientsideFixes.DASH_LOADER || !this.id.getNamespace().equals("minecraft")) return;
if (!viafabricplus_obfuscation && ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(VersionEnum.r1_19_4)) {
if (viafabricplus_isForbiddenCharacter(font, codePoint)) cir.setReturnValue(this.blankGlyphRenderer);
if (VisualSettings.INSTANCE.changeFontRendererBehaviour.isEnabled() && cir.getReturnValue() == this.blankGlyphRenderer) {
cir.setReturnValue(FontRenderer1_12_2.BuiltinEmptyGlyph1_12_2.VERY_MISSING.bake(this::getGlyphRenderer));
cir.setReturnValue(BuiltinEmptyGlyph1_12_2.VERY_MISSING.bake(this::getGlyphRenderer));
}
}
}

View File

@ -18,8 +18,7 @@
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft;
import com.google.common.net.HostAndPort;
import de.florianmichael.viafabricplus.definition.LegacyServerAddress;
import de.florianmichael.viafabricplus.injection.access.IServerInfo;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import net.lenni0451.reflect.stream.RStream;
import net.minecraft.client.network.MultiplayerServerListPinger;
@ -36,7 +35,8 @@ public class MixinMultiplayerServerListPinger {
@Inject(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/AllowedAddressResolver;resolve(Lnet/minecraft/client/network/ServerAddress;)Ljava/util/Optional;"), locals = LocalCapture.CAPTURE_FAILHARD)
public void mapParsing(ServerInfo entry, Runnable saver, CallbackInfo ci, ServerAddress serverAddress) {
final ServerAddress remapped = LegacyServerAddress.parse(ProtocolHack.getTargetVersion(entry), serverAddress.hostAndPort.toString());
final var remapped = ClientsideFixes.parse(ProtocolHack.getTargetVersion(entry), serverAddress.hostAndPort.toString());
RStream.of(serverAddress).fields().filter(HostAndPort.class).by(0).set(RStream.of(remapped).fields().filter(HostAndPort.class).by(0).get());
}
}

View File

@ -17,7 +17,7 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft;
import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.StringHelper;
import org.spongepowered.asm.mixin.Mixin;
@ -32,6 +32,7 @@ public class MixinStringHelper {
if (MinecraftClient.getInstance().isInSingleplayer()) {
return 256;
}
return ChatLengthCalculation.INSTANCE.getMaxLength();
return ClientsideFixes.getCurrentChatLimit();
}
}

View File

@ -58,6 +58,6 @@ public class MixinFarmlandBlock extends Block {
@Override
public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
return SHAPE;
return SHAPE; // Always use the real outline shape for culling
}
}

View File

@ -18,10 +18,10 @@
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.entity;
import com.mojang.authlib.GameProfile;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import net.minecraft.world.GameMode;
import net.raphimc.vialoader.util.VersionEnum;
import de.florianmichael.viafabricplus.base.settings.groups.DebugSettings;
import de.florianmichael.viafabricplus.definition.ArmorPointCalculation;
import de.florianmichael.viafabricplus.injection.access.IClientPlayerEntity;
import de.florianmichael.viafabricplus.base.settings.groups.VisualSettings;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
@ -197,7 +197,7 @@ public abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity
@Override
public int getArmor() {
if (VisualSettings.INSTANCE.emulateArmorHud.isEnabled()) {
return ArmorPointCalculation.sum();
return client.player.getInventory().armor.stream().mapToInt(ClientsideFixes::getLegacyArmorPoints).sum();
}
return super.getArmor();
}

View File

@ -17,9 +17,8 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.entity;
import com.viaversion.viaversion.api.connection.UserConnection;
import net.raphimc.vialoader.util.VersionEnum;
import de.florianmichael.viafabricplus.definition.Meta18Storage;
import de.florianmichael.viafabricplus.definition.tracker.WolfHealthTracker;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import net.minecraft.entity.passive.WolfEntity;
import org.spongepowered.asm.mixin.Mixin;
@ -34,10 +33,9 @@ public class MixinWolfEntity {
public float rewriteHealth(WolfEntity instance) {
float health = instance.getHealth();
if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(VersionEnum.r1_14_4)) {
final UserConnection userConnection = ProtocolHack.getMainUserConnection();
if (!userConnection.has(Meta18Storage.class)) userConnection.put(new Meta18Storage(userConnection));
return userConnection.get(Meta18Storage.class).getHealthDataMap().getOrDefault(instance.getId(), health);
return WolfHealthTracker.get().getHealthDataMap().getOrDefault(instance.getId(), health);
}
return health;
}
}

View File

@ -17,7 +17,7 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.packet;
import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import net.minecraft.client.MinecraftClient;
import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket;
import org.spongepowered.asm.mixin.Mixin;
@ -32,6 +32,7 @@ public class MixinChatMessageC2SPacket {
if (MinecraftClient.getInstance().isInSingleplayer()) {
return 256;
}
return ChatLengthCalculation.INSTANCE.getMaxLength();
return ClientsideFixes.getCurrentChatLimit();
}
}

View File

@ -17,8 +17,8 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.screen;
import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
import de.florianmichael.viafabricplus.base.settings.groups.VisualSettings;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.client.gui.hud.MessageIndicator;
@ -39,7 +39,7 @@ public class MixinChatScreen {
@Inject(method = "init", at = @At("RETURN"))
public void changeChatLength(CallbackInfo ci) {
if (!MinecraftClient.getInstance().isInSingleplayer()) {
this.chatField.setMaxLength(ChatLengthCalculation.INSTANCE.getMaxLength());
this.chatField.setMaxLength(ClientsideFixes.getCurrentChatLimit());
}
}
@ -48,6 +48,7 @@ public class MixinChatScreen {
if (VisualSettings.INSTANCE.hideSignatureIndicator.isEnabled()) {
return null;
}
return instance.getIndicatorAt(mouseX, mouseY);
}
}

View File

@ -22,8 +22,8 @@ import com.viaversion.viaversion.api.minecraft.ProfileKey;
import net.raphimc.mcauth.util.MicrosoftConstants;
import net.raphimc.vialoader.util.VersionEnum;
import de.florianmichael.viafabricplus.ViaFabricPlus;
import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.account.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.injection.access.IPublicKeyData;
import de.florianmichael.viafabricplus.definition.signatures.v1_19_0.ChatSession1_19_0;
import de.florianmichael.viafabricplus.definition.signatures.v1_19_2.ChatSession1_19_2;

View File

@ -18,7 +18,7 @@
package de.florianmichael.viafabricplus.injection.mixin.fixes.viabedrock;
import com.viaversion.viaversion.api.connection.UserConnection;
import de.florianmichael.viafabricplus.definition.bedrock.storage.JoinGameStorage;
import de.florianmichael.viafabricplus.definition.tracker.bedrock.JoinGameTracker;
import net.raphimc.viabedrock.protocol.BedrockProtocol;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -30,6 +30,6 @@ public class MixinBedrockProtocol {
@Inject(method = "init", at = @At("RETURN"))
public void hookStorages(UserConnection user, CallbackInfo ci) {
user.put(new JoinGameStorage(user));
user.put(new JoinGameTracker(user));
}
}

View File

@ -19,7 +19,7 @@ package de.florianmichael.viafabricplus.injection.mixin.fixes.viabedrock;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Type;
import de.florianmichael.viafabricplus.definition.bedrock.storage.JoinGameStorage;
import de.florianmichael.viafabricplus.definition.tracker.bedrock.JoinGameTracker;
import net.raphimc.viabedrock.protocol.packets.JoinPackets;
import net.raphimc.viabedrock.protocol.types.primitive.LongLEType;
import net.raphimc.viabedrock.protocol.types.primitive.StringType;
@ -34,21 +34,21 @@ public class MixinJoinPackets {
@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 = 5))
private static Object trackWorldSeed(PacketWrapper instance, Type<LongLEType> tType) throws Exception {
final Object seed = instance.read(tType);
instance.user().get(JoinGameStorage.class).setSeed((long) seed);
instance.user().get(JoinGameTracker.class).setSeed((long) seed);
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))
private static Object trackLevelId(PacketWrapper instance, Type<StringType> tType) throws Exception {
final Object levelId = instance.read(tType);
instance.user().get(JoinGameStorage.class).setLevelId((String) levelId);
instance.user().get(JoinGameTracker.class).setLevelId((String) levelId);
return levelId;
}
@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 = 63))
private static Object trackEnchantmentSeed(PacketWrapper instance, Type<VarIntType> tType) throws Exception {
final Object enchantmentSeed = instance.read(tType);
instance.user().get(JoinGameStorage.class).setEnchantmentSeed((Integer) enchantmentSeed);
instance.user().get(JoinGameTracker.class).setEnchantmentSeed((Integer) enchantmentSeed);
return enchantmentSeed;
}
}

View File

@ -23,7 +23,7 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.protocols.protocol1_8.ClientboundPackets1_8;
import com.viaversion.viaversion.protocols.protocol1_8.ServerboundPackets1_8;
import de.florianmichael.viafabricplus.definition.TeleportTracker;
import de.florianmichael.viafabricplus.definition.tracker.TeleportTracker;
import net.raphimc.vialegacy.protocols.release.protocol1_7_6_10to1_7_2_5.ClientboundPackets1_7_2;
import net.raphimc.vialegacy.protocols.release.protocol1_7_6_10to1_7_2_5.ServerboundPackets1_7_2;
import net.raphimc.vialegacy.protocols.release.protocol1_8to1_7_6_10.Protocol1_8to1_7_6_10;

View File

@ -17,7 +17,7 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion.protocol1_11to1_10;
import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
@ -27,6 +27,6 @@ public class MixinProtocol1_11To1_10 {
@ModifyConstant(method = "lambda$register$0", constant = @Constant(intValue = 100))
private static int changeMaxChatLength(int constant) {
return ChatLengthCalculation.INSTANCE.getMaxLength();
return ClientsideFixes.getCurrentChatLimit();
}
}

View File

@ -27,7 +27,7 @@ import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14;
import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.packets.InventoryPackets;
import de.florianmichael.viafabricplus.definition.PacketSyncBase;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.definition.screen.CustomScreenHandler;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import io.netty.buffer.Unpooled;
@ -39,6 +39,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import java.util.List;
import java.util.logging.Level;
import java.util.stream.Collectors;
@Mixin(value = InventoryPackets.class, remap = false)
@ -49,7 +50,7 @@ public class MixinInventoryPackets {
if (typeId == -1) {
wrapper.clearPacket();
wrapper.setPacketType(ClientboundPackets1_14.PLUGIN_MESSAGE);
wrapper.write(Type.STRING, PacketSyncBase.PACKET_SYNC_IDENTIFIER);
wrapper.write(Type.STRING, ClientsideFixes.PACKET_SYNC_IDENTIFIER);
final List<ProtocolPathEntry> protocolPath = Via.getManager().getProtocolManager().getProtocolPath(SharedConstants.getProtocolVersion(), ProtocolVersion.v1_13_2.getVersion());
final var userConnection = ProtocolHack.createFakerUserConnection();
@ -64,14 +65,14 @@ public class MixinInventoryPackets {
fakeOpenWindow.read(Type.VAR_INT);
fakeOpenWindow.read(Type.VAR_INT);
final String uuid = PacketSyncBase.track(CustomScreenHandler.TRIPLE_CHEST_HANDLER);
final String uuid = ClientsideFixes.executeSyncTask(CustomScreenHandler.TRIPLE_CHEST_HANDLER);
wrapper.write(Type.STRING, uuid);
wrapper.write(Type.SHORT, windowId);
wrapper.write(Type.COMPONENT, fakeOpenWindow.read(Type.COMPONENT));
wrapper.write(Type.SHORT, slots);
} catch (Exception e) {
e.printStackTrace();
Via.getPlatform().getLogger().log(Level.SEVERE, "Failed to emulate Triple Chest", e);
}
ci.cancel();

View File

@ -17,7 +17,6 @@
*/
package de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion.protocol1_15to1_14_4;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.metadata.Metadata;
@ -25,7 +24,7 @@ import com.viaversion.viaversion.protocols.protocol1_14_4to1_14_3.ClientboundPac
import com.viaversion.viaversion.protocols.protocol1_15to1_14_4.Protocol1_15To1_14_4;
import com.viaversion.viaversion.protocols.protocol1_15to1_14_4.metadata.MetadataRewriter1_15To1_14_4;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import de.florianmichael.viafabricplus.definition.Meta18Storage;
import de.florianmichael.viafabricplus.definition.tracker.WolfHealthTracker;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -43,10 +42,6 @@ public abstract class MixinMetadataRewriter1_15To1_14_4 extends EntityRewriter<C
@Inject(method = "handleMetadata", at = @At(value = "INVOKE", target = "Ljava/util/List;remove(Ljava/lang/Object;)Z", shift = At.Shift.BEFORE), remap = false)
public void trackHealth(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection, CallbackInfo ci) {
if (protocol.get(Meta18Storage.class) == null) {
protocol.put(new Meta18Storage(connection));
Via.getPlatform().getLogger().severe("Metadata 18 storage is missing!");
}
protocol.get(Meta18Storage.class).getHealthDataMap().put(entityId, (Float) metadata.getValue());
WolfHealthTracker.get().getHealthDataMap().put(entityId, (Float) metadata.getValue());
}
}

View File

@ -1,62 +0,0 @@
/*
* This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy
* 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.fixes.viaversion.protocol1_18_2to1_18;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17;
import com.viaversion.viaversion.protocols.protocol1_18_2to1_18.Protocol1_18_2To1_18;
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
import de.florianmichael.viafabricplus.definition.SpawnPositionTracker;
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;
@SuppressWarnings("DataFlowIssue")
@Mixin(value = Protocol1_18_2To1_18.class, remap = false)
public class MixinProtocol1_18_2To1_18 extends AbstractProtocol<ClientboundPackets1_18, ClientboundPackets1_18, ServerboundPackets1_17, ServerboundPackets1_17> {
@Inject(method = "registerPackets", at = @At("RETURN"))
public void fixSpawnPositionSending(CallbackInfo ci) {
this.registerClientbound(ClientboundPackets1_18.PLAYER_POSITION, new PacketHandlers() {
@Override
public void register() {
handler(wrapper -> wrapper.user().get(SpawnPositionTracker.class).sendSpawnPosition());
}
});
this.registerClientbound(ClientboundPackets1_18.SPAWN_POSITION, new PacketHandlers() {
@Override
public void register() {
map(Type.POSITION1_14); // position
map(Type.FLOAT); // angle
handler(wrapper -> wrapper.user().get(SpawnPositionTracker.class).setSpawnPosition(wrapper.get(Type.POSITION1_14, 0), wrapper.get(Type.FLOAT, 0)));
}
});
}
@Override
public void init(UserConnection connection) {
super.init(connection);
connection.put(new SpawnPositionTracker(connection));
}
}

View File

@ -24,8 +24,8 @@ import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPacke
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_18_2;
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.packets.WorldPackets;
import de.florianmichael.viafabricplus.definition.PacketSyncBase;
import de.florianmichael.viafabricplus.definition.ClientPlayerInteractionManager1_18_2;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@ -42,9 +42,9 @@ public class MixinWorldPackets {
}
wrapper.resetReader();
final String uuid = PacketSyncBase.track(ClientPlayerInteractionManager1_18_2.OLD_PACKET_HANDLER);
final var uuid = ClientsideFixes.executeSyncTask(ClientPlayerInteractionManager1_18_2.OLD_PACKET_HANDLER);
wrapper.write(Type.STRING, PacketSyncBase.PACKET_SYNC_IDENTIFIER);
wrapper.write(Type.STRING, ClientsideFixes.PACKET_SYNC_IDENTIFIER);
wrapper.write(Type.STRING, uuid);
});
}

View File

@ -24,7 +24,7 @@ import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ServerboundPac
import com.viaversion.viaversion.protocols.protocol1_20to1_19_4.Protocol1_20To1_19_4;
import com.viaversion.viaversion.protocols.protocol1_20to1_19_4.packets.InventoryPackets;
import com.viaversion.viaversion.rewriter.ItemRewriter;
import de.florianmichael.viafabricplus.definition.PacketSyncBase;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.definition.screen.CustomScreenHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -56,8 +56,8 @@ public class MixinInventoryPackets extends ItemRewriter<ClientboundPackets1_19_4
wrapper.clearPacket();
wrapper.setPacketType(ClientboundPackets1_19_4.PLUGIN_MESSAGE);
wrapper.write(Type.STRING, PacketSyncBase.PACKET_SYNC_IDENTIFIER);
wrapper.write(Type.STRING, PacketSyncBase.track(CustomScreenHandler.LEGACY_SMITHING_HANDLER));
wrapper.write(Type.STRING, ClientsideFixes.PACKET_SYNC_IDENTIFIER);
wrapper.write(Type.STRING, ClientsideFixes.executeSyncTask(CustomScreenHandler.LEGACY_SMITHING_HANDLER));
wrapper.write(Type.VAR_INT, windowId);
wrapper.write(Type.COMPONENT, title);
} else {

View File

@ -18,7 +18,7 @@
package de.florianmichael.viafabricplus.screen.base;
import de.florianmichael.classic4j.BetaCraftHandler;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.base.screen.VFPScreen;
import de.florianmichael.viafabricplus.screen.thirdparty.classicube.ClassiCubeLoginScreen;
import de.florianmichael.viafabricplus.screen.thirdparty.classicube.ClassiCubeServerListScreen;

View File

@ -20,7 +20,7 @@ package de.florianmichael.viafabricplus.screen.thirdparty;
import de.florianmichael.classic4j.model.betacraft.BCServerInfo;
import de.florianmichael.classic4j.model.betacraft.BCServerList;
import de.florianmichael.classic4j.model.betacraft.BCVersion;
import de.florianmichael.viafabricplus.definition.LegacyServerAddress;
import de.florianmichael.viafabricplus.definition.ClientsideFixes;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.base.screen.MappedSlotEntry;
import de.florianmichael.viafabricplus.base.screen.VFPScreen;
@ -107,7 +107,7 @@ public class BetaCraftScreen extends VFPScreen {
@Override
public void mappedMouseClicked(double mouseX, double mouseY, int button) {
final ServerAddress serverAddress = LegacyServerAddress.parse(ProtocolHack.getTargetVersion(), server.host() + ":" + server.port());
final ServerAddress serverAddress = ClientsideFixes.parse(ProtocolHack.getTargetVersion(), server.host() + ":" + server.port());
final ServerInfo entry = new ServerInfo(server.name(), serverAddress.getAddress(), false);
ConnectScreen.connect(MinecraftClient.getInstance().currentScreen, MinecraftClient.getInstance(), serverAddress, entry, false);

View File

@ -22,7 +22,7 @@ import de.florianmichael.classic4j.ClassiCubeHandler;
import de.florianmichael.classic4j.api.LoginProcessHandler;
import de.florianmichael.classic4j.model.classicube.highlevel.CCAccount;
import de.florianmichael.viafabricplus.screen.base.ProtocolSelectionScreen;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.base.screen.VFPScreen;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;

View File

@ -22,7 +22,7 @@ import de.florianmichael.classic4j.ClassiCubeHandler;
import de.florianmichael.classic4j.api.LoginProcessHandler;
import de.florianmichael.classic4j.model.classicube.highlevel.CCAccount;
import de.florianmichael.classic4j.model.classicube.highlevel.CCError;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.integration.Classic4JImpl;
import de.florianmichael.viafabricplus.base.screen.VFPScreen;
import de.florianmichael.viafabricplus.screen.base.ProtocolSelectionScreen;

View File

@ -22,7 +22,7 @@ import de.florianmichael.classic4j.ClassiCubeHandler;
import de.florianmichael.classic4j.api.LoginProcessHandler;
import de.florianmichael.classic4j.model.classicube.CCServerInfo;
import de.florianmichael.classic4j.model.classicube.highlevel.CCAccount;
import de.florianmichael.viafabricplus.definition.classic.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.definition.account.ClassiCubeAccountHandler;
import de.florianmichael.viafabricplus.injection.access.IServerInfo;
import de.florianmichael.viafabricplus.protocolhack.provider.vialegacy.ViaFabricPlusClassicMPPassProvider;
import de.florianmichael.viafabricplus.base.screen.VFPScreen;

View File

@ -156,7 +156,6 @@
"fixes.viaversion.protocol1_17to1_16_4.MixinEntityPackets1_17",
"fixes.viaversion.protocol1_17to1_16_4.MixinInventoryAcknowledgements",
"fixes.viaversion.protocol1_17to1_16_4.MixinWorldPackets1_17",
"fixes.viaversion.protocol1_18_2to1_18.MixinProtocol1_18_2To1_18",
"fixes.viaversion.protocol1_19_1to1_19.MixinProtocol1_19_1To1_19",
"fixes.viaversion.protocol1_19_3to1_19_1.MixinProtocol1_19_3To1_19_1",
"fixes.viaversion.protocol1_19to1_18_2.MixinWorldPackets",
@ -171,12 +170,10 @@
"ipnext.MixinAutoRefillHandler_ItemSlotMonitor",
"jsonwebtoken.MixinClasses",
"jsonwebtoken.MixinDefaultCompressionCodecResolver",
"jsonwebtoken.MixinDefaultJwtParserBuilder"
"jsonwebtoken.MixinDefaultJwtParserBuilder",
"fixes.minecraft.entity.MixinLockableContainerBlockEntity"
],
"injectors": {
"defaultRequire": 1
},
"mixins": [
"fixes.minecraft.entity.MixinLockableContainerBlockEntity"
]
}
}