better naming for client/server only handlers

This commit is contained in:
Frank 2021-08-17 12:56:37 +02:00
parent 29fe59b4b9
commit 55f00c664c
11 changed files with 341 additions and 130 deletions

View file

@ -0,0 +1,98 @@
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.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.jetbrains.annotations.NotNull;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public abstract class BaseDataHandler {
private final boolean originatesOnServer;
@NotNull
private final ResourceLocation identifier;
protected BaseDataHandler(ResourceLocation identifier, boolean originatesOnServer) {
this.originatesOnServer = originatesOnServer;
this.identifier = identifier;
}
final public boolean getOriginatesOnServer() {
return originatesOnServer;
}
final public ResourceLocation getIdentifier() {
return identifier;
}
@Environment(EnvType.CLIENT)
abstract void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender);
private ServerPlayer lastMessageSender;
void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) {
lastMessageSender = player;
}
final protected boolean reply(BaseDataHandler message, MinecraftServer server) {
if (lastMessageSender == null) return false;
message.sendToClient(server, lastMessageSender);
return true;
}
abstract void sendToClient(MinecraftServer server);
abstract void sendToClient(MinecraftServer server, ServerPlayer player);
@Environment(EnvType.CLIENT)
abstract void sendToServer(Minecraft client);
@Override
public String toString() {
return "BasDataHandler{" + "originatesOnServer=" + originatesOnServer + ", identifier=" + identifier + '}';
}
/**
* Write a String to a buffer (Convenience Method)
*
* @param buf The buffer to write to
* @param s The String you want to write
*/
public static void writeString(FriendlyByteBuf buf, String s) {
buf.writeByteArray(s.getBytes(StandardCharsets.UTF_8));
}
/**
* Read a string from a buffer (Convenience Method)
*
* @param buf Thea buffer to read from
* @return The received String
*/
public static String readString(FriendlyByteBuf buf) {
byte[] data = buf.readByteArray();
return new String(data, StandardCharsets.UTF_8);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BaseDataHandler)) return false;
BaseDataHandler that = (BaseDataHandler) o;
return originatesOnServer == that.originatesOnServer && identifier.equals(that.identifier);
}
@Override
public int hashCode() {
return Objects.hash(originatesOnServer, identifier);
}
}

View file

