diff --git a/src/main/java/ru/bclib/BCLib.java b/src/main/java/ru/bclib/BCLib.java index d3174cae..6eb2634c 100644 --- a/src/main/java/ru/bclib/BCLib.java +++ b/src/main/java/ru/bclib/BCLib.java @@ -6,6 +6,8 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resources.ResourceLocation; import ru.bclib.api.TagAPI; import ru.bclib.api.WorldDataAPI; +import ru.bclib.api.dataexchange.DataExchangeAPI; +import ru.bclib.api.dataexchange.TestHandler; import ru.bclib.config.Configs; import ru.bclib.recipes.CraftingRecipes; import ru.bclib.registry.BaseBlockEntities; @@ -26,6 +28,7 @@ public class BCLib implements ModInitializer { CraftingRecipes.init(); WorldDataAPI.registerModCache(MOD_ID); Configs.save(); + DataExchangeAPI.registerDescriptor(TestHandler.DESCRIPTOR); } public static boolean isDevEnvironment() { diff --git a/src/main/java/ru/bclib/api/dataexchange/Connector.java b/src/main/java/ru/bclib/api/dataexchange/Connector.java index 683c845e..55a046a0 100644 --- a/src/main/java/ru/bclib/api/dataexchange/Connector.java +++ b/src/main/java/ru/bclib/api/dataexchange/Connector.java @@ -1,19 +1,16 @@ package ru.bclib.api.dataexchange; -import java.util.HashSet; import java.util.Set; abstract class Connector { protected final DataExchangeAPI api; - protected final Set descriptors; Connector(DataExchangeAPI api) { this.api = api; - descriptors = new HashSet<>(); } public abstract boolean onClient(); - public void addDescriptor(DataHandlerDescriptor desc){ - this.descriptors.add(desc); + protected Set getDescriptors(){ + return api.descriptors; } } diff --git a/src/main/java/ru/bclib/api/dataexchange/ConnectorClientside.java b/src/main/java/ru/bclib/api/dataexchange/ConnectorClientside.java index aba569a7..2e34765f 100644 --- a/src/main/java/ru/bclib/api/dataexchange/ConnectorClientside.java +++ b/src/main/java/ru/bclib/api/dataexchange/ConnectorClientside.java @@ -28,25 +28,32 @@ class ConnectorClientside extends Connector { BCLib.LOGGER.warning("Client changed!"); } this.client = client; - for(DataHandlerDescriptor desc : descriptors){ - ClientPlayNetworking.registerReceiver(desc.identifier, (_client, _handler, _buf, _responseSender)->{ + for(DataHandlerDescriptor desc : getDescriptors()){ + ClientPlayNetworking.registerReceiver(desc.IDENTIFIER, (_client, _handler, _buf, _responseSender)->{ receiveFromServer(desc, _client, _handler, _buf, _responseSender); }); } } void onPlayReady(ClientPacketListener handler, PacketSender sender, Minecraft client){ - + for(DataHandlerDescriptor desc : getDescriptors()){ + if (desc.sendOnJoin){ + DataHandler h = desc.JOIN_INSTANCE.get(); + if (!h.getOriginatesOnServer()) { + h.sendToServer(client); + } + } + } } void onPlayDisconnect(ClientPacketListener handler, Minecraft client){ - for(DataHandlerDescriptor desc : descriptors) { - ClientPlayNetworking.unregisterReceiver(desc.identifier); + for(DataHandlerDescriptor desc : getDescriptors()) { + ClientPlayNetworking.unregisterReceiver(desc.IDENTIFIER); } } void receiveFromServer(DataHandlerDescriptor desc, Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender){ - DataHandler h = desc.instancer.get(); + DataHandler h = desc.INSTANCE.get(); h.receiveFromServer(client, handler, buf, responseSender); } diff --git a/src/main/java/ru/bclib/api/dataexchange/ConnectorServerside.java b/src/main/java/ru/bclib/api/dataexchange/ConnectorServerside.java index 39ce6253..b5d7e920 100644 --- a/src/main/java/ru/bclib/api/dataexchange/ConnectorServerside.java +++ b/src/main/java/ru/bclib/api/dataexchange/ConnectorServerside.java @@ -1,7 +1,5 @@ package ru.bclib.api.dataexchange; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.network.FriendlyByteBuf; @@ -10,7 +8,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import ru.bclib.BCLib; -@Environment(EnvType.SERVER) class ConnectorServerside extends Connector { private MinecraftServer server; ConnectorServerside(DataExchangeAPI api) { @@ -28,30 +25,32 @@ class ConnectorServerside extends Connector { BCLib.LOGGER.warning("Server changed!"); } this.server = server; - for(DataHandlerDescriptor desc : descriptors){ - ServerPlayNetworking.registerReceiver(handler, desc.identifier, (_server, _player, _handler, _buf, _responseSender) -> { + for(DataHandlerDescriptor desc : getDescriptors()){ + ServerPlayNetworking.registerReceiver(handler, desc.IDENTIFIER, (_server, _player, _handler, _buf, _responseSender) -> { receiveFromClient(desc, _server, _player, _handler, _buf, _responseSender); }); } } void onPlayReady(ServerGamePacketListenerImpl handler, PacketSender sender, MinecraftServer server){ - for(DataHandlerDescriptor desc : descriptors){ + for(DataHandlerDescriptor desc : getDescriptors()){ if (desc.sendOnJoin){ - DataHandler h = desc.instancer.get(); - h.sendToClient(server, handler.player); + DataHandler h = desc.JOIN_INSTANCE.get(); + if (h.getOriginatesOnServer()) { + h.sendToClient(server, handler.player); + } } } } void onPlayDisconnect(ServerGamePacketListenerImpl handler, MinecraftServer server){ - for(DataHandlerDescriptor desc : descriptors){ - ServerPlayNetworking.unregisterReceiver(handler, desc.identifier); + for(DataHandlerDescriptor desc : getDescriptors()){ + ServerPlayNetworking.unregisterReceiver(handler, desc.IDENTIFIER); } } void receiveFromClient(DataHandlerDescriptor desc, MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){ - DataHandler h = desc.instancer.get(); + DataHandler h = desc.INSTANCE.get(); h.receiveFromClient(server, player, handler, buf, responseSender); } diff --git a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java index 1d88fa26..375103b0 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java @@ -5,57 +5,62 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import java.util.HashSet; +import java.util.Set; + public class DataExchangeAPI { private static DataExchangeAPI instance; - private final ConnectorServerside server; - private final ConnectorClientside client; + private ConnectorServerside server; + private ConnectorClientside client; + protected final Set descriptors; + + + private DataExchangeAPI(){ + descriptors = new HashSet<>(); + } public static DataExchangeAPI getInstance(){ - return instance; - } - - private static DataExchangeAPI getOrCreateInstance(boolean isClient){ if (instance==null){ - instance = new DataExchangeAPI(isClient); + instance = new DataExchangeAPI(); } return instance; } - private DataExchangeAPI(boolean isClient){ - if (isClient){ - client = new ConnectorClientside(this); - server = null; - - ClientPlayConnectionEvents.INIT.register(client::onPlayInit); - ClientPlayConnectionEvents.JOIN.register(client::onPlayReady); - ClientPlayConnectionEvents.DISCONNECT.register(client::onPlayDisconnect); - } else { - client = null; - server = new ConnectorServerside(this); - - ServerPlayConnectionEvents.INIT.register(server::onPlayInit); - ServerPlayConnectionEvents.JOIN.register(server::onPlayReady); - ServerPlayConnectionEvents.DISCONNECT.register(server::onPlayDisconnect); - } + @Environment(EnvType.CLIENT) + private void initClientside(){ + if (client!=null) return; + client = new ConnectorClientside(this); + + ClientPlayConnectionEvents.INIT.register(client::onPlayInit); + ClientPlayConnectionEvents.JOIN.register(client::onPlayReady); + ClientPlayConnectionEvents.DISCONNECT.register(client::onPlayDisconnect); + } + + private void initServerSide(){ + if (server!=null) return; + server = new ConnectorServerside(this); + + ServerPlayConnectionEvents.INIT.register(server::onPlayInit); + ServerPlayConnectionEvents.JOIN.register(server::onPlayReady); + ServerPlayConnectionEvents.DISCONNECT.register(server::onPlayDisconnect); + } + + public static void registerDescriptor(DataHandlerDescriptor desc){ + DataExchangeAPI api = DataExchangeAPI.getInstance(); + api.descriptors.add(desc); } @Environment(EnvType.CLIENT) - public static void registerClientsideHandler(DataHandlerDescriptor desc){ - DataExchangeAPI api = DataExchangeAPI.getOrCreateInstance(true); - if (api.client == null){ - throw new RuntimeException("[Internal Error] DataExchangeAPI was already created as a Server"); - } - api.client.addDescriptor(desc); + public static void prepareClientside(){ + DataExchangeAPI api = DataExchangeAPI.getInstance(); + api.initClientside(); + } - @Environment(EnvType.SERVER) - public static void registerServersideHandler(DataHandlerDescriptor desc){ - DataExchangeAPI api = DataExchangeAPI.getOrCreateInstance(false); - if (api.server == null){ - throw new RuntimeException("[Internal Error] DataExchangeAPI was already created as a Client"); - } - api.server.addDescriptor(desc); + public static void prepareServerside(){ + DataExchangeAPI api = DataExchangeAPI.getInstance(); + api.initServerSide(); } public static void send(DataHandler h){ @@ -66,4 +71,5 @@ public class DataExchangeAPI { } } + } diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java index 1200c15c..ece8b021 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java @@ -40,7 +40,6 @@ public abstract class DataHandler { client.execute(() -> runOnClient(client)); } - @Environment(EnvType.SERVER) void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){ deserializeFromIncomingData(buf, responseSender, true); server.execute(() -> runOnServer(server)); @@ -54,7 +53,6 @@ public abstract class DataHandler { } - @Environment(EnvType.SERVER) protected void runOnServer(MinecraftServer server){ } @@ -63,7 +61,6 @@ public abstract class DataHandler { } - @Environment(EnvType.SERVER) void sendToClient(MinecraftServer server){ FriendlyByteBuf buf = PacketByteBufs.create(); serializeData(buf); @@ -73,7 +70,6 @@ public abstract class DataHandler { } } - @Environment(EnvType.SERVER) void sendToClient(MinecraftServer server, ServerPlayer player){ FriendlyByteBuf buf = PacketByteBufs.create(); serializeData(buf); diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java b/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java index 9ca5077f..585a3725 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java @@ -6,15 +6,22 @@ import java.util.function.Supplier; public class DataHandlerDescriptor { public DataHandlerDescriptor(ResourceLocation identifier, Supplier instancer){ - this(identifier, instancer, false); + this(identifier, instancer, instancer, false); } + public DataHandlerDescriptor(ResourceLocation identifier, Supplier instancer, boolean sendOnJoin){ - this.instancer = instancer; - this.identifier = identifier; + this(identifier, instancer, instancer, sendOnJoin); + } + public DataHandlerDescriptor(ResourceLocation identifier, Supplier receiv_instancer, Supplier join_instancer, boolean sendOnJoin){ + this.INSTANCE = receiv_instancer; + this.JOIN_INSTANCE = join_instancer; + this.IDENTIFIER = identifier; + this.sendOnJoin = sendOnJoin; } public final boolean sendOnJoin; - public final ResourceLocation identifier; - public final Supplier instancer; + public final ResourceLocation IDENTIFIER; + public final Supplier INSTANCE; + public final Supplier JOIN_INSTANCE; } diff --git a/src/main/java/ru/bclib/api/dataexchange/TestHandler.java b/src/main/java/ru/bclib/api/dataexchange/TestHandler.java index 27fc621b..d55612ad 100644 --- a/src/main/java/ru/bclib/api/dataexchange/TestHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/TestHandler.java @@ -14,7 +14,7 @@ public class TestHandler extends DataHandler{ public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "__test"), TestHandler::new, true); public TestHandler() { - super(DESCRIPTOR.identifier, true); + super(DESCRIPTOR.IDENTIFIER, true); } @Override diff --git a/src/main/java/ru/bclib/client/BCLibClient.java b/src/main/java/ru/bclib/client/BCLibClient.java index 27bd5f66..ff803130 100644 --- a/src/main/java/ru/bclib/client/BCLibClient.java +++ b/src/main/java/ru/bclib/client/BCLibClient.java @@ -4,7 +4,6 @@ import net.fabricmc.api.ClientModInitializer; import ru.bclib.api.ModIntegrationAPI; import ru.bclib.api.PostInitAPI; import ru.bclib.api.dataexchange.DataExchangeAPI; -import ru.bclib.api.dataexchange.TestHandler; import ru.bclib.registry.BaseBlockEntityRenders; public class BCLibClient implements ClientModInitializer { @@ -12,7 +11,7 @@ public class BCLibClient implements ClientModInitializer { public void onInitializeClient() { ModIntegrationAPI.registerAll(); BaseBlockEntityRenders.register(); - DataExchangeAPI.registerClientsideHandler(TestHandler.DESCRIPTOR); + DataExchangeAPI.prepareClientside(); PostInitAPI.postInit(true); } diff --git a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java index 0fea24a6..203da109 100644 --- a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java @@ -1,12 +1,20 @@ package ru.bclib.mixin.common; +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.datafixers.DataFixer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.RegistryAccess.RegistryHolder; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerResources; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListenerFactory; +import net.minecraft.server.packs.repository.PackRepository; +import net.minecraft.server.players.GameProfileCache; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.WorldData; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,8 +24,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.BiomeAPI; +import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.recipes.BCLRecipeManager; +import java.net.Proxy; import java.util.Collection; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -34,7 +44,10 @@ public class MinecraftServerMixin { @Final @Shadow protected WorldData worldData; - + @Inject(method = "*", at = @At("TAIL")) + private void bclib_onServerInit(Thread thread, RegistryHolder registryHolder, LevelStorageAccess levelStorageAccess, WorldData worldData, PackRepository packRepository, Proxy proxy, DataFixer dataFixer, ServerResources serverResources, MinecraftSessionService minecraftSessionService, GameProfileRepository gameProfileRepository, GameProfileCache gameProfileCache, ChunkProgressListenerFactory chunkProgressListenerFactory, CallbackInfo ci){ + DataExchangeAPI.prepareServerside(); + } @Inject(method="convertFromRegionFormatIfNeeded", at = @At("HEAD")) private static void bclib_applyPatches(LevelStorageSource.LevelStorageAccess session, CallbackInfo ci){ diff --git a/src/main/java/ru/bclib/server/BCLibServer.java b/src/main/java/ru/bclib/server/BCLibServer.java index 9568a169..d4011c97 100644 --- a/src/main/java/ru/bclib/server/BCLibServer.java +++ b/src/main/java/ru/bclib/server/BCLibServer.java @@ -9,7 +9,7 @@ public class BCLibServer implements DedicatedServerModInitializer { @Override public void onInitializeServer() { ModIntegrationAPI.registerAll(); - DataExchangeAPI.registerServersideHandler(TestHandler.DESCRIPTOR); + DataExchangeAPI.prepareServerside(); PostInitAPI.postInit(false); }