move client code to own class, some cleanup

This commit is contained in:
creeper123123321 2021-07-21 11:24:21 -03:00
parent 9e337d45c1
commit 1d6363bbb9
53 changed files with 426 additions and 835 deletions

View File

@ -103,9 +103,9 @@ or registry synchronization (fabric-registry-sync mod).
- You can disable it in the menu or by setting global protocol version to -1 (this will keep per-server translations still enabled) - You can disable it in the menu or by setting global protocol version to -1 (this will keep per-server translations still enabled)
### How to use protocol auto detector?: ### How to use protocol detection?:
- For using globally, set the protocol to AUTO or -2. For using in a specific server: ``ddns.example.com._v-2.viafabric`` - For using globally, set the protocol to AUTO or -2. For using in a specific server: ``ddns.example.com._v-2.viafabric``
- The protocol auto detector will try to ping with the client native protocol version. If you have ViaVersion or - The protocol detector will try to ping with the client native protocol version. If you have ViaVersion or
similar in the server it may use the translated version, differently than multiconnect which uses -1 version, similar in the server it may use the translated version, differently than multiconnect which uses -1 version,
which may get the native server version. which may get the native server version.
- It may hold your handshake for up to 10 seconds. - It may hold your handshake for up to 10 seconds.

View File

@ -63,11 +63,8 @@ public class AddressParser {
} }
String arg = part.substring(2); String arg = part.substring(2);
switch (option) { if ("v".equals(option)) {
case "v": { parseProtocol(arg);
parseProtocol(arg);
break;
}
} }
return true; return true;

View File

@ -7,7 +7,7 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import java.util.UUID; import java.util.UUID;
public class UserCommandSender implements ViaCommandSender { public class UserCommandSender implements ViaCommandSender {
private UserConnection con; private final UserConnection con;
public UserCommandSender(UserConnection con) { public UserCommandSender(UserConnection con) {
this.con = con; this.con = con;

View File

@ -9,7 +9,6 @@ import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder; import io.netty.handler.codec.MessageToMessageDecoder;
import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.List;
@ChannelHandler.Sharable @ChannelHandler.Sharable

View File

@ -46,7 +46,7 @@ public class FabricInjector implements ViaInjector {
} }
@Override @Override
public int getServerProtocolVersion() throws Exception { public int getServerProtocolVersion() {
return getServerProtocolVersions().firstInt(); return getServerProtocolVersions().firstInt();
} }
} }

View File

@ -10,7 +10,7 @@ import java.util.Map;
public class FabricViaConfig extends AbstractViaConfig { public class FabricViaConfig extends AbstractViaConfig {
// Based on Sponge ViaVersion // Based on Sponge ViaVersion
private static List<String> UNSUPPORTED = Arrays.asList("anti-xray-patch", "bungee-ping-interval", private static final List<String> UNSUPPORTED = Arrays.asList("anti-xray-patch", "bungee-ping-interval",
"bungee-ping-save", "bungee-servers", "quick-move-action-fix", "nms-player-ticking", "bungee-ping-save", "bungee-servers", "quick-move-action-fix", "nms-player-ticking",
"velocity-ping-interval", "velocity-ping-save", "velocity-servers", "velocity-ping-interval", "velocity-ping-save", "velocity-servers",
"blockconnection-method", "change-1_9-hitbox", "change-1_14-hitbox"); "blockconnection-method", "change-1_9-hitbox", "change-1_14-hitbox");

View File

@ -3,6 +3,7 @@ package com.viaversion.fabric.common.provider;
import com.viaversion.fabric.common.platform.FabricViaAPI; import com.viaversion.fabric.common.platform.FabricViaAPI;
import com.viaversion.fabric.common.platform.FabricViaConfig; import com.viaversion.fabric.common.platform.FabricViaConfig;
import com.viaversion.fabric.common.platform.NativeVersionProvider; import com.viaversion.fabric.common.platform.NativeVersionProvider;
import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.JLoggerToLog4j; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.ViaAPI; import com.viaversion.viaversion.api.ViaAPI;
@ -11,6 +12,9 @@ import com.viaversion.viaversion.api.configuration.ViaVersionConfig;
import com.viaversion.viaversion.api.platform.ViaPlatform; import com.viaversion.viaversion.api.platform.ViaPlatform;
import com.viaversion.viaversion.libs.gson.JsonArray; import com.viaversion.viaversion.libs.gson.JsonArray;
import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.libs.gson.JsonObject;
import io.netty.channel.EventLoop;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.Version; import net.fabricmc.loader.api.Version;
@ -20,6 +24,10 @@ import org.apache.logging.log4j.LogManager;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger; import java.util.logging.Logger;
public abstract class AbstractFabricPlatform implements ViaPlatform<UUID> { public abstract class AbstractFabricPlatform implements ViaPlatform<UUID> {
@ -35,6 +43,51 @@ public abstract class AbstractFabricPlatform implements ViaPlatform<UUID> {
api = new FabricViaAPI(); api = new FabricViaAPI();
} }
protected abstract ExecutorService asyncService();
protected abstract EventLoop eventLoop();
protected FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(eventLoop().submit(runnable).addListener(errorLogger()));
}
@Override
public FutureTaskId runAsync(Runnable runnable) {
return new FutureTaskId(CompletableFuture.runAsync(runnable, asyncService())
.exceptionally(throwable -> {
if (!(throwable instanceof CancellationException)) {
throwable.printStackTrace();
}
return null;
}));
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(eventLoop()
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(eventLoop()
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
protected <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public boolean isProxy() { public boolean isProxy() {
// We kinda of have all server versions // We kinda of have all server versions
@ -110,7 +163,7 @@ public abstract class AbstractFabricPlatform implements ViaPlatform<UUID> {
mod.getMetadata().getAuthors().stream().map(it -> { mod.getMetadata().getAuthors().stream().map(it -> {
JsonObject info = new JsonObject(); JsonObject info = new JsonObject();
JsonObject contact = new JsonObject(); JsonObject contact = new JsonObject();
it.getContact().asMap().entrySet().stream() it.getContact().asMap().entrySet()
.forEach(c -> contact.addProperty(c.getKey(), c.getValue())); .forEach(c -> contact.addProperty(c.getKey(), c.getValue()));
if (contact.size() != 0) { if (contact.size() != 0) {
info.add("contact", contact); info.add("contact", contact);

View File

@ -0,0 +1,27 @@
package com.viaversion.fabric.common.util;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
public class RemappingUtil {
public static int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
public static String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
}

View File

@ -1,29 +1,28 @@
package com.viaversion.fabric.mc114; package com.viaversion.fabric.mc114;
import com.viaversion.fabric.common.config.VFConfig;
import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.mc114.commands.VRCommandHandler;
import com.viaversion.fabric.mc114.platform.VFLoader;
import com.viaversion.fabric.mc114.platform.FabricPlatform;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import io.netty.channel.DefaultEventLoop; import com.viaversion.fabric.common.config.VFConfig;
import io.netty.channel.EventLoop; import com.viaversion.fabric.common.platform.FabricInjector;
import net.fabricmc.api.ModInitializer; import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import net.fabricmc.fabric.api.registry.CommandRegistry; import com.viaversion.fabric.mc114.commands.VRCommandHandler;
import net.fabricmc.loader.api.FabricLoader; import com.viaversion.fabric.mc114.platform.FabricPlatform;
import net.minecraft.server.command.CommandSource; import com.viaversion.fabric.mc114.platform.VFLoader;
import org.apache.logging.log4j.LogManager;
import com.viaversion.viaversion.ViaManagerImpl; import com.viaversion.viaversion.ViaManagerImpl;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.MappingDataLoader; import com.viaversion.viaversion.api.data.MappingDataLoader;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import io.netty.channel.DefaultEventLoop;
import io.netty.channel.EventLoop;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.command.CommandSource;
import org.apache.logging.log4j.LogManager;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -35,7 +34,7 @@ public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -73,16 +72,7 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
try { registerCommandsV1();
registerCommandsV1();
} catch (NoClassDefFoundError ignored) {
try {
registerCommandsV0();
JLOGGER.info("Using Fabric Commands V0");
} catch (NoClassDefFoundError ignored2) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
}
}
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -91,15 +81,12 @@ public class ViaFabric implements ModInitializer {
} }
private void registerCommandsV1() { private void registerCommandsV1() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion"))); try {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion")));
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver")));
} CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric")));
} catch (NoClassDefFoundError ignored) {
@SuppressWarnings("deprecation") JLOGGER.info("Couldn't register command as Fabric Commands V1 isn't installed");
private void registerCommandsV0() { }
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("viaversion")));
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("viaver")));
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("vvfabric")));
} }
} }

