Skip to content

Commit 3fcf28e

Browse files
Chore: Network rework
1 parent 695b1e3 commit 3fcf28e

7 files changed

Lines changed: 104 additions & 98 deletions

File tree

.changeset/forty-mice-design.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"CreateColonies": patch
3+
---
4+
5+
chore: 1.20.4 changes (Network rework)

src/main/java/nl/motionlesstrain/createcolonies/CreateColonies.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
import net.neoforged.api.distmarker.Dist;
55
import net.neoforged.bus.api.IEventBus;
66
import net.neoforged.fml.DistExecutor;
7+
import net.neoforged.fml.ModContainer;
78
import net.neoforged.fml.common.Mod;
89
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
9-
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;
1010
import net.neoforged.neoforge.capabilities.Capabilities;
1111
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
12-
import nl.motionlesstrain.createcolonies.blockentities.SchematicTableEntity;
1312
import nl.motionlesstrain.createcolonies.compatibility.Minecolonies;
1413
import nl.motionlesstrain.createcolonies.gui.SchematicTableScreen;
1514
import nl.motionlesstrain.createcolonies.hooks.HooksInitialiser;
@@ -26,7 +25,11 @@ public class CreateColonies {
2625
// Define mod id in a common place for everything to reference
2726
public static final String MODID = "createcolonies";
2827

29-
public CreateColonies(final IEventBus modEventBus) {
28+
// The mod container of CreateColonies
29+
public static ModContainer container;
30+
31+
public CreateColonies(final IEventBus modEventBus, final ModContainer container) {
32+
CreateColonies.container = container;
3033
// Register the DeferredRegisters that we use to register our own resources in
3134
registerRegistries(modEventBus);
3235

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,34 @@
11
package nl.motionlesstrain.createcolonies.network;
22

3-
import net.minecraft.network.FriendlyByteBuf;
4-
import net.minecraft.resources.ResourceLocation;
5-
import net.neoforged.fml.ModLoadingContext;
6-
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
7-
import net.neoforged.neoforge.network.NetworkRegistry;
8-
import net.neoforged.neoforge.network.simple.SimpleChannel;
9-
import net.neoforged.neoforgespi.language.IModInfo;
3+
import net.minecraft.network.RegistryFriendlyByteBuf;
4+
import net.minecraft.network.codec.StreamCodec;
5+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
6+
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
7+
import net.neoforged.neoforge.network.handling.IPayloadHandler;
8+
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
9+
import nl.motionlesstrain.createcolonies.CreateColonies;
1010
import nl.motionlesstrain.createcolonies.network.messages.SaveNBTFileMessage;
1111

12-
import java.util.function.Function;
13-
1412
import static nl.motionlesstrain.createcolonies.CreateColonies.MODID;
1513

1614
public class MessagesHandler {
17-
private static int messageId = 0;
18-
19-
public static SimpleChannel NETWORK;
2015

21-
private static <M extends NetworkMessage> void registerMessage(
22-
Class<M> messageClass, Function<FriendlyByteBuf, M> decode) {
23-
NETWORK.registerMessage(messageId++, messageClass, NetworkMessage::encode, decode, NetworkMessage::handle);
16+
@FunctionalInterface
17+
interface MessageRegisterer<T extends CustomPacketPayload> {
18+
void register(CustomPacketPayload.Type<T> type,
19+
StreamCodec<? super RegistryFriendlyByteBuf, T> streamCodec,
20+
IPayloadHandler<T> handler);
2421
}
2522

26-
public static void setUpNetwork(FMLCommonSetupEvent event) {
27-
IModInfo info = ModLoadingContext.get().getActiveContainer().getModInfo();
28-
final String version = info.getVersion().toString();
23+
private static <M extends NetworkMessage> void registerMessage(MessageRegisterer<M> registrar, NetworkMessage.Factory<M> factory) {
24+
registrar.register(factory.type(), factory.streamCodec(), factory.handler());
25+
}
2926

30-
NETWORK = NetworkRegistry.newSimpleChannel(
31-
new ResourceLocation(MODID, "main"),
32-
() -> version,
33-
version::equals,
34-
version::equals
35-
);
27+
public static void setUpNetwork(final RegisterPayloadHandlersEvent event) {
28+
final String version = CreateColonies.container.getModInfo().getVersion().toString();
3629

37-
registerMessage(SaveNBTFileMessage.class, SaveNBTFileMessage::new);
30+
final PayloadRegistrar registrar = event.registrar(MODID)
31+
.versioned(version);
32+
registerMessage(registrar::playToClient, new SaveNBTFileMessage.Factory());
3833
}
3934
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
package nl.motionlesstrain.createcolonies.network;
22

33
import net.minecraft.network.FriendlyByteBuf;
4+
import net.minecraft.network.RegistryFriendlyByteBuf;
5+
import net.minecraft.network.codec.StreamCodec;
6+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
47
import net.neoforged.neoforge.network.NetworkEvent;
8+
import net.neoforged.neoforge.network.handling.IPayloadHandler;
9+
510
import java.util.function.Supplier;
611

7-
public interface NetworkMessage {
8-
void encode(FriendlyByteBuf buffer);
12+
public interface NetworkMessage extends CustomPacketPayload {
13+
14+
interface Factory<T extends NetworkMessage> {
15+
CustomPacketPayload.Type<T> type();
16+
17+
StreamCodec<? super RegistryFriendlyByteBuf, T> streamCodec();
918

10-
void handle(Supplier<NetworkEvent.Context> ctx);
19+
IPayloadHandler<T> handler();
20+
}
1121
}

src/main/java/nl/motionlesstrain/createcolonies/network/messages/ClientBoundNetworkMessage.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,88 @@
11
package nl.motionlesstrain.createcolonies.network.messages;
22

33
import com.mojang.logging.LogUtils;
4+
import io.netty.buffer.ByteBuf;
45
import io.netty.buffer.ByteBufInputStream;
56
import io.netty.buffer.ByteBufOutputStream;
67
import net.minecraft.client.Minecraft;
78
import net.minecraft.nbt.CompoundTag;
9+
import net.minecraft.nbt.NbtAccounter;
810
import net.minecraft.nbt.NbtIo;
911
import net.minecraft.network.FriendlyByteBuf;
12+
import net.minecraft.network.RegistryFriendlyByteBuf;
1013
import net.minecraft.network.chat.Component;
14+
import net.minecraft.network.codec.ByteBufCodecs;
15+
import net.minecraft.network.codec.StreamCodec;
16+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
17+
import net.minecraft.resources.ResourceLocation;
1118
import net.minecraft.world.entity.player.Player;
19+
import net.neoforged.neoforge.common.util.FriendlyByteBufUtil;
20+
import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs;
1221
import net.neoforged.neoforge.network.NetworkEvent;
22+
import net.neoforged.neoforge.network.handling.IPayloadContext;
23+
import net.neoforged.neoforge.network.handling.IPayloadHandler;
24+
import nl.motionlesstrain.createcolonies.network.NetworkMessage;
25+
import org.jetbrains.annotations.NotNull;
1326
import org.slf4j.Logger;
1427

1528
import javax.annotation.Nullable;
1629
import java.io.IOException;
1730
import java.nio.file.Path;
1831

19-
public class SaveNBTFileMessage extends ClientBoundNetworkMessage {
20-
private static final Logger LOGGER = LogUtils.getLogger();
21-
private final String filePath;
22-
private final CompoundTag fileContents;
23-
24-
public SaveNBTFileMessage(String filePath, CompoundTag contents) {
25-
this.filePath = filePath;
26-
fileContents = contents;
27-
}
32+
import static nl.motionlesstrain.createcolonies.CreateColonies.MODID;
2833

29-
public SaveNBTFileMessage(FriendlyByteBuf buffer) {
30-
filePath = buffer.readUtf();
31-
CompoundTag contents = null;
32-
try (ByteBufInputStream input = new ByteBufInputStream(buffer)){
33-
contents = NbtIo.readCompressed(input);
34-
} catch (IOException e) {
35-
LOGGER.error("Could not read file contents", e);
36-
}
37-
fileContents = contents;
38-
}
34+
public record SaveNBTFileMessage(String filePath, CompoundTag fileContents) implements NetworkMessage {
35+
private static final CustomPacketPayload.Type<SaveNBTFileMessage> TYPE = new CustomPacketPayload.Type<>(
36+
ResourceLocation.fromNamespaceAndPath(MODID, "save_nbt_file")
37+
);
3938

4039
@Override
41-
public void encode(FriendlyByteBuf buffer) {
42-
buffer.writeUtf(filePath);
43-
try (ByteBufOutputStream output = new ByteBufOutputStream(buffer)) {
44-
NbtIo.writeCompressed(fileContents, output);
45-
} catch (IOException e) {
46-
LOGGER.error("Could not write file contents", e);
47-
}
40+
public @NotNull Type<? extends CustomPacketPayload> type() {
41+
return TYPE;
4842
}
4943

50-
@Override
51-
protected ClientsideHandler createHandler() {
52-
return new ClientNBTSaver();
53-
}
44+
public static final StreamCodec<ByteBuf, SaveNBTFileMessage> STREAM_CODEC = StreamCodec.composite(
45+
ByteBufCodecs.STRING_UTF8,
46+
SaveNBTFileMessage::filePath,
47+
ByteBufCodecs.compoundTagCodec(NbtAccounter::unlimitedHeap),
48+
SaveNBTFileMessage::fileContents,
49+
SaveNBTFileMessage::new
50+
);
5451

55-
private class ClientNBTSaver implements ClientsideHandler {
52+
private static final Logger LOGGER = LogUtils.getLogger();
5653

54+
private static class ClientNBTSaver implements IPayloadHandler<SaveNBTFileMessage> {
5755
@Override
58-
public void handlePacket(NetworkEvent.Context context) {
56+
public void handle(SaveNBTFileMessage message, @NotNull IPayloadContext context) {
5957
final Path gamePath = Minecraft.getInstance().gameDirectory.toPath();
60-
final Path saveFile = gamePath.resolve(filePath);
58+
final Path saveFile = gamePath.resolve(message.filePath);
6159
try {
62-
NbtIo.writeCompressed(fileContents, saveFile.toFile());
60+
NbtIo.writeCompressed(message.fileContents, saveFile.toFile());
6361
final @Nullable Player player = Minecraft.getInstance().player;
6462
if (player != null) {
6563
player.displayClientMessage(Component.translatable("nl.motionlesstrain.createcolonies.convert.confirm"), false);
6664
}
6765
} catch (IOException e) {
68-
LOGGER.error("Could not save file {}", filePath, e);
66+
LOGGER.error("Could not save file {}", message.filePath, e);
6967
}
7068
}
7169
}
70+
71+
public static class Factory implements NetworkMessage.Factory<SaveNBTFileMessage> {
72+
73+
@Override
74+
public Type<SaveNBTFileMessage> type() {
75+
return TYPE;
76+
}
77+
78+
@Override
79+
public StreamCodec<? super RegistryFriendlyByteBuf, SaveNBTFileMessage> streamCodec() {
80+
return STREAM_CODEC;
81+
}
82+
83+
@Override
84+
public IPayloadHandler<SaveNBTFileMessage> handler() {
85+
return new ClientNBTSaver();
86+
}
87+
}
7288
}
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package nl.motionlesstrain.createcolonies.network.messages;
22

3+
import net.neoforged.neoforge.network.handling.IPayloadContext;
4+
import net.neoforged.neoforge.network.handling.IPayloadHandler;
35
import nl.motionlesstrain.createcolonies.network.NetworkMessage;
4-
import java.util.function.Supplier;
5-
import net.neoforged.neoforge.network.NetworkEvent;
66

7-
public abstract class ServerBoundNetworkMessage implements NetworkMessage {
8-
abstract void handlePacket(NetworkEvent.Context ctx);
7+
public abstract class ServerBoundNetworkMessage<T extends ServerBoundNetworkMessage<T>> implements NetworkMessage, IPayloadHandler<T> {
8+
abstract void handlePacket(IPayloadContext ctx);
99

10-
@Override
11-
public void handle(Supplier<NetworkEvent.Context> ctx) {
12-
final var networkContext = ctx.get();
13-
networkContext.enqueueWork(() -> handlePacket(ctx.get()));
14-
networkContext.setPacketHandled(true);
10+
public static abstract class Factory<T extends ServerBoundNetworkMessage<T>> implements NetworkMessage.Factory<T> {
11+
@Override
12+
public IPayloadHandler<T> handler() {
13+
return ServerBoundNetworkMessage::handlePacket;
14+
}
1515
}
1616
}

0 commit comments

Comments
 (0)