@ -42,7 +42,7 @@ public class ConnectorClientside extends Connector {
public void onPlayReady(ClientPacketListener handler, PacketSender sender, Minecraft client){ public void onPlayReady(ClientPacketListener handler, PacketSender sender, Minecraft client){
for(DataHandlerDescriptor desc : getDescriptors()){ for(DataHandlerDescriptor desc : getDescriptors()){
if (desc.sendOnJoin){ if (desc.sendOnJoin){
DataHandler h = desc.JOIN_INSTANCE.get(); BaseDataHandler h = desc.JOIN_INSTANCE.get();
if (!h.getOriginatesOnServer()) { if (!h.getOriginatesOnServer()) {
h.sendToServer(client); h.sendToServer(client);
} }
@ -57,11 +57,11 @@ public class ConnectorClientside extends Connector {
} }
void receiveFromServer(DataHandlerDescriptor desc, Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender){ void receiveFromServer(DataHandlerDescriptor desc, Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender){
DataHandler h = desc.INSTANCE.get(); BaseDataHandler h = desc.INSTANCE.get();
h.receiveFromServer(client, handler, buf, responseSender); h.receiveFromServer(client, handler, buf, responseSender);
} }
public void sendToServer(DataHandler h){ public void sendToServer(BaseDataHandler h){
if (client==null){ if (client==null){
throw new RuntimeException("[internal error] Client not initialized yet!"); throw new RuntimeException("[internal error] Client not initialized yet!");
} }

View file

@ -39,7 +39,7 @@ public class ConnectorServerside extends Connector {
public void onPlayReady(ServerGamePacketListenerImpl handler, PacketSender sender, MinecraftServer server){ public void onPlayReady(ServerGamePacketListenerImpl handler, PacketSender sender, MinecraftServer server){
for(DataHandlerDescriptor desc : getDescriptors()){ for(DataHandlerDescriptor desc : getDescriptors()){
if (desc.sendOnJoin){ if (desc.sendOnJoin){
DataHandler h = desc.JOIN_INSTANCE.get(); BaseDataHandler h = desc.JOIN_INSTANCE.get();
if (h.getOriginatesOnServer()) { if (h.getOriginatesOnServer()) {
h.sendToClient(server, handler.player); h.sendToClient(server, handler.player);
} }
@ -54,11 +54,11 @@ public class ConnectorServerside extends Connector {
} }
void receiveFromClient(DataHandlerDescriptor desc, MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){ void receiveFromClient(DataHandlerDescriptor desc, MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){
DataHandler h = desc.INSTANCE.get(); BaseDataHandler h = desc.INSTANCE.get();
h.receiveFromClient(server, player, handler, buf, responseSender); h.receiveFromClient(server, player, handler, buf, responseSender);
} }
public void sendToClient(DataHandler h){ public void sendToClient(BaseDataHandler h){
if (server==null){ if (server==null){
throw new RuntimeException("[internal error] Server not initialized yet!"); throw new RuntimeException("[internal error] Server not initialized yet!");
} }

View file

@ -42,6 +42,15 @@ public class DataExchangeAPI extends DataExchange {
if (!MODS.contains(modID)) MODS.add(modID); if (!MODS.contains(modID)) MODS.add(modID);
} }
/**
* Register a mod dependency to participate in the DataExchange.
*
* @param modID - {@link String} modID.
*/
public static void registerModDependency(String modID) {
registerMod(modID);
}
/** /**
* Returns the IDs of all registered Mods. * Returns the IDs of all registered Mods.
* *
@ -79,12 +88,12 @@ public class DataExchangeAPI extends DataExchange {
* Depending on what the result of {@link DataHandler#getOriginatesOnServer()}, the Data is sent from the server * Depending on what the result of {@link DataHandler#getOriginatesOnServer()}, the Data is sent from the server
* to the client (if {@code true}) or the other way around. * to the client (if {@code true}) or the other way around.
* <p> * <p>
* The method {@link DataHandler#serializeData(FriendlyByteBuf)} is called just before the data is sent. You should * The method {@link DataHandler#serializeData(FriendlyByteBuf, boolean)} is called just before the data is sent. You should
* use this method to add the Data you need to the communication. * use this method to add the Data you need to the communication.
* *
* @param h The Data that you want to send * @param h The Data that you want to send
*/ */
public static void send(DataHandler h) { public static void send(BaseDataHandler h) {
if (h.getOriginatesOnServer()) { if (h.getOriginatesOnServer()) {
DataExchangeAPI.getInstance().server.sendToClient(h); DataExchangeAPI.getInstance().server.sendToClient(h);
} }

View file

@ -14,136 +14,230 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.jetbrains.annotations.NotNull; import ru.bclib.BCLib;
import java.nio.charset.StandardCharsets; public abstract class DataHandler extends BaseDataHandler {
public abstract static class WithoutPayload extends DataHandler {
public abstract class DataHandler {
public abstract static class WithoutPayload extends DataHandler{
protected WithoutPayload(ResourceLocation identifier, boolean originatesOnServer) { protected WithoutPayload(ResourceLocation identifier, boolean originatesOnServer) {
super(identifier, originatesOnServer); super(identifier, originatesOnServer);
} }
@Override @Override
protected boolean prepareData(boolean isClient){ return true; } protected boolean prepareData(boolean isClient) { return true; }
@Override @Override
protected void serializeData(FriendlyByteBuf buf, boolean isClient) { protected void serializeData(FriendlyByteBuf buf, boolean isClient) {
} }
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean isClient){ protected void deserializeIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean isClient) {
} }
} }
private final boolean originatesOnServer; protected DataHandler(ResourceLocation identifier, boolean originatesOnServer) {
@NotNull super(identifier, originatesOnServer);
private final ResourceLocation identifier;
protected DataHandler(ResourceLocation identifier, boolean originatesOnServer){
this.originatesOnServer = originatesOnServer;
this.identifier = identifier;
} }
final public boolean getOriginatesOnServer(){ protected boolean prepareData(boolean isClient) { return true; }
return originatesOnServer;
} abstract protected void serializeData(FriendlyByteBuf buf, boolean isClient);
abstract protected void deserializeIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean isClient);
abstract protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient);
final public ResourceLocation getIdentifier(){
return identifier;
}
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender){ @Override
deserializeFromIncomingData(buf, responseSender, true); void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) {
deserializeIncomingData(buf, responseSender, true);
client.execute(() -> runOnGameThread(client, null, true)); client.execute(() -> runOnGameThread(client, null, true));
} }
private ServerPlayer lastMessageSender; @Override
void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){ void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) {
lastMessageSender = player; super.receiveFromClient(server, player, handler, buf, responseSender);
deserializeFromIncomingData(buf, responseSender, false);
deserializeIncomingData(buf, responseSender, false);
server.execute(() -> runOnGameThread(null, server, false)); server.execute(() -> runOnGameThread(null, server, false));
} }
protected boolean prepareData(boolean isClient){ return true; } @Override
abstract protected void serializeData(FriendlyByteBuf buf, boolean isClient) ; void sendToClient(MinecraftServer server) {
abstract protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean isClient);
abstract protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient);
final protected boolean reply(DataHandler message, MinecraftServer server){
if (lastMessageSender==null) return false;
message.sendToClient(server, lastMessageSender);
return true;
}
void sendToClient(MinecraftServer server){
if (prepareData(false)) { if (prepareData(false)) {
FriendlyByteBuf buf = PacketByteBufs.create(); FriendlyByteBuf buf = PacketByteBufs.create();
serializeData(buf, false); serializeData(buf, false);
for (ServerPlayer player : PlayerLookup.all(server)) { for (ServerPlayer player : PlayerLookup.all(server)) {
ServerPlayNetworking.send(player, this.identifier, buf); ServerPlayNetworking.send(player, getIdentifier(), buf);
} }
} }
} }
void sendToClient(MinecraftServer server, ServerPlayer player){ @Override
void sendToClient(MinecraftServer server, ServerPlayer player) {
if (prepareData(false)) { if (prepareData(false)) {
FriendlyByteBuf buf = PacketByteBufs.create(); FriendlyByteBuf buf = PacketByteBufs.create();
serializeData(buf, false); serializeData(buf, false);
ServerPlayNetworking.send(player, this.identifier, buf); ServerPlayNetworking.send(player, getIdentifier(), buf);
} }
} }
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
void sendToServer(Minecraft client){ @Override
void sendToServer(Minecraft client) {
if (prepareData(true)) { if (prepareData(true)) {
FriendlyByteBuf buf = PacketByteBufs.create(); FriendlyByteBuf buf = PacketByteBufs.create();
serializeData(buf, true); serializeData(buf, true);
ClientPlayNetworking.send(identifier, buf); ClientPlayNetworking.send(getIdentifier(), buf);
} }
} }
@Override /**
public boolean equals(Object o) { * A Message that always originates on the Client
if (this == o) return true; */
if (o == null || getClass() != o.getClass()) return false; public abstract static class FromClient extends BaseDataHandler {
DataHandler that = (DataHandler) o; public abstract static class WithoutPayload extends FromClient {
return originatesOnServer == that.originatesOnServer && identifier.equals(that.identifier); protected WithoutPayload(ResourceLocation identifier) {
} super(identifier);
}
@Override @Override
public int hashCode() { protected boolean prepareDataOnClient() { return true; }
int hash = identifier.hashCode();
if (originatesOnServer) hash |= 0x80000000;
else hash &=0x7FFFFFFF;
return hash; @Override
} protected void serializeDataOnClient(FriendlyByteBuf buf) {
}
@Override @Override
public String toString() { protected void deserializeIncomingDataOnServer(FriendlyByteBuf buf, PacketSender responseSender) {
return "DataHandler{" + "originatesOnServer=" + originatesOnServer + ", identifier=" + identifier + '}'; }
}
protected FromClient(ResourceLocation identifier) {
super(identifier, false);
}
@Environment(EnvType.CLIENT)
protected boolean prepareDataOnClient() { return true; }
@Environment(EnvType.CLIENT)
abstract protected void serializeDataOnClient(FriendlyByteBuf buf);
abstract protected void deserializeIncomingDataOnServer(FriendlyByteBuf buf, PacketSender responseSender);
abstract protected void runOnServerGameThread(MinecraftServer server);
@Environment(EnvType.CLIENT)
@Override
void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) {
BCLib.LOGGER.error("[Internal Error] The message '" + getIdentifier() + "' must originate from the client!");
}
@Override
void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) {
super.receiveFromClient(server, player, handler, buf, responseSender);
deserializeIncomingDataOnServer(buf, responseSender);
server.execute(() -> runOnServerGameThread(server));
}
@Override
void sendToClient(MinecraftServer server) {
BCLib.LOGGER.error("[Internal Error] The message '" + getIdentifier() + "' must originate from the client!");
}
@Override
void sendToClient(MinecraftServer server, ServerPlayer player) {
BCLib.LOGGER.error("[Internal Error] The message '" + getIdentifier() + "' must originate from the client!");
}
@Environment(EnvType.CLIENT)
@Override
void sendToServer(Minecraft client) {
if (prepareDataOnClient()) {
FriendlyByteBuf buf = PacketByteBufs.create();
serializeDataOnClient(buf);
ClientPlayNetworking.send(getIdentifier(), buf);
}
}
} }
/** /**
* Write a String to a buffer (Convenience Method) * A Message that always originates on the Server
* @param buf The buffer to write to
* @param s The String you want to write
*/ */
public static void writeString(FriendlyByteBuf buf, String s){ public abstract static class FromServer extends BaseDataHandler {
buf.writeByteArray(s.getBytes(StandardCharsets.UTF_8)); public abstract static class WithoutPayload extends FromServer {
} protected WithoutPayload(ResourceLocation identifier) {
super(identifier);
}
/** @Override
* Read a string from a buffer (Convenience Method) protected boolean prepareDataOnServer() { return true; }
* @param buf Thea buffer to read from
* @return The received String @Override
*/ protected void serializeDataOnServer(FriendlyByteBuf buf) {
public static String readString(FriendlyByteBuf buf){ }
byte[] data = buf.readByteArray();
return new String(data, StandardCharsets.UTF_8); @Override
protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) {
}
}
protected FromServer(ResourceLocation identifier) {
super(identifier, true);
}
protected boolean prepareDataOnServer() { return true; }
abstract protected void serializeDataOnServer(FriendlyByteBuf buf);
@Environment(EnvType.CLIENT)
abstract protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender);
@Environment(EnvType.CLIENT)
abstract protected void runOnClientGameThread(Minecraft client);
@Environment(EnvType.CLIENT)
@Override
final void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) {
deserializeIncomingDataOnClient(buf, responseSender);
client.execute(() -> runOnClientGameThread(client));
}
@Override
final void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) {
super.receiveFromClient(server, player, handler, buf, responseSender);
BCLib.LOGGER.error("[Internal Error] The message '" + getIdentifier() + "' must originate from the server!");
}
@Override
final void sendToClient(MinecraftServer server) {
if (prepareDataOnServer()) {
FriendlyByteBuf buf = PacketByteBufs.create();
serializeDataOnServer(buf);
for (ServerPlayer player : PlayerLookup.all(server)) {
ServerPlayNetworking.send(player, getIdentifier(), buf);
}
}
}
@Override
final void sendToClient(MinecraftServer server, ServerPlayer player) {
if (prepareDataOnServer()) {
FriendlyByteBuf buf = PacketByteBufs.create();
serializeDataOnServer(buf);
ServerPlayNetworking.send(player, getIdentifier(), buf);
}
}
@Environment(EnvType.CLIENT)
@Override
final void sendToServer(Minecraft client) {
BCLib.LOGGER.error("[Internal Error] The message '" + getIdentifier() + "' must originate from the server!");
}
} }
} }