View File

@ -1,8 +1,7 @@
package com.viaversion.fabric.mc114.commands; package com.viaversion.fabric.mc114.commands;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -30,17 +29,13 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {
((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(legacyToJson(s)), false); ((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} else if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT } else if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT
&& source instanceof ClientCommandSource) { && source instanceof ClientCommandSource) {
MinecraftClient.getInstance().player.addChatMessage(Text.Serializer.fromJson(legacyToJson(s)), false); MinecraftClient.getInstance().player.addChatMessage(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} }
} }
private String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@Override @Override
public UUID getUUID() { public UUID getUUID() {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc114.gui;
import com.viaversion.fabric.mc114.ViaFabric; import com.viaversion.fabric.mc114.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -3,14 +3,12 @@ package com.viaversion.fabric.mc114.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc114.ViaFabric; import com.viaversion.fabric.mc114.ViaFabric;
import com.viaversion.fabric.mc114.commands.NMSCommandSender; import com.viaversion.fabric.mc114.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -22,9 +20,8 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
@ -41,23 +38,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftClient.getInstance().getServer(); return MinecraftClient.getInstance().getServer();
} }
public static String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@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 @Override
public FutureTaskId runSync(Runnable runnable) { public FutureTaskId runSync(Runnable runnable) {
if (getServer() != null) { if (getServer() != null) {
@ -72,42 +52,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer())); return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer()));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -137,7 +81,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
runServerSync(() -> { runServerSync(() -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendChatMessage(Text.Serializer.fromJson(legacyToJson(s)), MessageType.SYSTEM); player.sendChatMessage(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), MessageType.SYSTEM);
}); });
} }
@ -152,7 +96,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
Supplier<Boolean> kickTask = () -> { Supplier<Boolean> kickTask = () -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return false; if (player == null) return false;
player.networkHandler.disconnect(Text.Serializer.fromJson(legacyToJson(s))); player.networkHandler.disconnect(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
return true; return true;
}; };
if (server.isOnThread()) { if (server.isOnThread()) {
@ -163,4 +107,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
} }
return false; // Can't know if it worked return false; // Can't know if it worked
} }
@Override
protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
}
@Override
protected EventLoop eventLoop() {
return ViaFabric.EVENT_LOOP;
}
} }

View File

@ -1,5 +1,6 @@
package com.viaversion.fabric.mc114.providers; package com.viaversion.fabric.mc114.providers;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc114.ViaFabric; import com.viaversion.fabric.mc114.ViaFabric;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
@ -21,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>(); public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -50,7 +51,7 @@ public class VRHandItemProvider extends HandItemProvider {
} }
}); });
} catch (NoClassDefFoundError ignored2) { } catch (NoClassDefFoundError ignored2) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V0/V1 isn't installed"); ViaFabric.JLOGGER.info("Fabric Lifecycle V0 isn't installed");
} }
} }
@ -77,25 +78,7 @@ public class VRHandItemProvider extends HandItemProvider {
private Item fromNative(ItemStack original) { private Item fromNative(ItemStack original) {
Identifier iid = Registry.ITEM.getId(original.getItem()); Identifier iid = Registry.ITEM.getId(original.getItem());
if (iid == null) return new DataItem(0, (byte) 0, (short) 0, null); int id = RemappingUtil.swordId(iid.toString());
int id = swordId(iid.toString());
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null); return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();

View File

@ -10,8 +10,8 @@ import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol; import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.viaversion.fabric.mc115.commands.VRCommandHandler; import com.viaversion.fabric.mc115.commands.VRCommandHandler;
import com.viaversion.fabric.mc115.platform.VFLoader;
import com.viaversion.fabric.mc115.platform.FabricPlatform; import com.viaversion.fabric.mc115.platform.FabricPlatform;
import com.viaversion.fabric.mc115.platform.VFLoader;
import com.viaversion.viaversion.ViaManagerImpl; import com.viaversion.viaversion.ViaManagerImpl;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.MappingDataLoader; import com.viaversion.viaversion.api.data.MappingDataLoader;
@ -20,7 +20,6 @@ import io.netty.channel.DefaultEventLoop;
import io.netty.channel.EventLoop; import io.netty.channel.EventLoop;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.fabric.api.registry.CommandRegistry;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.command.CommandSource; import net.minecraft.server.command.CommandSource;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -35,7 +34,7 @@ public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -73,16 +72,7 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
try { registerCommandsV1();
registerCommandsV1();
} catch (NoClassDefFoundError ignored) {
try {
registerCommandsV0();
JLOGGER.info("Using Fabric Commands V0");
} catch (NoClassDefFoundError ignored2) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
}
}
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -91,15 +81,12 @@ public class ViaFabric implements ModInitializer {
} }
private void registerCommandsV1() { private void registerCommandsV1() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion"))); try {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion")));
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver")));
} CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric")));
} catch (NoClassDefFoundError ignored) {
@SuppressWarnings("deprecation") JLOGGER.info("Couldn't register command as Fabric Commands V1 isn't installed");
private void registerCommandsV0() { }
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("viaversion")));
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("viaver")));
CommandRegistry.INSTANCE.register(false, dispatcher -> dispatcher.register(command("vvfabric")));
} }
} }

