mirror of
https://github.com/ViaVersion/ViaFabric.git
synced 2024-11-21 11:35:16 +01:00
There you go, 1.12 support
Co-authored-by: Kichura <business_squeezy@outlook.com>
This commit is contained in:
parent
4a4b4a3cf1
commit
6dd9ad9361
@ -8,6 +8,7 @@ pluginManagement {
|
||||
rootProject.name = "ViaFabric"
|
||||
|
||||
include("viafabric-mc18")
|
||||
include("viafabric-mc112")
|
||||
include("viafabric-mc114")
|
||||
include("viafabric-mc115")
|
||||
include("viafabric-mc116")
|
||||
|
14
viafabric-mc112/build.gradle.kts
Normal file
14
viafabric-mc112/build.gradle.kts
Normal file
@ -0,0 +1,14 @@
|
||||
dependencies {
|
||||
minecraft("com.mojang:minecraft:1.12.2")
|
||||
mappings("net.legacyfabric:yarn:1.12.2+build.535:v2")
|
||||
|
||||
modImplementation("net.legacyfabric.legacy-fabric-api:legacy-fabric-api:1.9.1+1.12.2")
|
||||
|
||||
// fix newer java
|
||||
@Suppress("GradlePackageUpdate", "RedundantSuppression")
|
||||
implementation("io.netty:netty-all:4.0.56.Final")
|
||||
}
|
||||
|
||||
loom {
|
||||
intermediaryUrl.set("https://maven.legacyfabric.net/net/legacyfabric/intermediary/%1\$s/intermediary-%1\$s-v2.jar")
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112;
|
||||
|
||||
import com.google.common.collect.Range;
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import com.viaversion.fabric.common.config.VFConfig;
|
||||
import com.viaversion.fabric.common.platform.FabricInjector;
|
||||
import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
|
||||
import com.viaversion.fabric.common.util.JLoggerToLog4j;
|
||||
import com.viaversion.fabric.mc112.commands.NMSCommandImpl;
|
||||
import com.viaversion.fabric.mc112.commands.VFCommandHandler;
|
||||
import com.viaversion.fabric.mc112.platform.FabricPlatform;
|
||||
import com.viaversion.fabric.mc112.platform.VFLoader;
|
||||
import com.viaversion.viaversion.ViaManagerImpl;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import io.netty.channel.EventLoop;
|
||||
import io.netty.channel.local.LocalEventLoopGroup;
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.legacyfabric.fabric.api.registry.CommandRegistry;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class ViaFabric implements ModInitializer {
|
||||
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
|
||||
public static final ExecutorService ASYNC_EXECUTOR;
|
||||
public static final EventLoop EVENT_LOOP;
|
||||
public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
|
||||
public static VFConfig config;
|
||||
|
||||
static {
|
||||
ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("ViaFabric-%d").build();
|
||||
ASYNC_EXECUTOR = Executors.newFixedThreadPool(8, factory);
|
||||
EVENT_LOOP = new LocalEventLoopGroup(1, factory).next(); // ugly code
|
||||
EVENT_LOOP.submit(INIT_FUTURE::join); // https://github.com/ViaVersion/ViaFabric/issues/53 ugly workaround code but works tm
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
FabricPlatform platform = new FabricPlatform();
|
||||
|
||||
Via.init(ViaManagerImpl.builder()
|
||||
.injector(new FabricInjector())
|
||||
.loader(new VFLoader())
|
||||
.commandHandler(new VFCommandHandler())
|
||||
.platform(platform).build());
|
||||
|
||||
platform.init();
|
||||
|
||||
ViaManagerImpl manager = (ViaManagerImpl) Via.getManager();
|
||||
manager.init();
|
||||
|
||||
Via.getManager().getProtocolManager().registerBaseProtocol(HostnameParserProtocol.INSTANCE, Range.lessThan(Integer.MIN_VALUE));
|
||||
ProtocolVersion.register(-2, "AUTO");
|
||||
|
||||
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
|
||||
|
||||
registerCommandsV1();
|
||||
|
||||
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
|
||||
.resolve("viafabric.yml").toFile());
|
||||
|
||||
manager.onServerLoaded();
|
||||
|
||||
INIT_FUTURE.complete(null);
|
||||
}
|
||||
|
||||
private void registerCommandsV1() {
|
||||
try {
|
||||
CommandRegistry.INSTANCE.register(new NMSCommandImpl(Via.getManager().getCommandHandler()));
|
||||
} catch (NoClassDefFoundError ignored2) {
|
||||
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.commands;
|
||||
|
||||
import net.minecraft.command.AbstractCommand;
|
||||
import net.minecraft.command.CommandException;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import com.viaversion.viaversion.api.command.ViaVersionCommand;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class NMSCommandImpl extends AbstractCommand {
|
||||
private final ViaVersionCommand handler;
|
||||
|
||||
public NMSCommandImpl(ViaVersionCommand handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return "viaversion";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getAliases() {
|
||||
return Arrays.asList("vvfabric", "viaver");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void method_3279(MinecraftServer minecraftServer, CommandSource commandSource, String[] strings) {
|
||||
handler.onCommand(new NMSCommandSender(commandSource), strings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsageTranslationKey(CommandSource commandSource) {
|
||||
return "/viaversion [help|subcommand]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> method_10738(MinecraftServer server, CommandSource commandSource, String[] strings, @Nullable BlockPos pos) {
|
||||
return handler.onTabComplete(new NMSCommandSender(commandSource), strings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPermissionLevel() {
|
||||
return 3;
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.commands;
|
||||
|
||||
import com.viaversion.viaversion.api.command.ViaCommandSender;
|
||||
import com.viaversion.viaversion.util.ComponentUtil;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.UUID;
|
||||
|
||||
public class NMSCommandSender implements ViaCommandSender {
|
||||
private final CommandSource source;
|
||||
|
||||
public NMSCommandSender(CommandSource source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(String s) {
|
||||
// https://gaming.stackexchange.com/questions/138602/what-does-op-permission-level-do
|
||||
return source.canUseCommand(3, "viaversion.admin"); // the string seems to be the command
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMessage(String s) {
|
||||
source.sendMessage(Text.Serializer.deserializeText(ComponentUtil.legacyToJsonString(s)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getUUID() {
|
||||
if (source instanceof Entity) {
|
||||
return ((Entity) source).getUuid();
|
||||
}
|
||||
return UUID.nameUUIDFromBytes(getName().getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
if (source instanceof Entity) {
|
||||
return source.getName().asUnformattedString();
|
||||
}
|
||||
return "?";
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.commands;
|
||||
|
||||
import com.viaversion.fabric.common.commands.subs.LeakDetectSubCommand;
|
||||
import com.viaversion.viaversion.commands.ViaCommandHandler;
|
||||
|
||||
public class VFCommandHandler extends ViaCommandHandler {
|
||||
{
|
||||
try {
|
||||
registerSubCommand(new LeakDetectSubCommand());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.gui;
|
||||
|
||||
import net.minecraft.client.gui.widget.PagedEntryListWidget;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ChangedListener implements PagedEntryListWidget.Listener {
|
||||
private final Consumer<String> consumer;
|
||||
|
||||
public ChangedListener(Consumer<String> consumer) {
|
||||
this.consumer = consumer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBooleanValue(int id, boolean value) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFloatValue(int id, float value) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStringValue(int id, String text) {
|
||||
consumer.accept(text);
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.gui;
|
||||
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ListeneableButton extends ButtonWidget {
|
||||
private final Consumer<ButtonWidget> click;
|
||||
|
||||
public ListeneableButton(int id, int x, int y, int width, int height, String message, Consumer<ButtonWidget> click) {
|
||||
super(id, x, y, width, height, message);
|
||||
this.click = click;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(int mouseX, int mouseY) {
|
||||
super.mouseReleased(mouseX, mouseY);
|
||||
click.accept(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.gui;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.sound.SoundManager;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ViaButton extends ButtonWidget {
|
||||
// Meant to be similar to higher versions TexturedButtonWidget
|
||||
private final int startU;
|
||||
private final int startV;
|
||||
private final int offsetHoverV;
|
||||
private final Identifier texturePath;
|
||||
private final Consumer<ViaButton> onClick;
|
||||
|
||||
public ViaButton(int id, int x, int y, int width, int height, int startU, int startV, int offsetHoverV, Identifier texturePath,
|
||||
int textureSizeX, int textureSizeY, Consumer<ViaButton> onClick, String altTxt) {
|
||||
super(id, x, y, width, height, altTxt);
|
||||
this.startU = startU;
|
||||
this.startV = startV;
|
||||
this.offsetHoverV = offsetHoverV;
|
||||
this.texturePath = texturePath;
|
||||
assert textureSizeX == 256;
|
||||
assert textureSizeY == 256;
|
||||
this.onClick = onClick;
|
||||
}
|
||||
|
||||
public void render(MinecraftClient client, int mouseX, int mouseY) {
|
||||
// Modified copy-paste from LockButtonWidget
|
||||
if (this.visible) {
|
||||
client.getTextureManager().bindTexture(texturePath);
|
||||
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
boolean hover = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
|
||||
int v = startV;
|
||||
if (hover) {
|
||||
v += offsetHoverV;
|
||||
}
|
||||
this.drawTexture(this.x, this.y, startU, v, this.width, this.height);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playDownSound(SoundManager soundManager) {
|
||||
super.playDownSound(soundManager);
|
||||
onClick.accept(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,179 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.gui;
|
||||
|
||||
import com.viaversion.fabric.common.config.AbstractViaConfigScreen;
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.common.util.ProtocolUtils;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.ConfirmScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class ViaConfigScreen extends Screen implements AbstractViaConfigScreen {
|
||||
private static CompletableFuture<Void> latestProtocolSave;
|
||||
private final Screen parent;
|
||||
private TextFieldWidget protocolVersion;
|
||||
private final Text title;
|
||||
|
||||
public ViaConfigScreen(Screen parent) {
|
||||
super();
|
||||
title = new TranslatableText(TITLE_TRANSLATE_ID);
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
int entries = 0;
|
||||
|
||||
this.buttons.add(new ListeneableButton("clientside".hashCode(), calculatePosX(this.width, entries),
|
||||
calculatePosY(this.height, entries),
|
||||
150,
|
||||
20, getClientSideText().asUnformattedString(), this::onClickClientSide));
|
||||
entries++;
|
||||
|
||||
this.buttons.add(new ListeneableButton("hidevia".hashCode(), calculatePosX(this.width, entries),
|
||||
calculatePosY(this.height, entries),
|
||||
150,
|
||||
20, getHideViaButtonText().asUnformattedString(), this::onHideViaButton));
|
||||
entries++;
|
||||
|
||||
protocolVersion = new TextFieldWidget("protover".hashCode(), textRenderer,
|
||||
calculatePosX(this.width, entries),
|
||||
calculatePosY(this.height, entries),
|
||||
150,
|
||||
20);
|
||||
protocolVersion.setText(new TranslatableText(VERSION_TRANSLATE_ID).asUnformattedString());
|
||||
entries++;
|
||||
|
||||
protocolVersion.setTextPredicate(ProtocolUtils::isStartOfProtocolText);
|
||||
protocolVersion.setListener(new ChangedListener(this::onChangeVersionField));
|
||||
int clientSideVersion = ViaFabric.config.getClientSideVersion();
|
||||
protocolVersion.setText(ProtocolUtils.getProtocolName(clientSideVersion));
|
||||
onChangeVersionField(protocolVersion.getText());
|
||||
|
||||
//this.children.add(protocolVersion);
|
||||
|
||||
buttons.add(new ListeneableButton("done".hashCode(), this.width / 2 - 100, this.height - 40, 200, 20, new TranslatableText("gui.done").asUnformattedString(),
|
||||
(buttonWidget) -> MinecraftClient.getInstance().setScreen(this.parent)));
|
||||
}
|
||||
|
||||
private void onChangeVersionField(String text) {
|
||||
//protocolVersion.setSuggestion(null);
|
||||
int newVersion = ViaFabric.config.getClientSideVersion();
|
||||
|
||||
Integer parsed = ProtocolUtils.parseProtocolId(text);
|
||||
boolean validProtocol;
|
||||
|
||||
if (parsed != null) {
|
||||
newVersion = parsed;
|
||||
validProtocol = true;
|
||||
} else {
|
||||
validProtocol = false;
|
||||
}
|
||||
|
||||
protocolVersion.setEditableColor(getProtocolTextColor(newVersion, validProtocol));
|
||||
|
||||
int finalNewVersion = newVersion;
|
||||
if (latestProtocolSave == null) latestProtocolSave = CompletableFuture.completedFuture(null);
|
||||
ViaFabric.config.setClientSideVersion(finalNewVersion);
|
||||
latestProtocolSave = latestProtocolSave.thenRunAsync(ViaFabric.config::save, ViaFabric.ASYNC_EXECUTOR);
|
||||
}
|
||||
|
||||
private void onClickClientSide(ButtonWidget widget) {
|
||||
if (!ViaFabric.config.isClientSideEnabled()) {
|
||||
MinecraftClient.getInstance().setScreen(new ConfirmScreen(
|
||||
(answer, id) -> {
|
||||
if (answer) {
|
||||
ViaFabric.config.setClientSideEnabled(true);
|
||||
ViaFabric.config.setClientSideVersion(-2); // AUTO
|
||||
ViaFabric.config.save();
|
||||
widget.message = getClientSideText().asUnformattedString();
|
||||
}
|
||||
MinecraftClient.getInstance().setScreen(this);
|
||||
},
|
||||
new TranslatableText("gui.enable_client_side.question").asUnformattedString(),
|
||||
new TranslatableText("gui.enable_client_side.warning").asUnformattedString(),
|
||||
new TranslatableText("gui.enable_client_side.enable").asUnformattedString(),
|
||||
new TranslatableText("gui.cancel").asUnformattedString(),
|
||||
"via anticheat consent".hashCode()
|
||||
));
|
||||
} else {
|
||||
ViaFabric.config.setClientSideEnabled(false);
|
||||
ViaFabric.config.save();
|
||||
}
|
||||
widget.message = getClientSideText().asUnformattedString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removed() {
|
||||
ViaFabric.config.save();
|
||||
}
|
||||
|
||||
private TranslatableText getClientSideText() {
|
||||
return ViaFabric.config.isClientSideEnabled() ?
|
||||
new TranslatableText("gui.client_side.disable")
|
||||
: new TranslatableText("gui.client_side.enable");
|
||||
}
|
||||
|
||||
private TranslatableText getHideViaButtonText() {
|
||||
return ViaFabric.config.isHideButton() ?
|
||||
new TranslatableText("gui.hide_via_button.disable") : new TranslatableText("gui.hide_via_button.enable");
|
||||
}
|
||||
|
||||
private void onHideViaButton(ButtonWidget widget) {
|
||||
ViaFabric.config.setHideButton(!ViaFabric.config.isHideButton());
|
||||
ViaFabric.config.save();
|
||||
widget.message = getHideViaButtonText().asUnformattedString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(int mouseX, int mouseY, float delta) {
|
||||
this.renderBackground();
|
||||
drawCenteredString(this.textRenderer, this.title.asUnformattedString(), this.width / 2, 20, 16777215);
|
||||
super.render(mouseX, mouseY, delta);
|
||||
protocolVersion.render();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
protocolVersion.tick();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void keyPressed(char character, int code) {
|
||||
super.keyPressed(character, code);
|
||||
protocolVersion.keyPressed(character, code);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseClicked(int mouseX, int mouseY, int button) {
|
||||
super.mouseClicked(mouseX, mouseY, button);
|
||||
protocolVersion.method_920(mouseX, mouseY, button);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.address.client;
|
||||
|
||||
import com.viaversion.fabric.common.AddressParser;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
@Mixin(targets = "net.minecraft.client.gui.screen.ConnectScreen$1")
|
||||
public class MixinConnectScreenThread {
|
||||
@Redirect(method = "run()V", at = @At(value = "INVOKE",
|
||||
target = "Ljava/net/InetAddress;getByName(Ljava/lang/String;)Ljava/net/InetAddress;"))
|
||||
private InetAddress resolveViaFabricAddr(String address) throws UnknownHostException {
|
||||
AddressParser viaAddr = new AddressParser().parse(address);
|
||||
if (viaAddr.viaSuffix == null) {
|
||||
return InetAddress.getByName(address);
|
||||
}
|
||||
|
||||
InetAddress resolved = InetAddress.getByName(viaAddr.serverAddress);
|
||||
return InetAddress.getByAddress(resolved.getHostName() + "." + viaAddr.getSuffixWithOptions(), resolved.getAddress());
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.address.client;
|
||||
|
||||
import com.viaversion.fabric.common.AddressParser;
|
||||
import net.minecraft.network.ServerAddress;
|
||||
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(ServerAddress.class)
|
||||
public abstract class MixinServerAddress {
|
||||
@Shadow
|
||||
private static String[] resolveSrv(String address) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
@Redirect(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ServerAddress;resolveSrv(Ljava/lang/String;)[Ljava/lang/String;"))
|
||||
private static String[] modifySrvAddr(String address) {
|
||||
AddressParser viaAddr = new AddressParser().parse(address);
|
||||
if (viaAddr.viaSuffix == null) {
|
||||
return resolveSrv(address);
|
||||
}
|
||||
|
||||
String[] resolvedSrv = resolveSrv(viaAddr.serverAddress);
|
||||
resolvedSrv[0] = resolvedSrv[0].replaceAll("\\.$", "") + "." + viaAddr.getSuffixWithOptions();
|
||||
|
||||
return resolvedSrv;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.address.client;
|
||||
|
||||
import com.viaversion.fabric.common.AddressParser;
|
||||
import net.minecraft.client.network.MultiplayerServerListPinger;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
@Mixin(MultiplayerServerListPinger.class)
|
||||
public class MixinServerPinger {
|
||||
@Redirect(method = "add", at = @At(value = "INVOKE",
|
||||
target = "Ljava/net/InetAddress;getByName(Ljava/lang/String;)Ljava/net/InetAddress;"))
|
||||
private InetAddress resolveViaFabricAddr(String address) throws UnknownHostException {
|
||||
AddressParser viaAddr = new AddressParser().parse(address);
|
||||
if (viaAddr.viaSuffix == null) {
|
||||
return InetAddress.getByName(address);
|
||||
}
|
||||
|
||||
InetAddress resolved = InetAddress.getByName(viaAddr.serverAddress);
|
||||
return InetAddress.getByAddress(resolved.getHostName() + "." + viaAddr.getSuffixWithOptions(), resolved.getAddress());
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.debug.client;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import net.minecraft.network.ClientConnection;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
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(ClientConnection.class)
|
||||
public abstract class MixinClientConnection {
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
private static Logger LOGGER;
|
||||
|
||||
@Inject(method = "exceptionCaught", at = @At("TAIL"))
|
||||
public void exceptionCaught(ChannelHandlerContext context, Throwable ex, CallbackInfo ci) {
|
||||
LOGGER.error("Packet error", ex);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.debug.client;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
import net.minecraft.network.ClientConnection;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(ClientConnection.class)
|
||||
public interface MixinClientConnectionAccessor {
|
||||
@Accessor
|
||||
Channel getChannel();
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.debug.client;
|
||||
|
||||
import com.viaversion.fabric.common.handler.CommonTransformer;
|
||||
import com.viaversion.fabric.common.handler.FabricDecodeHandler;
|
||||
import com.viaversion.viaversion.api.connection.ProtocolInfo;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.hud.DebugHud;
|
||||
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.CallbackInfoReturnable;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(DebugHud.class)
|
||||
public class MixinDebugHud {
|
||||
@Inject(at = @At("RETURN"), method = "getLeftText")
|
||||
protected void getLeftText(CallbackInfoReturnable<List<String>> info) {
|
||||
String line = "[ViaFabric] I: " + Via.getManager().getConnectionManager().getConnections().size() + " (F: "
|
||||
+ Via.getManager().getConnectionManager().getConnectedClients().size() + ")";
|
||||
ChannelHandler viaDecoder = ((MixinClientConnectionAccessor) MinecraftClient.getInstance().getNetworkHandler()
|
||||
.getClientConnection()).getChannel().pipeline().get(CommonTransformer.HANDLER_DECODER_NAME);
|
||||
if (viaDecoder instanceof FabricDecodeHandler) {
|
||||
UserConnection user = ((FabricDecodeHandler) viaDecoder).getInfo();
|
||||
ProtocolInfo protocol = user.getProtocolInfo();
|
||||
if (protocol != null) {
|
||||
ProtocolVersion serverVer = ProtocolVersion.getProtocol(protocol.getServerProtocolVersion());
|
||||
ProtocolVersion clientVer = ProtocolVersion.getProtocol(protocol.getProtocolVersion());
|
||||
line += " / C: " + clientVer + " S: " + serverVer + " A: " + user.isActive();
|
||||
}
|
||||
}
|
||||
|
||||
info.getReturnValue().add(line);
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.gui.client;
|
||||
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.mc112.gui.ViaButton;
|
||||
import com.viaversion.fabric.mc112.gui.ViaConfigScreen;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import net.minecraft.util.Identifier;
|
||||
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;
|
||||
|
||||
@Mixin(MultiplayerScreen.class)
|
||||
public abstract class MixinMultiplayerScreen extends Screen {
|
||||
protected MixinMultiplayerScreen(UnsupportedOperationException e) {
|
||||
super();
|
||||
throw e;
|
||||
}
|
||||
|
||||
@Inject(method = "init", at = @At("TAIL"))
|
||||
private void onInit(CallbackInfo ci) {
|
||||
ButtonWidget enableClientSideViaVersion = new ViaButton("via".hashCode(), this.width / 2 + 113, 10,
|
||||
40, 20, // Size
|
||||
0, 0, // Start pos of texture
|
||||
20, // v Hover offset
|
||||
new Identifier("viafabric:textures/gui/widgets.png"),
|
||||
256, 256, // Texture size
|
||||
it -> MinecraftClient.getInstance().setScreen(new ViaConfigScreen(this)),
|
||||
new TranslatableText("gui.via_button").asUnformattedString());
|
||||
if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false;
|
||||
this.buttons.add(enableClientSideViaVersion);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.pipeline;
|
||||
|
||||
import com.viaversion.fabric.common.handler.PipelineReorderEvent;
|
||||
import io.netty.channel.Channel;
|
||||
import net.minecraft.network.ClientConnection;
|
||||
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(ClientConnection.class)
|
||||
public class MixinClientConnection {
|
||||
@Shadow
|
||||
private Channel channel;
|
||||
|
||||
@Inject(method = "setCompressionThreshold", at = @At("RETURN"))
|
||||
private void reorderCompression(int compressionThreshold, CallbackInfo ci) {
|
||||
channel.pipeline().fireUserEventTriggered(new PipelineReorderEvent());
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.pipeline;
|
||||
|
||||
import com.viaversion.fabric.common.handler.CommonTransformer;
|
||||
import com.viaversion.fabric.common.handler.FabricDecodeHandler;
|
||||
import com.viaversion.fabric.common.handler.FabricEncodeHandler;
|
||||
import com.viaversion.viaversion.connection.UserConnectionImpl;
|
||||
import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
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;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
|
||||
@Mixin(targets = "net.minecraft.server.ServerNetworkIo$4")
|
||||
public class MixinServerNetworkIoChInit {
|
||||
@Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false)
|
||||
private void onInitChannel(Channel channel, CallbackInfo ci) {
|
||||
if (channel instanceof SocketChannel) {
|
||||
UserConnection user = new UserConnectionImpl(channel);
|
||||
new ProtocolPipelineImpl(user);
|
||||
|
||||
channel.pipeline().addBefore("encoder", CommonTransformer.HANDLER_ENCODER_NAME, new FabricEncodeHandler(user));
|
||||
channel.pipeline().addBefore("decoder", CommonTransformer.HANDLER_DECODER_NAME, new FabricDecodeHandler(user));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.pipeline.client;
|
||||
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.mc112.service.ProtocolAutoDetector;
|
||||
import net.minecraft.network.ClientConnection;
|
||||
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.CallbackInfoReturnable;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
|
||||
@Mixin(ClientConnection.class)
|
||||
public class MixinClientConnection {
|
||||
@Inject(method = "connect", at = @At("HEAD"))
|
||||
private static void onConnect(InetAddress address, int port, boolean shouldUseNativeTransport, CallbackInfoReturnable<ClientConnection> cir) {
|
||||
try {
|
||||
if (!ViaFabric.config.isClientSideEnabled()) return;
|
||||
ProtocolAutoDetector.detectVersion(new InetSocketAddress(address, port)).get(10, TimeUnit.SECONDS);
|
||||
} catch (Exception e) {
|
||||
ViaFabric.JLOGGER.log(Level.WARNING, "Could not auto-detect protocol for " + address + " " + e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.mixin.pipeline.client;
|
||||
|
||||
import com.viaversion.fabric.common.handler.FabricDecodeHandler;
|
||||
import com.viaversion.fabric.common.handler.FabricEncodeHandler;
|
||||
import com.viaversion.fabric.common.handler.CommonTransformer;
|
||||
import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
|
||||
import com.viaversion.viaversion.connection.UserConnectionImpl;
|
||||
import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
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;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
|
||||
@Mixin(targets = "net.minecraft.network.ClientConnection$5")
|
||||
public class MixinClientConnectionChInit {
|
||||
@Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false)
|
||||
private void onInitChannel(Channel channel, CallbackInfo ci) {
|
||||
if (channel instanceof SocketChannel) {
|
||||
UserConnection user = new UserConnectionImpl(channel, true);
|
||||
new ProtocolPipelineImpl(user).add(HostnameParserProtocol.INSTANCE);
|
||||
|
||||
channel.pipeline()
|
||||
.addBefore("encoder", CommonTransformer.HANDLER_ENCODER_NAME, new FabricEncodeHandler(user))
|
||||
.addBefore("decoder", CommonTransformer.HANDLER_DECODER_NAME, new FabricDecodeHandler(user));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.viaversion.fabric.mc112.mixin.pipeline.client;
|
||||
|
||||
import com.viaversion.fabric.mc112.service.ProtocolAutoDetector;
|
||||
import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
@Mixin(HandshakeC2SPacket.class)
|
||||
public class MixinHandshakeC2SPacket implements ProtocolAutoDetector.IHandshakeC2SPacket {
|
||||
|
||||
@Shadow
|
||||
private int protocolVersion;
|
||||
|
||||
@Override
|
||||
public void viaFabric$setProtocolVersion(int version) {
|
||||
this.protocolVersion = version;
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.platform;
|
||||
|
||||
import com.viaversion.fabric.common.platform.NativeVersionProvider;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.realms.RealmsSharedConstants;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.ServerMetadata;
|
||||
|
||||
public class FabricNativeVersionProvider implements NativeVersionProvider {
|
||||
@Override
|
||||
public int getNativeServerVersion() {
|
||||
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
|
||||
return getClientProtocol();
|
||||
}
|
||||
|
||||
ServerMetadata.Version version = MinecraftClient.getInstance().getServer().getServerMetadata().getVersion();
|
||||
if (version == null) return ProtocolVersion.v1_8.getVersion();
|
||||
return version.getProtocolVersion();
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
private int getClientProtocol() {
|
||||
try {
|
||||
return RealmsSharedConstants.class.getField("NETWORK_PROTOCOL_VERSION").getInt(null);
|
||||
} catch (IllegalAccessException | NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return ProtocolVersion.v1_8.getVersion(); // fallback
|
||||
}
|
||||
}
|
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.platform;
|
||||
|
||||
import com.viaversion.fabric.common.commands.UserCommandSender;
|
||||
import com.viaversion.fabric.common.platform.NativeVersionProvider;
|
||||
import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
|
||||
import com.viaversion.fabric.common.util.FutureTaskId;
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.mc112.commands.NMSCommandSender;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.command.ViaCommandSender;
|
||||
import com.viaversion.viaversion.util.ComponentUtil;
|
||||
import io.netty.channel.EventLoop;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CancellationException;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class FabricPlatform extends AbstractFabricPlatform {
|
||||
public static MinecraftServer getServer() {
|
||||
// In 1.12.2 integrated server instance exists even if it's not running
|
||||
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT
|
||||
&& !MinecraftClient.getInstance().isIntegratedServerRunning()) return null;
|
||||
return MinecraftClient.getInstance().getServer();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void installNativeVersionProvider() {
|
||||
Via.getManager().getProviders().use(NativeVersionProvider.class, new FabricNativeVersionProvider());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ExecutorService asyncService() {
|
||||
return ViaFabric.ASYNC_EXECUTOR;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected EventLoop eventLoop() {
|
||||
return ViaFabric.EVENT_LOOP;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FutureTaskId runAsync(Runnable runnable) {
|
||||
return new FutureTaskId(CompletableFuture
|
||||
.runAsync(runnable, ViaFabric.ASYNC_EXECUTOR)
|
||||
.exceptionally(throwable -> {
|
||||
if (!(throwable instanceof CancellationException)) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FutureTaskId runSync(Runnable runnable) {
|
||||
if (getServer() != null) {
|
||||
return runServerSync(runnable);
|
||||
} else {
|
||||
return runEventLoop(runnable);
|
||||
}
|
||||
}
|
||||
|
||||
private FutureTaskId runServerSync(Runnable runnable) {
|
||||
// Kick task needs to be on main thread, it does already have error logger
|
||||
return new FutureTaskId(CompletableFuture.runAsync(runnable, it -> getServer().method_10815((Callable<Void>) () -> {
|
||||
it.run();
|
||||
return null;
|
||||
})));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViaCommandSender[] getOnlinePlayers() {
|
||||
MinecraftServer server = getServer();
|
||||
if (server != null && server.isOnThread()) {
|
||||
return getServerPlayers();
|
||||
}
|
||||
return Via.getManager().getConnectionManager().getConnectedClients().values().stream()
|
||||
.map(UserCommandSender::new)
|
||||
.toArray(ViaCommandSender[]::new);
|
||||
}
|
||||
|
||||
private ViaCommandSender[] getServerPlayers() {
|
||||
return getServer().getPlayerManager().getPlayers().stream()
|
||||
.map(NMSCommandSender::new)
|
||||
.toArray(ViaCommandSender[]::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMessage(UUID uuid, String s) {
|
||||
sendMessageServer(uuid, s);
|
||||
}
|
||||
|
||||
private void sendMessageServer(UUID uuid, String s) {
|
||||
MinecraftServer server = getServer();
|
||||
if (server == null) return;
|
||||
runServerSync(() -> {
|
||||
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
|
||||
if (player == null) return;
|
||||
player.sendMessage(Text.Serializer.deserializeText(ComponentUtil.legacyToJsonString(s)));
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean kickPlayer(UUID uuid, String s) {
|
||||
return kickServer(uuid, s);
|
||||
}
|
||||
|
||||
private boolean kickServer(UUID uuid, String s) {
|
||||
MinecraftServer server = getServer();
|
||||
if (server == null) return false;
|
||||
Supplier<Boolean> kickTask = () -> {
|
||||
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
|
||||
if (player == null) return false;
|
||||
player.networkHandler.method_14977(Text.Serializer.deserializeText(s));
|
||||
return true;
|
||||
};
|
||||
if (server.isOnThread()) {
|
||||
return kickTask.get();
|
||||
} else {
|
||||
ViaFabric.JLOGGER.log(Level.WARNING, "Weird!? Player kicking was called off-thread", new Throwable());
|
||||
runServerSync(kickTask::get);
|
||||
}
|
||||
return false; // Can't know if it worked
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.platform;
|
||||
|
||||
import com.viaversion.fabric.mc112.providers.VFHandItemProvider;
|
||||
import com.viaversion.fabric.mc112.providers.FabricVersionProvider;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.platform.ViaPlatformLoader;
|
||||
import com.viaversion.viaversion.api.protocol.version.VersionProvider;
|
||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
|
||||
|
||||
public class VFLoader implements ViaPlatformLoader {
|
||||
@Override
|
||||
public void load() {
|
||||
Via.getManager().getProviders().use(VersionProvider.class, new FabricVersionProvider());
|
||||
|
||||
if (Via.getPlatform().getConf().isItemCache()) {
|
||||
VFHandItemProvider handProvider = new VFHandItemProvider();
|
||||
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
|
||||
handProvider.registerClientTick();
|
||||
}
|
||||
handProvider.registerServerTick();
|
||||
Via.getManager().getProviders().use(HandItemProvider.class, handProvider);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unload() {
|
||||
// Nothing to do
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.providers;
|
||||
|
||||
import com.viaversion.fabric.common.config.VFConfig;
|
||||
import com.viaversion.fabric.common.provider.AbstractFabricVersionProvider;
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.mc112.service.ProtocolAutoDetector;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class FabricVersionProvider extends AbstractFabricVersionProvider {
|
||||
@Override
|
||||
protected Logger getLogger() {
|
||||
return ViaFabric.JLOGGER;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VFConfig getConfig() {
|
||||
return ViaFabric.config;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<ProtocolVersion> detectVersion(InetSocketAddress address) {
|
||||
return ProtocolAutoDetector.detectVersion(address);
|
||||
}
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.providers;
|
||||
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.item.DataItem;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.legacyfabric.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.legacyfabric.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class VFHandItemProvider extends HandItemProvider {
|
||||
public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
|
||||
public Item clientItem = null;
|
||||
|
||||
@Override
|
||||
public Item getHandItem(UserConnection info) {
|
||||
Item serverItem;
|
||||
if (info.isClientSide()) {
|
||||
return getClientItem();
|
||||
} else if ((serverItem = serverPlayers.get(info.getProtocolInfo().getUuid())) != null) {
|
||||
return new DataItem(serverItem);
|
||||
}
|
||||
return super.getHandItem(info);
|
||||
}
|
||||
|
||||
private Item getClientItem() {
|
||||
if (clientItem == null) {
|
||||
return new DataItem(0, (byte) 0, (short) 0, null);
|
||||
}
|
||||
return new DataItem(clientItem);
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public void registerClientTick() {
|
||||
try {
|
||||
ClientTickEvents.END_WORLD_TICK.register(world -> tickClient());
|
||||
} catch (NoClassDefFoundError ignored1) {
|
||||
ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
|
||||
}
|
||||
}
|
||||
|
||||
public void registerServerTick() {
|
||||
try {
|
||||
ServerTickEvents.END_SERVER_TICK.register(this::tickServer);
|
||||
} catch (NoClassDefFoundError ignored1) {
|
||||
ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
|
||||
}
|
||||
}
|
||||
|
||||
private void tickClient() {
|
||||
ClientPlayerEntity p = MinecraftClient.getInstance().player;
|
||||
if (p != null) {
|
||||
clientItem = fromNative(p.inventory.getMainHandStack());
|
||||
}
|
||||
}
|
||||
|
||||
private void tickServer(MinecraftServer server) {
|
||||
serverPlayers.clear();
|
||||
server.getPlayerManager().getPlayers().forEach(it -> serverPlayers
|
||||
.put(it.getUuid(), fromNative(it.inventory.getMainHandStack())));
|
||||
}
|
||||
|
||||
private Item fromNative(ItemStack original) {
|
||||
if (original == null) return new DataItem(0, (byte) 0, (short) 0, null);
|
||||
int id = net.minecraft.item.Item.getRawId(original.getItem());
|
||||
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
|
||||
}
|
||||
}
|
@ -0,0 +1,146 @@
|
||||
/*
|
||||
* This file is part of ViaFabric - https://github.com/ViaVersion/ViaFabric
|
||||
* Copyright (C) 2018-2024 ViaVersion 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 com.viaversion.fabric.mc112.service;
|
||||
|
||||
import com.viaversion.fabric.mc112.ViaFabric;
|
||||
import com.viaversion.fabric.common.AddressParser;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
import io.netty.bootstrap.Bootstrap;
|
||||
import io.netty.channel.*;
|
||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||
import io.netty.handler.timeout.ReadTimeoutHandler;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.network.*;
|
||||
import net.minecraft.network.listener.ClientQueryPacketListener;
|
||||
import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
|
||||
import net.minecraft.network.packet.c2s.query.QueryRequestC2SPacket;
|
||||
import net.minecraft.network.packet.s2c.query.QueryPongS2CPacket;
|
||||
import net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket;
|
||||
import net.minecraft.server.ServerMetadata;
|
||||
import net.minecraft.text.LiteralText;
|
||||
import net.minecraft.text.Text;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class ProtocolAutoDetector {
|
||||
private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
|
||||
.expireAfterWrite(30, TimeUnit.SECONDS)
|
||||
.build(CacheLoader.from((address) -> {
|
||||
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();
|
||||
|
||||
try {
|
||||
final ClientConnection clientConnection = new ClientConnection(NetworkSide.CLIENTBOUND);
|
||||
|
||||
ChannelFuture ch = new Bootstrap()
|
||||
.group(ClientConnection.field_11553.get())
|
||||
.channel(NioSocketChannel.class)
|
||||
.handler(new ChannelInitializer<Channel>() {
|
||||
protected void initChannel(Channel channel) {
|
||||
try {
|
||||
channel.config().setOption(ChannelOption.TCP_NODELAY, true);
|
||||
channel.config().setOption(ChannelOption.IP_TOS, 0x18); // Stolen from Velocity, low delay, high reliability
|
||||
} catch (ChannelException ignored) {
|
||||
}
|
||||
|
||||
channel.pipeline()
|
||||
.addLast("timeout", new ReadTimeoutHandler(30))
|
||||
.addLast("splitter", new SplitterHandler())
|
||||
.addLast("decoder", new DecoderHandler(NetworkSide.CLIENTBOUND))
|
||||
.addLast("prepender", new SizePrepender())
|
||||
.addLast("encoder", new PacketEncoder(NetworkSide.SERVERBOUND))
|
||||
.addLast("packet_handler", clientConnection);
|
||||
}
|
||||
})
|
||||
.connect(address);
|
||||
|
||||
ch.addListener(future1 -> {
|
||||
if (!future1.isSuccess()) {
|
||||
future.completeExceptionally(future1.cause());
|
||||
} else {
|
||||
ch.channel().eventLoop().execute(() -> { // needs to execute after channel init
|
||||
clientConnection.setPacketListener(new ClientQueryPacketListener() {
|
||||
@Override
|
||||
public void onResponse(QueryResponseS2CPacket packet) {
|
||||
ServerMetadata meta = packet.getServerMetadata();
|
||||
ServerMetadata.Version version;
|
||||
if (meta != null && (version = meta.getVersion()) != null) {
|
||||
ProtocolVersion ver = ProtocolVersion.getProtocol(version.getProtocolVersion());
|
||||
future.complete(ver);
|
||||
ViaFabric.JLOGGER.info("Auto-detected " + ver + " for " + address);
|
||||
} else {
|
||||
future.completeExceptionally(new IllegalArgumentException("Null version in query response"));
|
||||
}
|
||||
clientConnection.disconnect(new LiteralText(""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPong(QueryPongS2CPacket packet) {
|
||||
clientConnection.disconnect(new LiteralText("Pong not requested!"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisconnected(Text reason) {
|
||||
future.completeExceptionally(new IllegalStateException(reason.asUnformattedString()));
|
||||
}
|
||||
});
|
||||
|
||||
HandshakeC2SPacket handshakeC2SPacket = new HandshakeC2SPacket(address.getHostString(),
|
||||
address.getPort(), NetworkState.STATUS);
|
||||
((IHandshakeC2SPacket) handshakeC2SPacket).viaFabric$setProtocolVersion(
|
||||
Via.getAPI().getServerVersion().lowestSupportedVersion());
|
||||
clientConnection.send(handshakeC2SPacket);
|
||||
clientConnection.send(new QueryRequestC2SPacket());
|
||||
});
|
||||
}
|
||||
});
|
||||
} catch (Throwable throwable) {
|
||||
future.completeExceptionally(throwable);
|
||||
}
|
||||
|
||||
return future;
|
||||
}));
|
||||
|
||||
public static CompletableFuture<ProtocolVersion> detectVersion(InetSocketAddress address) {
|
||||
try {
|
||||
InetSocketAddress real = new InetSocketAddress(InetAddress.getByAddress
|
||||
(new AddressParser().parse(address.getHostString()).serverAddress,
|
||||
address.getAddress().getAddress()), address.getPort());
|
||||
return SERVER_VER.get(real);
|
||||
} catch (UnknownHostException | ExecutionException e) {
|
||||
ViaFabric.JLOGGER.log(Level.WARNING, "Protocol auto detector error: ", e);
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IHandshakeC2SPacket {
|
||||
|
||||
void viaFabric$setProtocolVersion(final int version);
|
||||
}
|
||||
}
|
59
viafabric-mc112/src/main/resources/fabric.mod.json
Normal file
59
viafabric-mc112/src/main/resources/fabric.mod.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "viafabric-mc112",
|
||||
"name": "ViaFabric for 1.12",
|
||||
"version": "${version}",
|
||||
"description": "${description}",
|
||||
"license": "GPL-3.0",
|
||||
"contact": {
|
||||
"homepage": "https://viaversion.com/fabric",
|
||||
"issues": "https://github.com/ViaVersion/ViaFabric/issues",
|
||||
"sources": "https://github.com/ViaVersion/ViaFabric"
|
||||
},
|
||||
"environment": "*",
|
||||
"authors": [
|
||||
{
|
||||
"name": "creeper123123321",
|
||||
"contact": {
|
||||
"homepage": "https://creeper123123321.github.io/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FlorianMichael/EnZaXD",
|
||||
"contact": {
|
||||
"homepage": "https://github.com/FlorianMichael"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "kennytv",
|
||||
"contact": {
|
||||
"homepage": "https://kennytv.eu"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Kichura",
|
||||
"contact": {
|
||||
"homepage": "https://github.com/Kichura"
|
||||
}
|
||||
}
|
||||
],
|
||||
"entrypoints": {
|
||||
"main": [
|
||||
"com.viaversion.fabric.mc112.ViaFabric"
|
||||
]
|
||||
},
|
||||
"depends": {
|
||||
"legacy-fabric-resource-loader-v1": "*",
|
||||
"minecraft": "1.12.2",
|
||||
"viafabric": "*"
|
||||
},
|
||||
"recommends": {
|
||||
"legacy-fabric-command-api-v1": "*"
|
||||
},
|
||||
"mixins": [
|
||||
"mixins.viafabric112.address.json",
|
||||
"mixins.viafabric112.gui.json",
|
||||
"mixins.viafabric112.debug.json",
|
||||
"mixins.viafabric112.pipeline.json"
|
||||
]
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"required": true,
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"package": "com.viaversion.fabric.mc112.mixin.address",
|
||||
"mixins": [
|
||||
],
|
||||
"client": [
|
||||
"client.MixinConnectScreenThread",
|
||||
"client.MixinServerAddress",
|
||||
"client.MixinServerPinger"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 0
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"required": true,
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"package": "com.viaversion.fabric.mc112.mixin.debug",
|
||||
"mixins": [
|
||||
],
|
||||
"client": [
|
||||
"client.MixinClientConnectionAccessor",
|
||||
"client.MixinDebugHud",
|
||||
"client.MixinClientConnection"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 0
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"required": true,
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"package": "com.viaversion.fabric.mc112.mixin.gui",
|
||||
"mixins": [
|
||||
],
|
||||
"client": [
|
||||
"client.MixinMultiplayerScreen"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 0
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
{
|
||||
"required": true,
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"package": "com.viaversion.fabric.mc112.mixin.pipeline",
|
||||
"mixins": [
|
||||
"MixinClientConnection",
|
||||
"MixinServerNetworkIoChInit",
|
||||
"client.MixinHandshakeC2SPacket"
|
||||
],
|
||||
"client": [
|
||||
"client.MixinClientConnection",
|
||||
"client.MixinClientConnectionChInit"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user