View file

@ -5,14 +5,14 @@ import net.minecraft.resources.ResourceLocation;
import java.util.function.Supplier; import java.util.function.Supplier;
public class DataHandlerDescriptor { public class DataHandlerDescriptor {
public DataHandlerDescriptor(ResourceLocation identifier, Supplier<DataHandler> instancer){ public DataHandlerDescriptor(ResourceLocation identifier, Supplier<BaseDataHandler> instancer){
this(identifier, instancer, instancer, false, false); this(identifier, instancer, instancer, false, false);
} }
public DataHandlerDescriptor(ResourceLocation identifier, Supplier<DataHandler> instancer, boolean sendOnJoin, boolean sendBeforeEnter){ public DataHandlerDescriptor(ResourceLocation identifier, Supplier<BaseDataHandler> instancer, boolean sendOnJoin, boolean sendBeforeEnter){
this(identifier, instancer, instancer, sendOnJoin, sendBeforeEnter); this(identifier, instancer, instancer, sendOnJoin, sendBeforeEnter);
} }
public DataHandlerDescriptor(ResourceLocation identifier, Supplier<DataHandler> receiv_instancer, Supplier<DataHandler> join_instancer, boolean sendOnJoin, boolean sendBeforeEnter){ public DataHandlerDescriptor(ResourceLocation identifier, Supplier<BaseDataHandler> receiv_instancer, Supplier<BaseDataHandler> join_instancer, boolean sendOnJoin, boolean sendBeforeEnter){
this.INSTANCE = receiv_instancer; this.INSTANCE = receiv_instancer;
this.JOIN_INSTANCE = join_instancer; this.JOIN_INSTANCE = join_instancer;
this.IDENTIFIER = identifier; this.IDENTIFIER = identifier;
@ -24,6 +24,6 @@ public class DataHandlerDescriptor {
public final boolean sendOnJoin; public final boolean sendOnJoin;
public final boolean sendBeforeEnter; public final boolean sendBeforeEnter;
public final ResourceLocation IDENTIFIER; public final ResourceLocation IDENTIFIER;
public final Supplier<DataHandler> INSTANCE; public final Supplier<BaseDataHandler> INSTANCE;
public final Supplier<DataHandler> JOIN_INSTANCE; public final Supplier<BaseDataHandler> JOIN_INSTANCE;
} }

View file

@ -4,6 +4,7 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import ru.bclib.api.dataexchange.BaseDataHandler;
import ru.bclib.api.dataexchange.ConnectorClientside; import ru.bclib.api.dataexchange.ConnectorClientside;
import ru.bclib.api.dataexchange.ConnectorServerside; import ru.bclib.api.dataexchange.ConnectorServerside;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
@ -95,7 +96,7 @@ abstract public class DataExchange {
public static void sendOnEnter() { public static void sendOnEnter() {
getInstance().descriptors.forEach((desc) -> { getInstance().descriptors.forEach((desc) -> {
if (desc.sendBeforeEnter) { if (desc.sendBeforeEnter) {
DataHandler h = desc.JOIN_INSTANCE.get(); BaseDataHandler h = desc.JOIN_INSTANCE.get();
if (!h.getOriginatesOnServer()) { if (!h.getOriginatesOnServer()) {
getInstance().client.sendToServer(h); getInstance().client.sendToServer(h);
} }

View file

@ -7,12 +7,10 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import ru.bclib.BCLib; import ru.bclib.BCLib;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandler;
import ru.bclib.api.dataexchange.DataHandlerDescriptor; import ru.bclib.api.dataexchange.DataHandlerDescriptor;
import ru.bclib.api.dataexchange.handler.DataExchange;
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig;
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config;
import ru.bclib.api.dataexchange.handler.autosync.AutoSyncID.WithContentOverride; import ru.bclib.api.dataexchange.handler.autosync.AutoSyncID.WithContentOverride;
@ -36,11 +34,11 @@ import java.util.stream.Collectors;
* <p> * <p>
* For Details refer to {@link HelloServer} * For Details refer to {@link HelloServer}
*/ */
public class HelloClient extends DataHandler { public class HelloClient extends DataHandler.FromServer {
public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_client"), HelloClient::new, false, false); public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_client"), HelloClient::new, false, false);
public HelloClient() { public HelloClient() {
super(DESCRIPTOR.IDENTIFIER, true); super(DESCRIPTOR.IDENTIFIER);
} }
static String getBCLibVersion() { static String getBCLibVersion() {
@ -48,7 +46,7 @@ public class HelloClient extends DataHandler {
} }
@Override @Override
protected boolean prepareData(boolean isClient) { protected boolean prepareDataOnServer() {
if (!Config.isAllowingAutoSync()) { if (!Config.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the server."); BCLib.LOGGER.info("Auto-Sync was disabled on the server.");
return false; return false;
@ -59,7 +57,7 @@ public class HelloClient extends DataHandler {
} }
@Override @Override
protected void serializeData(FriendlyByteBuf buf, boolean isClient) { protected void serializeDataOnServer(FriendlyByteBuf buf) {
final String vbclib = getBCLibVersion(); final String vbclib = getBCLibVersion();
BCLib.LOGGER.info("Sending Hello to Client. (server=" + vbclib + ")"); BCLib.LOGGER.info("Sending Hello to Client. (server=" + vbclib + ")");
final List<String> mods = DataExchangeAPI.registeredMods(); final List<String> mods = DataExchangeAPI.registeredMods();
@ -120,8 +118,9 @@ public class HelloClient extends DataHandler {
List<AutoSync.AutoSyncTriple> autoSyncedFiles = null; List<AutoSync.AutoSyncTriple> autoSyncedFiles = null;
List<SyncFolderDescriptor> autoSynFolders = null; List<SyncFolderDescriptor> autoSynFolders = null;
@Environment(EnvType.CLIENT)
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) {
//read BCLibVersion (=protocol version) //read BCLibVersion (=protocol version)
bclibVersion = DataFixerAPI.getModVersion(buf.readInt()); bclibVersion = DataFixerAPI.getModVersion(buf.readInt());
@ -156,8 +155,9 @@ public class HelloClient extends DataHandler {
} }
} }
@Environment(EnvType.CLIENT)
private void processAutoSyncFolder(final List<AutoSyncID> filesToRequest, final List<AutoSyncID.ForDirectFileRequest> filesToRemove) { private void processAutoSyncFolder(final List<AutoSyncID> filesToRequest, final List<AutoSyncID.ForDirectFileRequest> filesToRemove) {
if (!ClientConfig.isClientConfigAcceptingFolders()) { if (!ClientConfig.isAcceptingFolders()) {
return; return;
} }
@ -221,8 +221,9 @@ public class HelloClient extends DataHandler {
}); });
} }
@Environment(EnvType.CLIENT)
private void processSingleFileSync(final List<AutoSyncID> filesToRequest) { private void processSingleFileSync(final List<AutoSyncID> filesToRequest) {
final boolean debugHashes = ClientConfig.shouldClientConfigPrintDebugHashes(); final boolean debugHashes = ClientConfig.shouldPrintDebugHashes();
if (autoSyncedFiles.size() > 0) { if (autoSyncedFiles.size() > 0) {
BCLib.LOGGER.info("Files offered by Server:"); BCLib.LOGGER.info("Files offered by Server:");
@ -260,9 +261,10 @@ public class HelloClient extends DataHandler {
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { protected void runOnClientGameThread(Minecraft client) {
if (!ClientConfig.isClientConfigAllowingAutoSync()) { if (!ClientConfig.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the client."); BCLib.LOGGER.info("Auto-Sync was disabled on the client.");
return; return;
} }
@ -289,7 +291,7 @@ public class HelloClient extends DataHandler {
//Both client and server need to know about the folder you want to sync //Both client and server need to know about the folder you want to sync
//Files can only get placed within that folder //Files can only get placed within that folder
if ((filesToRequest.size() > 0 || filesToRemove.size() > 0) && ClientConfig.isClientConfigAcceptingFiles()) { if ((filesToRequest.size() > 0 || filesToRemove.size() > 0) && ClientConfig.isAcceptingFiles()) {
showDownloadConfigs(client, filesToRequest, filesToRemove); showDownloadConfigs(client, filesToRequest, filesToRemove);
return; return;
} }

View file

@ -1,7 +1,8 @@
package ru.bclib.api.dataexchange.handler.autosync; package ru.bclib.api.dataexchange.handler.autosync;
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.PacketSender;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
@ -56,38 +57,40 @@ import java.io.File;
* </tr> * </tr>
* </table> * </table>
*/ */
public class HelloServer extends DataHandler { public class HelloServer extends DataHandler.FromClient {
public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_server"), HelloServer::new, true, false); public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_server"), HelloServer::new, true, false);
protected String bclibVersion = "0.0.0"; protected String bclibVersion = "0.0.0";
public HelloServer() { public HelloServer() {
super(DESCRIPTOR.IDENTIFIER, false); super(DESCRIPTOR.IDENTIFIER);
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected boolean prepareData(boolean isClient) { protected boolean prepareDataOnClient() {
if (!ClientConfig.isClientConfigAllowingAutoSync()) { if (!ClientConfig.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the client."); BCLib.LOGGER.info("Auto-Sync was disabled on the client.");
return false; return false;
} }
return true; return true;
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected void serializeData(FriendlyByteBuf buf, boolean isClient) { protected void serializeDataOnClient(FriendlyByteBuf buf) {
BCLib.LOGGER.info("Sending hello to server."); BCLib.LOGGER.info("Sending hello to server.");
buf.writeInt(DataFixerAPI.getModVersion(HelloClient.getBCLibVersion())); buf.writeInt(DataFixerAPI.getModVersion(HelloClient.getBCLibVersion()));
} }
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { protected void deserializeIncomingDataOnServer(FriendlyByteBuf buf, PacketSender responseSender) {
bclibVersion = DataFixerAPI.getModVersion(buf.readInt()); bclibVersion = DataFixerAPI.getModVersion(buf.readInt());
} }
@Override @Override
protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { protected void runOnServerGameThread(MinecraftServer server) {
if (!Config.isAllowingAutoSync()) { if (!Config.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the server."); BCLib.LOGGER.info("Auto-Sync was disabled on the server.");
return; return;

View file

@ -1,7 +1,8 @@
package ru.bclib.api.dataexchange.handler.autosync; package ru.bclib.api.dataexchange.handler.autosync;
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.PacketSender;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
@ -16,7 +17,7 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class RequestFiles extends DataHandler { public class RequestFiles extends DataHandler.FromClient {
public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "request_files"), RequestFiles::new, false, false); public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "request_files"), RequestFiles::new, false, false);
static String currentToken = ""; static String currentToken = "";
@ -27,21 +28,23 @@ public class RequestFiles extends DataHandler {
} }
public RequestFiles(List<AutoSyncID> files) { public RequestFiles(List<AutoSyncID> files) {
super(DESCRIPTOR.IDENTIFIER, false); super(DESCRIPTOR.IDENTIFIER);
this.files = files; this.files = files;
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected boolean prepareData(boolean isClient) { protected boolean prepareDataOnClient() {
if (!ClientConfig.isClientConfigAllowingAutoSync()) { if (!ClientConfig.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the client."); BCLib.LOGGER.info("Auto-Sync was disabled on the client.");
return false; return false;
} }
return true; return true;
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected void serializeData(FriendlyByteBuf buf, boolean isClient) { protected void serializeDataOnClient(FriendlyByteBuf buf) {
newToken(); newToken();
writeString(buf, currentToken); writeString(buf, currentToken);
@ -55,7 +58,7 @@ public class RequestFiles extends DataHandler {
String receivedToken = ""; String receivedToken = "";
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { protected void deserializeIncomingDataOnServer(FriendlyByteBuf buf, PacketSender responseSender) {
receivedToken = readString(buf); receivedToken = readString(buf);
int size = buf.readInt(); int size = buf.readInt();
files = new ArrayList<>(size); files = new ArrayList<>(size);
@ -71,7 +74,7 @@ public class RequestFiles extends DataHandler {
} }
@Override @Override
protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { protected void runOnServerGameThread(MinecraftServer server) {
if (!Config.isAllowingAutoSync()) { if (!Config.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the server."); BCLib.LOGGER.info("Auto-Sync was disabled on the server.");
return; return;

View file

@ -7,11 +7,9 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import ru.bclib.BCLib; import ru.bclib.BCLib;
import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandler;
import ru.bclib.api.dataexchange.DataHandlerDescriptor; import ru.bclib.api.dataexchange.DataHandlerDescriptor;
import ru.bclib.api.dataexchange.handler.DataExchange;
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.ClientConfig;
import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.Config;
import ru.bclib.gui.screens.ConfirmRestartScreen; import ru.bclib.gui.screens.ConfirmRestartScreen;
@ -26,7 +24,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class SendFiles extends DataHandler { public class SendFiles extends DataHandler.FromServer {
public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "send_files"), SendFiles::new, false, false); public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "send_files"), SendFiles::new, false, false);
protected List<AutoFileSyncEntry> files; protected List<AutoFileSyncEntry> files;
@ -37,13 +35,13 @@ public class SendFiles extends DataHandler {
} }
public SendFiles(List<AutoFileSyncEntry> files, String token) { public SendFiles(List<AutoFileSyncEntry> files, String token) {
super(DESCRIPTOR.IDENTIFIER, true); super(DESCRIPTOR.IDENTIFIER);
this.files = files; this.files = files;
this.token = token; this.token = token;
} }
@Override @Override
protected boolean prepareData(boolean isClient) { protected boolean prepareDataOnServer() {
if (!Config.isAllowingAutoSync()) { if (!Config.isAllowingAutoSync()) {
BCLib.LOGGER.info("Auto-Sync was disabled on the server."); BCLib.LOGGER.info("Auto-Sync was disabled on the server.");
return false; return false;
@ -53,7 +51,7 @@ public class SendFiles extends DataHandler {
} }
@Override @Override
protected void serializeData(FriendlyByteBuf buf, boolean isClient) { protected void serializeDataOnServer(FriendlyByteBuf buf) {
List<AutoFileSyncEntry> existingFiles = files.stream() List<AutoFileSyncEntry> existingFiles = files.stream()
.filter(e -> e.fileName.exists()) .filter(e -> e.fileName.exists())
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -83,9 +81,10 @@ public class SendFiles extends DataHandler {
private List<Pair<AutoFileSyncEntry, byte[]>> receivedFiles; private List<Pair<AutoFileSyncEntry, byte[]>> receivedFiles;
@Environment(EnvType.CLIENT)
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { protected void deserializeIncomingDataOnClient(FriendlyByteBuf buf, PacketSender responseSender) {
if (ClientConfig.isClientConfigAcceptingFiles()) { if (ClientConfig.isAcceptingFiles()) {
token = readString(buf); token = readString(buf);
if (!token.equals(RequestFiles.currentToken)) { if (!token.equals(RequestFiles.currentToken)) {
RequestFiles.newToken(); RequestFiles.newToken();
@ -111,9 +110,10 @@ public class SendFiles extends DataHandler {
} }
} }
@Environment(EnvType.CLIENT)
@Override @Override
protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { protected void runOnClientGameThread(Minecraft client) {
if (ClientConfig.isClientConfigAcceptingFiles()) { if (ClientConfig.isAcceptingFiles()) {
BCLib.LOGGER.info("Writing Files:"); BCLib.LOGGER.info("Writing Files:");
//TODO: Reject files that were not in the last RequestFiles. //TODO: Reject files that were not in the last RequestFiles.
@ -128,6 +128,7 @@ public class SendFiles extends DataHandler {
} }
} }
@Environment(EnvType.CLIENT)
public static void writeSyncedFile(AutoSyncID e, byte[] data, File fileName) { public static void writeSyncedFile(AutoSyncID e, byte[] data, File fileName) {
Path path = fileName.toPath(); Path path = fileName.toPath();
BCLib.LOGGER.info(" - Writing " + path + " (" + data.length + " Bytes)"); BCLib.LOGGER.info(" - Writing " + path + " (" + data.length + " Bytes)");