View File

@ -1,8 +1,7 @@
package com.viaversion.fabric.mc115.commands; package com.viaversion.fabric.mc115.commands;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -30,16 +29,12 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {
((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(legacyToJson(s)), false); ((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} else if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT && source instanceof ClientCommandSource) { } else if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT && source instanceof ClientCommandSource) {
MinecraftClient.getInstance().player.addChatMessage(Text.Serializer.fromJson(legacyToJson(s)), false); MinecraftClient.getInstance().player.addChatMessage(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} }
} }
private String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@Override @Override
public UUID getUUID() { public UUID getUUID() {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc115.gui;
import com.viaversion.fabric.mc115.ViaFabric; import com.viaversion.fabric.mc115.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -1,52 +1,29 @@
package com.viaversion.fabric.mc115.platform; package com.viaversion.fabric.mc115.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.platform.FabricViaAPI;
import com.viaversion.fabric.common.platform.FabricViaConfig;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.JLoggerToLog4j; import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc115.ViaFabric; import com.viaversion.fabric.mc115.ViaFabric;
import com.viaversion.fabric.mc115.commands.NMSCommandSender; import com.viaversion.fabric.mc115.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.ViaAPI;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.api.configuration.ConfigurationProvider; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.api.configuration.ViaVersionConfig;
import com.viaversion.viaversion.api.platform.ViaPlatform;
import com.viaversion.viaversion.dump.PluginInfo;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import com.viaversion.viaversion.util.GsonUtil;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.metadata.ModMetadata;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.network.MessageType; import net.minecraft.network.MessageType;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import org.apache.logging.log4j.LogManager;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
public class FabricPlatform extends AbstractFabricPlatform { public class FabricPlatform extends AbstractFabricPlatform {
public static MinecraftServer getServer() { public static MinecraftServer getServer() {
@ -61,21 +38,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftClient.getInstance().getServer(); return MinecraftClient.getInstance().getServer();
} }
public static String legacyToJson(String legacy) { @Override
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy)); protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
} }
@Override @Override
public FutureTaskId runAsync(Runnable runnable) { protected EventLoop eventLoop() {
return new FutureTaskId(CompletableFuture return ViaFabric.EVENT_LOOP;
.runAsync(runnable, ViaFabric.ASYNC_EXECUTOR)
.exceptionally(throwable -> {
if (!(throwable instanceof CancellationException)) {
throwable.printStackTrace();
}
return null;
})
);
} }
@Override @Override
@ -92,42 +62,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer())); return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer()));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -157,7 +91,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
runServerSync(() -> { runServerSync(() -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendChatMessage(Text.Serializer.fromJson(legacyToJson(s)), MessageType.SYSTEM); player.sendChatMessage(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), MessageType.SYSTEM);
}); });
} }
@ -172,7 +106,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
Supplier<Boolean> kickTask = () -> { Supplier<Boolean> kickTask = () -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return false; if (player == null) return false;
player.networkHandler.disconnect(Text.Serializer.fromJson(legacyToJson(s))); player.networkHandler.disconnect(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
return true; return true;
}; };
if (server.isOnThread()) { if (server.isOnThread()) {

View File

@ -1,21 +1,21 @@
package com.viaversion.fabric.mc115.providers; package com.viaversion.fabric.mc115.providers;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc115.ViaFabric; import com.viaversion.fabric.mc115.ViaFabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.DataItem; import com.viaversion.viaversion.api.minecraft.item.DataItem;
import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider; import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -23,7 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>(); public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -48,15 +48,7 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient()); ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient());
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
try { ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
WorldTickCallback.EVENT.register(world -> {
if (world.isClient) {
tickClient();
}
});
} catch (NoClassDefFoundError ignored2) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V0/V1 isn't installed");
}
} }
} }
@ -64,11 +56,6 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ServerTickEvents.END_WORLD_TICK.register(this::tickServer); ServerTickEvents.END_WORLD_TICK.register(this::tickServer);
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
WorldTickCallback.EVENT.register(world -> {
if (!world.isClient) {
tickServer(world);
}
});
} }
} }
@ -87,25 +74,7 @@ public class VRHandItemProvider extends HandItemProvider {
private Item fromNative(ItemStack original) { private Item fromNative(ItemStack original) {
Identifier iid = Registry.ITEM.getId(original.getItem()); Identifier iid = Registry.ITEM.getId(original.getItem());
if (iid == null) return new DataItem(0, (byte) 0, (short) 0, null); int id = RemappingUtil.swordId(iid.toString());
int id = swordId(iid.toString());
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null); return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();

View File

@ -1,17 +1,21 @@
package com.viaversion.fabric.mc116; package com.viaversion.fabric.mc116;
import com.viaversion.fabric.common.config.VFConfig;
import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.mc116.commands.VRCommandHandler;
import com.viaversion.fabric.mc116.platform.VFLoader;
import com.viaversion.fabric.mc116.platform.FabricPlatform;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder;
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.mc116.commands.VRCommandHandler;
import com.viaversion.fabric.mc116.platform.FabricPlatform;
import com.viaversion.fabric.mc116.platform.VFLoader;
import com.viaversion.viaversion.ViaManagerImpl;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.MappingDataLoader;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import io.netty.channel.DefaultEventLoop; import io.netty.channel.DefaultEventLoop;
import io.netty.channel.EventLoop; import io.netty.channel.EventLoop;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
@ -21,10 +25,6 @@ import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import com.viaversion.viaversion.ViaManagerImpl;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.MappingDataLoader;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -36,7 +36,7 @@ public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -74,11 +74,7 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
try { registerCommandsV1();
registerCommandsV1();
} catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
}
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -87,11 +83,15 @@ public class ViaFabric implements ModInitializer {
} }
private void registerCommandsV1() { private void registerCommandsV1() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion"))); try {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion")));
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaver")));
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("vvfabric")));
ClientCommandManager.DISPATCHER.register(command("viafabricclient")); if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
ClientCommandManager.DISPATCHER.register(command("viafabricclient"));
}
} catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register command as Fabric Commands V1 isn't installed");
} }
} }
} }

