1.20.4 packet fix

This commit is contained in:
Oth3r 2024-12-01 12:11:34 -06:00
commit 9d6cc9b785
6 changed files with 82 additions and 103 deletions

View file

@ -1,35 +0,0 @@
package one.oth3r.sit;
import io.netty.buffer.ByteBuf;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.Identifier;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class PacketBuilder {
public static final String SETTINGS = "settings_v1.0";
private final String message;
private final PacketByteBuf packetByteBuf = PacketByteBufs.create();
public PacketBuilder(ByteBuf buf) {
// Read any data sent in the packet
message = buf.toString(StandardCharsets.UTF_8);
packetByteBuf.writeBytes(buf);
}
public PacketBuilder(String message) {
this.message = message;
packetByteBuf.writeBytes(ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8)).array());
}
public static Identifier getIdentifier() {
// only 1 packet rn
return new Identifier(Sit.MOD_ID, SETTINGS);
}
public void send() {
ClientPlayNetworking.send(getIdentifier(), packetByteBuf);
}
public String getMessage() {
return this.message;
}
}

View file

@ -0,0 +1,39 @@
package one.oth3r.sit.packet;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import one.oth3r.sit.utl.Data;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class PacketSender {
private final PacketByteBuf data;
private final PacketType type;
public PacketSender(PacketType type, String data) {
this.type = type;
this.data = PacketByteBufs.create()
.writeBytes(ByteBuffer.wrap(data.getBytes(StandardCharsets.UTF_8)));
}
public void sendToPlayer(ServerPlayerEntity player) {
ServerPlayNetworking.send(player,getIdentifier(type),data);
}
public void sendToServer() {
ClientPlayNetworking.send(getIdentifier(type),data);
}
public static Identifier getIdentifier(PacketType packetType) {
return new Identifier(Data.MOD_ID, packetType.getId());
}
public static String getPacketData(PacketByteBuf buf) {
return buf.toString(StandardCharsets.UTF_8);
}
}

View file

@ -0,0 +1,16 @@
package one.oth3r.sit.packet;
public enum PacketType {
RESPONSE("response_v1.0"),
SETTINGS("settings_v2.0");
final String id;
PacketType(String id) {
this.id = id;
}
public String getId() {
return id;
}
}

View file

@ -1,43 +0,0 @@
package one.oth3r.sit.packet;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.network.packet.CustomPayload;
import net.minecraft.util.Identifier;
import one.oth3r.sit.utl.Data;
public class SitPayloads {
/**
* the packet that the client sends to the server
* @param value the sitting settings for the client
*/
public record SettingsPayload(String value) implements CustomPayload {
public static final Id<SettingsPayload> ID = new Id<>(Identifier.of(Data.MOD_ID,"settings_v2.0"));
public static final PacketCodec<RegistryByteBuf, SettingsPayload> CODEC = PacketCodecs.STRING.xmap(SettingsPayload::new, SettingsPayload::value).cast();
@Override
public Id<SettingsPayload> getId() {
return ID;
}
}
/**
* the packet that the server sends to the client when responding to the settings payload
*/
public record ResponsePayload(String value) implements CustomPayload {
public static final String VERSION = "response_v1.0";
public static final Id<ResponsePayload> ID = new Id<>(Identifier.of(Data.MOD_ID,VERSION));
public static final PacketCodec<RegistryByteBuf, ResponsePayload> CODEC = PacketCodecs.STRING.xmap(ResponsePayload::new, ResponsePayload::value).cast();
@Override
public Id<ResponsePayload> getId() {
return ID;
}
}
}

View file

@ -8,7 +8,6 @@ import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.client.MinecraftClient;
@ -21,7 +20,8 @@ import one.oth3r.sit.command.SitCommand;
import one.oth3r.sit.file.FileData;
import one.oth3r.sit.file.LangReader;
import one.oth3r.sit.file.SittingConfig;
import one.oth3r.sit.packet.SitPayloads;
import one.oth3r.sit.packet.PacketSender;
import one.oth3r.sit.packet.PacketType;
import one.oth3r.sit.screen.ConfigScreen;
import org.lwjgl.glfw.GLFW;
@ -83,34 +83,36 @@ public class Events {
private static class Packet {
private static void common() {
// register the data
PayloadTypeRegistry.playC2S().register(SitPayloads.SettingsPayload.ID, SitPayloads.SettingsPayload.CODEC);
PayloadTypeRegistry.playS2C().register(SitPayloads.ResponsePayload.ID, SitPayloads.ResponsePayload.CODEC);
// server receiver is common
/// receiving the sitting setting payload
ServerPlayNetworking.registerGlobalReceiver(SitPayloads.SettingsPayload.ID,((payload, context) -> Data.getServer().execute(() -> {
ServerPlayNetworking.registerGlobalReceiver(PacketSender.getIdentifier(PacketType.SETTINGS),
((server, player, handler, buf, responseSender) -> {
String packetData = PacketSender.getPacketData(buf);
server.execute(() -> {
// save the setting on the server for that player
FileData.setPlayerSetting(context.player(),Utl.getGson().fromJson(payload.value(), SittingConfig.class));
FileData.setPlayerSetting(player,Utl.getGson().fromJson(packetData, SittingConfig.class));
// send the player back a response packet for confirmation
ServerPlayNetworking.send(context.player(),new SitPayloads.ResponsePayload(SitPayloads.ResponsePayload.VERSION));
new PacketSender(PacketType.RESPONSE,PacketType.RESPONSE.getId()).sendToPlayer(player);
// log the receiving of the packet from the player
Data.LOGGER.info(Utl.lang("sit!.console.player_settings",context.player().getName().getString()).getString());
})));
Data.LOGGER.info(Utl.lang("sit!.console.player_settings",player.getName().getString()).getString());
});
}));
}
private static void client() {
/// receiving the response packet from the server
ClientPlayNetworking.registerGlobalReceiver(SitPayloads.ResponsePayload.ID, ((payload, context) -> {
// only update when needed
ClientPlayNetworking.registerGlobalReceiver(PacketSender.getIdentifier(PacketType.RESPONSE),
((client, handler, buf, responseSender) -> {
String packetData = PacketSender.getPacketData(buf);
client.execute(() -> {
if (!Data.isSupportedServer()) {
Data.setSupportedServer(true);
Data.LOGGER.info(Utl.lang("sit!.console.connected",payload.value()).getString());
Data.LOGGER.info(Utl.lang("sit!.console.connected",packetData).getString());
}
});
}));
}
}

View file

@ -5,7 +5,6 @@ import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.google.gson.stream.MalformedJsonException;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.block.*;
import net.minecraft.block.enums.BlockHalf;
import net.minecraft.block.enums.SlabType;
@ -29,7 +28,8 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.RaycastContext;
import net.minecraft.world.World;
import one.oth3r.sit.file.*;
import one.oth3r.sit.packet.SitPayloads;
import one.oth3r.sit.packet.PacketSender;
import one.oth3r.sit.packet.PacketType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -414,7 +414,7 @@ public class Utl {
*/
public static void sendSettingsPackets() {
if (Data.isClient() && Data.isInGame()) {
ClientPlayNetworking.send(new SitPayloads.SettingsPayload(Utl.getGson().toJson(FileData.getSittingConfig())));
new PacketSender(PacketType.SETTINGS, Utl.getGson().toJson(FileData.getSittingConfig())).sendToServer();
}
}