This commit is contained in:
modmuss
2023-08-07 09:09:38 +01:00
committed by GitHub
parent f4b7e42468
commit 86b12645b9
104 changed files with 2489 additions and 1188 deletions

View File

@@ -22,10 +22,11 @@ import org.slf4j.LoggerFactory;
import net.minecraft.text.Text;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking;
import net.fabricmc.fabric.impl.registry.sync.RegistrySyncManager;
import net.fabricmc.fabric.impl.registry.sync.RemapException;
import net.fabricmc.fabric.impl.registry.sync.packet.RegistryPacketHandler;
import net.fabricmc.fabric.mixin.networking.client.accessor.ClientCommonNetworkHandlerAccessor;
public class FabricRegistryClientInit implements ClientModInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger(FabricRegistryClientInit.class);
@@ -36,10 +37,10 @@ public class FabricRegistryClientInit implements ClientModInitializer {
}
private void registerSyncPacketReceiver(RegistryPacketHandler packetHandler) {
ClientPlayNetworking.registerGlobalReceiver(packetHandler.getPacketId(), (client, handler, buf, responseSender) ->
ClientConfigurationNetworking.registerGlobalReceiver(packetHandler.getPacketId(), (client, handler, buf, responseSender) ->
RegistrySyncManager.receivePacket(client, packetHandler, buf, RegistrySyncManager.DEBUG || !client.isInSingleplayer(), (e) -> {
LOGGER.error("Registry remapping failed!", e);
client.execute(() -> handler.getConnection().disconnect(getText(e)));
client.execute(() -> ((ClientCommonNetworkHandlerAccessor) handler).getConnection().disconnect(getText(e)));
}));
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.registry.sync;
import java.util.function.Consumer;
import com.mojang.authlib.GameProfile;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.Packet;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking;
public record ConfiguringServerPlayer(GameProfile gameProfile, Consumer<Packet<?>> sender) {
public void sendPacket(Identifier identifier, PacketByteBuf buf) {
sender.accept(ServerConfigurationNetworking.createS2CPacket(identifier, buf));
}
}

View File

@@ -21,13 +21,12 @@ import net.minecraft.registry.Registries;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.registry.RegistryAttribute;
import net.fabricmc.fabric.api.event.registry.RegistryAttributeHolder;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationConnectionEvents;
public class FabricRegistryInit implements ModInitializer {
@Override
public void onInitialize() {
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) ->
RegistrySyncManager.sendPacket(server, handler.player));
ServerConfigurationConnectionEvents.SEND.register(RegistrySyncManager::configureClient);
// Synced in PlaySoundS2CPacket.
RegistryAttributeHolder.get(Registries.SOUND_EVENT)

View File

@@ -49,7 +49,7 @@ import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.network.ServerConfigurationNetworkHandler;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
@@ -74,15 +74,19 @@ public final class RegistrySyncManager {
private RegistrySyncManager() { }
public static void sendPacket(MinecraftServer server, ServerPlayerEntity player) {
if (!DEBUG && server.isHost(player.getGameProfile())) {
public static void configureClient(ServerConfigurationNetworkHandler handler, MinecraftServer server) {
sendPacket(server, new ConfiguringServerPlayer(handler.getDebugProfile(), handler::sendPacket));
}
static void sendPacket(MinecraftServer server, ConfiguringServerPlayer player) {
if (!DEBUG && server.isHost(player.gameProfile())) {
return;
}
sendPacket(player, DIRECT_PACKET_HANDLER);
}
private static void sendPacket(ServerPlayerEntity player, RegistryPacketHandler handler) {
private static void sendPacket(ConfiguringServerPlayer player, RegistryPacketHandler handler) {
Map<Identifier, Object2IntMap<Identifier>> map = RegistrySyncManager.createAndPopulateRegistryMap(true, null);
if (map != null) {

View File

@@ -30,10 +30,10 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
import org.jetbrains.annotations.Nullable;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.impl.registry.sync.ConfiguringServerPlayer;
/**
* A more optimized method to sync registry ids to client.
@@ -73,7 +73,7 @@ public class DirectRegistryPacketHandler extends RegistryPacketHandler {
}
@Override
public void sendPacket(ServerPlayerEntity player, Map<Identifier, Object2IntMap<Identifier>> registryMap) {
public void sendPacket(ConfiguringServerPlayer player, Map<Identifier, Object2IntMap<Identifier>> registryMap) {
PacketByteBuf buf = PacketByteBufs.create();
// Group registry ids with same namespace.

View File

@@ -24,11 +24,10 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
import org.jetbrains.annotations.Nullable;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.fabric.impl.registry.sync.ConfiguringServerPlayer;
import net.fabricmc.fabric.impl.registry.sync.RegistrySyncManager;
public abstract class RegistryPacketHandler {
@@ -37,7 +36,7 @@ public abstract class RegistryPacketHandler {
public abstract Identifier getPacketId();
public abstract void sendPacket(ServerPlayerEntity player, Map<Identifier, Object2IntMap<Identifier>> registryMap);
public abstract void sendPacket(ConfiguringServerPlayer player, Map<Identifier, Object2IntMap<Identifier>> registryMap);
public abstract void receivePacket(PacketByteBuf buf);
@@ -48,8 +47,8 @@ public abstract class RegistryPacketHandler {
@Nullable
public abstract Map<Identifier, Object2IntMap<Identifier>> getSyncedRegistryMap();
protected final void sendPacket(ServerPlayerEntity player, PacketByteBuf buf) {
ServerPlayNetworking.send(player, getPacketId(), buf);
protected final void sendPacket(ConfiguringServerPlayer player, PacketByteBuf buf) {
player.sendPacket(getPacketId(), buf);
}
protected final void computeBufSize(PacketByteBuf buf) {

View File

@@ -74,13 +74,14 @@ public final class DynamicRegistryClientTest implements ClientModInitializer {
throw new AssertionError("Entries in " + TEST_SYNCED_2_DYNAMIC_REGISTRY_KEY + " should use network codec");
}
if (simpleNested == null) {
didNotReceive(TEST_NESTED_DYNAMIC_REGISTRY_KEY, SYNCED_ID);
}
// TODO 1.20.2
//if (simpleNested == null) {
// didNotReceive(TEST_NESTED_DYNAMIC_REGISTRY_KEY, SYNCED_ID);
//}
if (simpleNested.nested().value() != synced1) {
throw new AssertionError("Did not match up synced nested entry to the other synced value");
}
//if (simpleNested.nested().value() != synced1) {
// throw new AssertionError("Did not match up synced nested entry to the other synced value");
//}
// If the registries weren't passed through in SP, check that the empty registry was skipped.
if (client.getServer() == null && handler.getRegistryManager().getOptional(TEST_EMPTY_SYNCED_DYNAMIC_REGISTRY_KEY).isPresent()) {