View File

@ -1,14 +1,12 @@
package com.viaversion.fabric.mc116.commands; package com.viaversion.fabric.mc116.commands;
import com.viaversion.fabric.mc116.platform.FabricPlatform; import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.viaversion.api.command.ViaCommandSender;
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.util.UUID; import java.util.UUID;
@ -28,16 +26,12 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {
((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s)), false); ((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} else if (source instanceof FabricClientCommandSource) { } else if (source instanceof FabricClientCommandSource) {
((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s))); ((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
} }
} }
private String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@Override @Override
public UUID getUUID() { public UUID getUUID() {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc116.gui;
import com.viaversion.fabric.mc116.ViaFabric; import com.viaversion.fabric.mc116.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -3,14 +3,12 @@ package com.viaversion.fabric.mc116.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc116.ViaFabric; import com.viaversion.fabric.mc116.ViaFabric;
import com.viaversion.fabric.mc116.commands.NMSCommandSender; import com.viaversion.fabric.mc116.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -21,9 +19,8 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
@ -40,21 +37,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftClient.getInstance().getServer(); return MinecraftClient.getInstance().getServer();
} }
public static String legacyToJson(String legacy) { @Override
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy)); protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
} }
@Override @Override
public FutureTaskId runAsync(Runnable runnable) { protected EventLoop eventLoop() {
return new FutureTaskId(CompletableFuture return ViaFabric.EVENT_LOOP;
.runAsync(runnable, ViaFabric.ASYNC_EXECUTOR)
.exceptionally(throwable -> {
if (!(throwable instanceof CancellationException)) {
throwable.printStackTrace();
}
return null;
})
);
} }
@Override @Override
@ -71,42 +61,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer())); return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer()));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -137,7 +91,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendMessage(Text.Serializer.fromJson( player.sendMessage(Text.Serializer.fromJson(
legacyToJson(s) RemappingUtil.legacyToJson(s)
), false); ), false);
}); });
} }
@ -153,7 +107,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
Supplier<Boolean> kickTask = () -> { Supplier<Boolean> kickTask = () -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return false; if (player == null) return false;
player.networkHandler.disconnect(Text.Serializer.fromJson(legacyToJson(s))); player.networkHandler.disconnect(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
return true; return true;
}; };
if (server.isOnThread()) { if (server.isOnThread()) {

View File

@ -1,21 +1,21 @@
package com.viaversion.fabric.mc116.providers; package com.viaversion.fabric.mc116.providers;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc116.ViaFabric; import com.viaversion.fabric.mc116.ViaFabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.DataItem; import com.viaversion.viaversion.api.minecraft.item.DataItem;
import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider; import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -23,7 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>(); public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -48,15 +48,7 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient()); ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient());
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
try { ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
WorldTickCallback.EVENT.register(world -> {
if (world.isClient) {
tickClient();
}
});
} catch (NoClassDefFoundError ignored2) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V0/V1 isn't installed");
}
} }
} }
@ -64,11 +56,6 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ServerTickEvents.END_WORLD_TICK.register(this::tickServer); ServerTickEvents.END_WORLD_TICK.register(this::tickServer);
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
WorldTickCallback.EVENT.register(world -> {
if (!world.isClient) {
tickServer(world);
}
});
} }
} }
@ -87,25 +74,7 @@ public class VRHandItemProvider extends HandItemProvider {
private Item fromNative(ItemStack original) { private Item fromNative(ItemStack original) {
Identifier iid = Registry.ITEM.getId(original.getItem()); Identifier iid = Registry.ITEM.getId(original.getItem());
if (iid == null) return new DataItem(0, (byte) 0, (short) 0, null); int id = RemappingUtil.swordId(iid.toString());
int id = swordId(iid.toString());
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null); return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();

View File

@ -10,8 +10,6 @@ import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol; import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.viaversion.fabric.mc117.commands.VRCommandHandler; import com.viaversion.fabric.mc117.commands.VRCommandHandler;
import com.viaversion.fabric.mc117.gui.ViaConfigScreen;
import com.viaversion.fabric.mc117.mixin.gui.client.ScreenAccessor;
import com.viaversion.fabric.mc117.platform.FabricPlatform; import com.viaversion.fabric.mc117.platform.FabricPlatform;
import com.viaversion.fabric.mc117.platform.VFLoader; import com.viaversion.fabric.mc117.platform.VFLoader;
import com.viaversion.viaversion.ViaManagerImpl; import com.viaversion.viaversion.ViaManagerImpl;
@ -23,16 +21,9 @@ import io.netty.channel.EventLoop;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -45,7 +36,7 @@ public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -84,7 +75,6 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
registerCommandsV1(); registerCommandsV1();
registerGui();
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -92,27 +82,6 @@ public class ViaFabric implements ModInitializer {
INIT_FUTURE.complete(null); INIT_FUTURE.complete(null);
} }
private void registerGui() {
if (FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT) return;
try {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof MultiplayerScreen)) return;
ButtonWidget enableClientSideViaVersion = new TexturedButtonWidget(scaledWidth / 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(screen)),
new TranslatableText("gui.via_button"));
if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false;
((ScreenAccessor) screen).callAddDrawableChild(enableClientSideViaVersion);
});
} catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register screen handler as Fabric Screen isn't installed");
}
}
private void registerCommandsV1() { private void registerCommandsV1() {
try { try {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion"))); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(command("viaversion")));
@ -122,7 +91,7 @@ public class ViaFabric implements ModInitializer {
ClientCommandManager.DISPATCHER.register(command("viafabricclient")); ClientCommandManager.DISPATCHER.register(command("viafabricclient"));
} }
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed"); JLOGGER.info("Couldn't register command as Fabric Commands V1 isn't installed");
} }
} }
} }

View File

@ -0,0 +1,39 @@
package com.viaversion.fabric.mc117;
import com.viaversion.fabric.mc117.gui.ViaConfigScreen;
import com.viaversion.fabric.mc117.mixin.gui.client.ScreenAccessor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
public class ViaFabricClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
registerGui();
}
private void registerGui() {
try {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof MultiplayerScreen)) return;
ButtonWidget enableClientSideViaVersion = new TexturedButtonWidget(scaledWidth / 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(screen)),
new TranslatableText("gui.via_button"));
if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false;
((ScreenAccessor) screen).callAddDrawableChild(enableClientSideViaVersion);
});
} catch (NoClassDefFoundError ignored) {
ViaFabric.JLOGGER.info("Couldn't register screen handler as Fabric Screen isn't installed");
}
}
}

View File

@ -1,5 +1,6 @@
package com.viaversion.fabric.mc117.commands; package com.viaversion.fabric.mc117.commands;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc117.platform.FabricPlatform; import com.viaversion.fabric.mc117.platform.FabricPlatform;
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
@ -26,9 +27,9 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {
((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s)), false); ((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} else if (source instanceof FabricClientCommandSource) { } else if (source instanceof FabricClientCommandSource) {
((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s))); ((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
} }
} }

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc117.gui;
import com.viaversion.fabric.mc117.ViaFabric; import com.viaversion.fabric.mc117.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -3,14 +3,12 @@ package com.viaversion.fabric.mc117.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc117.ViaFabric; import com.viaversion.fabric.mc117.ViaFabric;
import com.viaversion.fabric.mc117.commands.NMSCommandSender; import com.viaversion.fabric.mc117.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -21,9 +19,8 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
@ -40,23 +37,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftClient.getInstance().getServer(); return MinecraftClient.getInstance().getServer();
} }
public static String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@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 @Override
public FutureTaskId runSync(Runnable runnable) { public FutureTaskId runSync(Runnable runnable) {
if (getServer() != null) { if (getServer() != null) {
@ -71,42 +51,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer())); return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer()));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -137,7 +81,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendMessage(Text.Serializer.fromJson( player.sendMessage(Text.Serializer.fromJson(
legacyToJson(s) RemappingUtil.legacyToJson(s)
), false); ), false);
}); });
} }
@ -153,7 +97,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
Supplier<Boolean> kickTask = () -> { Supplier<Boolean> kickTask = () -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return false; if (player == null) return false;
player.networkHandler.disconnect(Text.Serializer.fromJson(legacyToJson(s))); player.networkHandler.disconnect(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
return true; return true;
}; };
if (server.isOnThread()) { if (server.isOnThread()) {
@ -164,4 +108,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
} }
return false; // Can't know if it worked return false; // Can't know if it worked
} }
@Override
protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
}
@Override
protected EventLoop eventLoop() {
return ViaFabric.EVENT_LOOP;
}
} }

View File

@ -1,29 +1,29 @@
package com.viaversion.fabric.mc117.providers; package com.viaversion.fabric.mc117.providers;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc117.ViaFabric; import com.viaversion.fabric.mc117.ViaFabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.DataItem; import com.viaversion.viaversion.api.minecraft.item.DataItem;
import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider; import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -48,15 +48,7 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient()); ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient());
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
try { ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
WorldTickCallback.EVENT.register(world -> {
if (world.isClient) {
tickClient();
}
});
} catch (NoClassDefFoundError ignored2) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V0/V1 isn't installed");
}
} }
} }
@ -64,11 +56,6 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ServerTickEvents.END_WORLD_TICK.register(this::tickServer); ServerTickEvents.END_WORLD_TICK.register(this::tickServer);
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
WorldTickCallback.EVENT.register(world -> {
if (!world.isClient) {
tickServer(world);
}
});
} }
} }
@ -87,25 +74,7 @@ public class VRHandItemProvider extends HandItemProvider {
private Item fromNative(ItemStack original) { private Item fromNative(ItemStack original) {
Identifier iid = Registry.ITEM.getId(original.getItem()); Identifier iid = Registry.ITEM.getId(original.getItem());
if (iid == null) return new DataItem(0, (byte) 0, (short) 0, null); int id = RemappingUtil.swordId(iid.toString());
int id = swordId(iid.toString());
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null); return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();

View File

@ -31,6 +31,9 @@
"main": [ "main": [
"com.viaversion.fabric.mc117.ViaFabric" "com.viaversion.fabric.mc117.ViaFabric"
], ],
"client": [
"com.viaversion.fabric.mc117.ViaFabricClient"
],
"modmenu": [ "modmenu": [
"com.viaversion.fabric.mc117.gui.ModMenuConfig" "com.viaversion.fabric.mc117.gui.ModMenuConfig"
] ]

View File

@ -10,8 +10,6 @@ import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol; import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.viaversion.fabric.mc118.commands.VRCommandHandler; import com.viaversion.fabric.mc118.commands.VRCommandHandler;
import com.viaversion.fabric.mc118.gui.ViaConfigScreen;
import com.viaversion.fabric.mc118.mixin.gui.client.ScreenAccessor;
import com.viaversion.fabric.mc118.platform.FabricPlatform; import com.viaversion.fabric.mc118.platform.FabricPlatform;
import com.viaversion.fabric.mc118.platform.VFLoader; import com.viaversion.fabric.mc118.platform.VFLoader;
import com.viaversion.viaversion.ViaManagerImpl; import com.viaversion.viaversion.ViaManagerImpl;
@ -23,16 +21,9 @@ import io.netty.channel.EventLoop;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -45,7 +36,7 @@ public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -84,7 +75,6 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
registerCommandsV1(); registerCommandsV1();
registerGui();
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -92,26 +82,6 @@ public class ViaFabric implements ModInitializer {
INIT_FUTURE.complete(null); INIT_FUTURE.complete(null);
} }
private void registerGui() {
if (FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT) return;
try {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof MultiplayerScreen)) return;
ButtonWidget enableClientSideViaVersion = new TexturedButtonWidget(scaledWidth / 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(screen)),
new TranslatableText("gui.via_button"));
if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false;
((ScreenAccessor) screen).callAddDrawableChild(enableClientSideViaVersion);
});
} catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register screen handler as Fabric Screen isn't installed");
}
}
private void registerCommandsV1() { private void registerCommandsV1() {
try { try {
@ -122,7 +92,7 @@ public class ViaFabric implements ModInitializer {
ClientCommandManager.DISPATCHER.register(command("viafabricclient")); ClientCommandManager.DISPATCHER.register(command("viafabricclient"));
} }
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed"); JLOGGER.info("Couldn't register command as Fabric Commands V1 isn't installed");
} }
} }
} }

View File

@ -0,0 +1,39 @@
package com.viaversion.fabric.mc118;
import com.viaversion.fabric.mc118.gui.ViaConfigScreen;
import com.viaversion.fabric.mc118.mixin.gui.client.ScreenAccessor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
public class ViaFabricClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
registerGui();
}
private void registerGui() {
try {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof MultiplayerScreen)) return;
ButtonWidget enableClientSideViaVersion = new TexturedButtonWidget(scaledWidth / 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(screen)),
new TranslatableText("gui.via_button"));
if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false;
((ScreenAccessor) screen).callAddDrawableChild(enableClientSideViaVersion);
});
} catch (NoClassDefFoundError ignored) {
ViaFabric.JLOGGER.info("Couldn't register screen handler as Fabric Screen isn't installed");
}
}
}

View File

@ -1,5 +1,6 @@
package com.viaversion.fabric.mc118.commands; package com.viaversion.fabric.mc118.commands;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc118.platform.FabricPlatform; import com.viaversion.fabric.mc118.platform.FabricPlatform;
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
@ -26,9 +27,9 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
if (source instanceof ServerCommandSource) { if (source instanceof ServerCommandSource) {
((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s)), false); ((ServerCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)), false);
} else if (source instanceof FabricClientCommandSource) { } else if (source instanceof FabricClientCommandSource) {
((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(FabricPlatform.legacyToJson(s))); ((FabricClientCommandSource) source).sendFeedback(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
} }
} }

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc118.gui;
import com.viaversion.fabric.mc118.ViaFabric; import com.viaversion.fabric.mc118.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -3,14 +3,12 @@ package com.viaversion.fabric.mc118.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc118.ViaFabric; import com.viaversion.fabric.mc118.ViaFabric;
import com.viaversion.fabric.mc118.commands.NMSCommandSender; import com.viaversion.fabric.mc118.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -21,9 +19,8 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
@ -40,23 +37,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftClient.getInstance().getServer(); return MinecraftClient.getInstance().getServer();
} }
public static String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
}
@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 @Override
public FutureTaskId runSync(Runnable runnable) { public FutureTaskId runSync(Runnable runnable) {
if (getServer() != null) { if (getServer() != null) {
@ -71,42 +51,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer())); return new FutureTaskId(CompletableFuture.runAsync(runnable, getServer()));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -137,7 +81,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendMessage(Text.Serializer.fromJson( player.sendMessage(Text.Serializer.fromJson(
legacyToJson(s) RemappingUtil.legacyToJson(s)
), false); ), false);
}); });
} }
@ -153,7 +97,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
Supplier<Boolean> kickTask = () -> { Supplier<Boolean> kickTask = () -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return false; if (player == null) return false;
player.networkHandler.disconnect(Text.Serializer.fromJson(legacyToJson(s))); player.networkHandler.disconnect(Text.Serializer.fromJson(RemappingUtil.legacyToJson(s)));
return true; return true;
}; };
if (server.isOnThread()) { if (server.isOnThread()) {
@ -164,4 +108,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
} }
return false; // Can't know if it worked return false; // Can't know if it worked
} }
@Override
protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
}
@Override
protected EventLoop eventLoop() {
return ViaFabric.EVENT_LOOP;
}
} }

View File

@ -1,21 +1,21 @@
package com.viaversion.fabric.mc118.providers; package com.viaversion.fabric.mc118.providers;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc118.ViaFabric; import com.viaversion.fabric.mc118.ViaFabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.DataItem; import com.viaversion.viaversion.api.minecraft.item.DataItem;
import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider; import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -23,7 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>(); public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -48,15 +48,7 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient()); ClientTickEvents.END_WORLD_TICK.register(clientWorld -> tickClient());
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
try { ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
WorldTickCallback.EVENT.register(world -> {
if (world.isClient) {
tickClient();
}
});
} catch (NoClassDefFoundError ignored2) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V0/V1 isn't installed");
}
} }
} }
@ -64,11 +56,6 @@ public class VRHandItemProvider extends HandItemProvider {
try { try {
ServerTickEvents.END_WORLD_TICK.register(this::tickServer); ServerTickEvents.END_WORLD_TICK.register(this::tickServer);
} catch (NoClassDefFoundError ignored) { } catch (NoClassDefFoundError ignored) {
WorldTickCallback.EVENT.register(world -> {
if (!world.isClient) {
tickServer(world);
}
});
} }
} }
@ -87,25 +74,7 @@ public class VRHandItemProvider extends HandItemProvider {
private Item fromNative(ItemStack original) { private Item fromNative(ItemStack original) {
Identifier iid = Registry.ITEM.getId(original.getItem()); Identifier iid = Registry.ITEM.getId(original.getItem());
if (iid == null) return new DataItem(0, (byte) 0, (short) 0, null); int id = RemappingUtil.swordId(iid.toString());
int id = swordId(iid.toString());
return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null); return new DataItem(id, (byte) original.getCount(), (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();

View File

@ -31,6 +31,9 @@
"main": [ "main": [
"com.viaversion.fabric.mc118.ViaFabric" "com.viaversion.fabric.mc118.ViaFabric"
], ],
"client": [
"com.viaversion.fabric.mc118.ViaFabricClient"
],
"modmenu": [ "modmenu": [
"com.viaversion.fabric.mc118.gui.ModMenuConfig" "com.viaversion.fabric.mc118.gui.ModMenuConfig"
] ]

View File

@ -1,24 +1,25 @@
package com.viaversion.fabric.mc18; package com.viaversion.fabric.mc18;
import com.viaversion.fabric.common.platform.FabricInjector;
import com.viaversion.fabric.mc18.commands.NMSCommandImpl;
import com.viaversion.fabric.mc18.commands.VRCommandHandler;
import com.viaversion.fabric.common.config.VFConfig;
import com.viaversion.fabric.mc18.platform.VFLoader;
import com.viaversion.fabric.mc18.platform.FabricPlatform;
import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import com.viaversion.fabric.common.util.JLoggerToLog4j;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.netty.channel.EventLoop; import com.viaversion.fabric.common.config.VFConfig;
import io.netty.channel.local.LocalEventLoopGroup; import com.viaversion.fabric.common.platform.FabricInjector;
import net.fabricmc.api.ModInitializer; import com.viaversion.fabric.common.protocol.HostnameParserProtocol;
import net.fabricmc.loader.api.FabricLoader; import com.viaversion.fabric.common.util.JLoggerToLog4j;
import org.apache.logging.log4j.LogManager; import com.viaversion.fabric.mc18.commands.NMSCommandImpl;
import com.viaversion.fabric.mc18.commands.VRCommandHandler;
import com.viaversion.fabric.mc18.platform.FabricPlatform;
import com.viaversion.fabric.mc18.platform.VFLoader;
import com.viaversion.viaversion.ViaManagerImpl; import com.viaversion.viaversion.ViaManagerImpl;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.MappingDataLoader; import com.viaversion.viaversion.api.data.MappingDataLoader;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; 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.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -26,13 +27,11 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.legacyfabric.fabric.api.registry.CommandRegistry;
public class ViaFabric implements ModInitializer { public class ViaFabric implements ModInitializer {
public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric")); public static final Logger JLOGGER = new JLoggerToLog4j(LogManager.getLogger("ViaFabric"));
public static final ExecutorService ASYNC_EXECUTOR; public static final ExecutorService ASYNC_EXECUTOR;
public static final EventLoop EVENT_LOOP; public static final EventLoop EVENT_LOOP;
public static CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>(); public static final CompletableFuture<Void> INIT_FUTURE = new CompletableFuture<>();
public static VFConfig config; public static VFConfig config;
static { static {
@ -59,11 +58,7 @@ public class ViaFabric implements ModInitializer {
FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run); FabricLoader.getInstance().getEntrypoints("viafabric:via_api_initialized", Runnable.class).forEach(Runnable::run);
try { registerCommandsV0();
registerCommandsV0();
} catch (NoClassDefFoundError ignored2) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
}
config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric") config = new VFConfig(FabricLoader.getInstance().getConfigDir().resolve("ViaFabric")
.resolve("viafabric.yml").toFile()); .resolve("viafabric.yml").toFile());
@ -71,8 +66,11 @@ public class ViaFabric implements ModInitializer {
INIT_FUTURE.complete(null); INIT_FUTURE.complete(null);
} }
@SuppressWarnings("deprecation")
private void registerCommandsV0() { private void registerCommandsV0() {
CommandRegistry.INSTANCE.register(new NMSCommandImpl(Via.getManager().getCommandHandler())); try {
CommandRegistry.INSTANCE.register(new NMSCommandImpl(Via.getManager().getCommandHandler()));
} catch (NoClassDefFoundError ignored2) {
JLOGGER.info("Couldn't register command as Fabric Commands isn't installed");
}
} }
} }

View File

@ -9,7 +9,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
public class NMSCommandImpl extends AbstractCommand { public class NMSCommandImpl extends AbstractCommand {
private ViaVersionCommand handler; private final ViaVersionCommand handler;
public NMSCommandImpl(ViaVersionCommand handler) { public NMSCommandImpl(ViaVersionCommand handler) {
this.handler = handler; this.handler = handler;

View File

@ -1,11 +1,10 @@
package com.viaversion.fabric.mc18.commands; package com.viaversion.fabric.mc18.commands;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.viaversion.api.command.ViaCommandSender;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.util.UUID; import java.util.UUID;
@ -24,11 +23,7 @@ public class NMSCommandSender implements ViaCommandSender {
@Override @Override
public void sendMessage(String s) { public void sendMessage(String s) {
source.sendMessage(Text.Serializer.deserialize(legacyToJson(s))); source.sendMessage(Text.Serializer.deserialize(RemappingUtil.legacyToJson(s)));
}
private String legacyToJson(String legacy) {
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy));
} }
@Override @Override

View File

@ -5,7 +5,7 @@ import net.minecraft.client.gui.widget.PagedEntryListWidget;
import java.util.function.Consumer; import java.util.function.Consumer;
public class ChangedListener implements PagedEntryListWidget.Listener { public class ChangedListener implements PagedEntryListWidget.Listener {
private Consumer<String> consumer; private final Consumer<String> consumer;
public ChangedListener(Consumer<String> consumer) { public ChangedListener(Consumer<String> consumer) {
this.consumer = consumer; this.consumer = consumer;

View File

@ -5,12 +5,7 @@ import net.minecraft.client.gui.widget.ButtonWidget;
import java.util.function.Consumer; import java.util.function.Consumer;
public class ListeneableButton extends ButtonWidget { public class ListeneableButton extends ButtonWidget {
private Consumer<ButtonWidget> click; private final Consumer<ButtonWidget> click;
public ListeneableButton(int id, int x, int y, String message, Consumer<ButtonWidget> click) {
super(id, x, y, message);
this.click = click;
}
public ListeneableButton(int id, int x, int y, int width, int height, String message, 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); super(id, x, y, width, height, message);

View File

@ -10,11 +10,11 @@ import java.util.function.Consumer;
public class ViaButton extends ButtonWidget { public class ViaButton extends ButtonWidget {
// Meant to be similar to higher versions TexturedButtonWidget // Meant to be similar to higher versions TexturedButtonWidget
private int startU; private final int startU;
private int startV; private final int startV;
private int offsetHoverV; private final int offsetHoverV;
private Identifier texturePath; private final Identifier texturePath;
private Consumer<ViaButton> onClick; 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, 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) { int textureSizeX, int textureSizeY, Consumer<ViaButton> onClick, String altTxt) {
@ -34,12 +34,11 @@ public class ViaButton extends ButtonWidget {
client.getTextureManager().bindTexture(texturePath); client.getTextureManager().bindTexture(texturePath);
GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.color4f(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; boolean hover = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
int u = startU;
int v = startV; int v = startV;
if (hover) { if (hover) {
v += offsetHoverV; v += offsetHoverV;
} }
this.drawTexture(this.x, this.y, u, v, this.width, this.height); this.drawTexture(this.x, this.y, startU, v, this.width, this.height);
} }
} }

View File

@ -2,7 +2,6 @@ package com.viaversion.fabric.mc18.gui;
import com.viaversion.fabric.mc18.ViaFabric; import com.viaversion.fabric.mc18.ViaFabric;
import com.viaversion.fabric.common.util.ProtocolUtils; import com.viaversion.fabric.common.util.ProtocolUtils;
import com.viaversion.viaversion.api.Via;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -20,7 +19,7 @@ public class ViaConfigScreen extends Screen {
private static CompletableFuture<Void> latestProtocolSave; private static CompletableFuture<Void> latestProtocolSave;
private final Screen parent; private final Screen parent;
private TextFieldWidget protocolVersion; private TextFieldWidget protocolVersion;
private Text title; private final Text title;
public ViaConfigScreen(Screen parent) { public ViaConfigScreen(Screen parent) {
super(); super();
@ -91,10 +90,6 @@ public class ViaConfigScreen extends Screen {
validProtocol = true; validProtocol = true;
} else { } else {
validProtocol = false; validProtocol = false;
String[] suggestions = ProtocolUtils.getProtocolSuggestions(text);
if (suggestions.length == 1) {
//protocolVersion.setSuggestion(suggestions[0].substring(text.length()));
}
} }
protocolVersion.setEditableColor( protocolVersion.setEditableColor(
@ -137,11 +132,6 @@ public class ViaConfigScreen extends Screen {
ViaFabric.config.saveConfig(); ViaFabric.config.saveConfig();
} }
//@Override
//public void onClose() {
// MinecraftClient.getInstance().openScreen(this.parent);
//}
private TranslatableText getClientSideText() { private TranslatableText getClientSideText() {
return ViaFabric.config.isClientSideEnabled() ? return ViaFabric.config.isClientSideEnabled() ?
new TranslatableText("gui.client_side.disable") new TranslatableText("gui.client_side.disable")

View File

@ -21,7 +21,7 @@ public class MixinDebugHud {
protected void getLeftText(CallbackInfoReturnable<List<String>> info) { protected void getLeftText(CallbackInfoReturnable<List<String>> info) {
String line = "[ViaFabric] I: " + Via.getManager().getConnectionManager().getConnections().size() + " (F: " String line = "[ViaFabric] I: " + Via.getManager().getConnectionManager().getConnections().size() + " (F: "
+ Via.getManager().getConnectionManager().getConnectedClients().size() + ")"; + Via.getManager().getConnectionManager().getConnectedClients().size() + ")";
@SuppressWarnings("ConstantConditions") ChannelHandler viaDecoder = ((MixinClientConnectionAccessor) MinecraftClient.getInstance().getNetworkHandler() ChannelHandler viaDecoder = ((MixinClientConnectionAccessor) MinecraftClient.getInstance().getNetworkHandler()
.getClientConnection()).getChannel().pipeline().get(CommonTransformer.HANDLER_DECODER_NAME); .getClientConnection()).getChannel().pipeline().get(CommonTransformer.HANDLER_DECODER_NAME);
if (viaDecoder instanceof FabricDecodeHandler) { if (viaDecoder instanceof FabricDecodeHandler) {
ProtocolInfo protocol = ((FabricDecodeHandler) viaDecoder).getInfo().getProtocolInfo(); ProtocolInfo protocol = ((FabricDecodeHandler) viaDecoder).getInfo().getProtocolInfo();

View File

@ -3,14 +3,12 @@ package com.viaversion.fabric.mc18.platform;
import com.viaversion.fabric.common.commands.UserCommandSender; import com.viaversion.fabric.common.commands.UserCommandSender;
import com.viaversion.fabric.common.provider.AbstractFabricPlatform; import com.viaversion.fabric.common.provider.AbstractFabricPlatform;
import com.viaversion.fabric.common.util.FutureTaskId; import com.viaversion.fabric.common.util.FutureTaskId;
import com.viaversion.fabric.common.util.RemappingUtil;
import com.viaversion.fabric.mc18.ViaFabric; import com.viaversion.fabric.mc18.ViaFabric;
import com.viaversion.fabric.mc18.commands.NMSCommandSender; import com.viaversion.fabric.mc18.commands.NMSCommandSender;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaCommandSender;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import io.netty.channel.EventLoop;
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -22,7 +20,7 @@ import java.util.UUID;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutorService;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
@ -34,8 +32,14 @@ public class FabricPlatform extends AbstractFabricPlatform {
return MinecraftServer.getServer(); return MinecraftServer.getServer();
} }
public static String legacyToJson(String legacy) { @Override
return GsonComponentSerializer.gson().serialize(LegacyComponentSerializer.legacySection().deserialize(legacy)); protected ExecutorService asyncService() {
return ViaFabric.ASYNC_EXECUTOR;
}
@Override
protected EventLoop eventLoop() {
return ViaFabric.EVENT_LOOP;
} }
@Override @Override
@ -68,42 +72,6 @@ public class FabricPlatform extends AbstractFabricPlatform {
}))); })));
} }
private FutureTaskId runEventLoop(Runnable runnable) {
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.submit(runnable)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run delayed tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.schedule(() -> runSync(runnable), ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
@Override
public FutureTaskId runRepeatingSync(Runnable runnable, long ticks) {
// ViaVersion seems to not need to run repeating tasks on main thread
return new FutureTaskId(
ViaFabric.EVENT_LOOP
.scheduleAtFixedRate(() -> runSync(runnable), 0, ticks * 50, TimeUnit.MILLISECONDS)
.addListener(errorLogger())
);
}
private <T extends Future<?>> GenericFutureListener<T> errorLogger() {
return future -> {
if (!future.isCancelled() && future.cause() != null) {
future.cause().printStackTrace();
}
};
}
@Override @Override
public ViaCommandSender[] getOnlinePlayers() { public ViaCommandSender[] getOnlinePlayers() {
MinecraftServer server = getServer(); MinecraftServer server = getServer();
@ -132,7 +100,7 @@ public class FabricPlatform extends AbstractFabricPlatform {
runServerSync(() -> { runServerSync(() -> {
ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid);
if (player == null) return; if (player == null) return;
player.sendMessage(Text.Serializer.deserialize(legacyToJson(s))); player.sendMessage(Text.Serializer.deserialize(RemappingUtil.legacyToJson(s)));
}); });
} }

View File

@ -20,7 +20,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider { public class VRHandItemProvider extends HandItemProvider {
public Item clientItem = null; public Item clientItem = null;
public Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>(); public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
@Override @Override
public Item getHandItem(UserConnection info) { public Item getHandItem(UserConnection info) {
@ -75,21 +75,4 @@ public class VRHandItemProvider extends HandItemProvider {
int id = net.minecraft.item.Item.getRawId(original.getItem()); int id = net.minecraft.item.Item.getRawId(original.getItem());
return new DataItem(id, (byte) original.count, (short) original.getDamage(), null); return new DataItem(id, (byte) original.count, (short) original.getDamage(), null);
} }
private int swordId(String id) {
// https://github.com/ViaVersion/ViaVersion/blob/8de26a0ad33f5b739f5394ed80f69d14197fddc7/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java#L86
switch (id) {
case "minecraft:iron_sword":
return 267;
case "minecraft:wooden_sword":
return 268;
case "minecraft:golden_sword":
return 272;
case "minecraft:diamond_sword":
return 276;
case "minecraft:stone_sword":
return 283;
}
return 0;
}
} }

View File

@ -32,7 +32,7 @@ import java.util.logging.Level;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ProtocolAutoDetector { public class ProtocolAutoDetector {
private static LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder() private static final LoadingCache<InetSocketAddress, CompletableFuture<ProtocolVersion>> SERVER_VER = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.build(CacheLoader.from((address) -> { .build(CacheLoader.from((address) -> {
CompletableFuture<ProtocolVersion> future = new CompletableFuture<>(); CompletableFuture<ProtocolVersion> future = new CompletableFuture<>();