Skip to content

Commit 698fe1c

Browse files
Merge branch 'custom-network' into moveto-1.21.1
2 parents c91ae23 + 3e37dc2 commit 698fe1c

19 files changed

Lines changed: 421 additions & 47 deletions

File tree

projects/Fabric/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ dependencies {
1717
})
1818
modImplementation("net.fabricmc:fabric-loader:${libs.versions.fabricLoader.get()}")
1919
modImplementation("net.fabricmc.fabric-api:fabric-api:${libs.versions.fabricApi.get()}")
20-
modImplementation("mysticdrew:common-networking-fabric:1.0.20-1.21.1")
2120

2221
shadeApi(project(":Minecraft"))
2322
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package li.cil.ocreloaded.fabric.common;
2+
3+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
4+
5+
public class CustomDataPacket<T> implements CustomPacketPayload {
6+
7+
private Type<? extends CustomPacketPayload> type;
8+
private T data;
9+
10+
public CustomDataPacket(Type<? extends CustomPacketPayload> type, T data) {
11+
this.type = type;
12+
this.data = data;
13+
}
14+
15+
@Override
16+
public Type<? extends CustomPacketPayload> type() {
17+
return type;
18+
}
19+
20+
public T data() {
21+
return data;
22+
}
23+
24+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package li.cil.ocreloaded.fabric.common;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.function.Consumer;
7+
8+
import org.slf4j.LoggerFactory;
9+
10+
import li.cil.ocreloaded.minecraft.common.network.IPlatformNetworkHelper;
11+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
12+
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
13+
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
14+
import net.minecraft.network.RegistryFriendlyByteBuf;
15+
import net.minecraft.network.codec.StreamCodec;
16+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
17+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload.Type;
18+
import net.minecraft.server.level.ServerLevel;
19+
import net.minecraft.server.level.ServerPlayer;
20+
import net.minecraft.world.entity.player.Player;
21+
22+
public class FabricPlatformNetworkHelper implements IPlatformNetworkHelper {
23+
24+
private final Map<Class<?>, Type<CustomPacketPayload>> typeMap = new HashMap<>();
25+
26+
@Override
27+
public void sendToClients(Object packet, List<ServerPlayer> players) {
28+
Type<CustomPacketPayload> type = typeMap.get(packet.getClass());
29+
LoggerFactory.getLogger(getClass()).info("SENDINg PACKET {}", type);
30+
CustomDataPacket<?> dataPacket = new CustomDataPacket<>(type, packet);
31+
for (ServerPlayer player: players) {
32+
ServerPlayNetworking.send(player, dataPacket);
33+
}
34+
}
35+
36+
@Override
37+
public void sendToClientsInLevel(Object packet, ServerLevel level) {
38+
sendToClients(packet, level.players());
39+
}
40+
41+
@Override
42+
public void sendToServer(Object packet) {
43+
Type<CustomPacketPayload> type = typeMap.get(packet.getClass());
44+
LoggerFactory.getLogger(getClass()).info("SENDINg PACKET {}", type);
45+
CustomDataPacket<?> dataPacket = new CustomDataPacket<>(type, packet);
46+
ClientPlayNetworking.send(dataPacket);
47+
}
48+
49+
@Override
50+
@SuppressWarnings("unchecked")
51+
public <T> void registerPacket(
52+
Type<CustomPacketPayload> packetType, Class<? extends T> packetClass,
53+
StreamCodec<RegistryFriendlyByteBuf, T> streamCodec, Consumer<PacketContext<T>> packetHandler,
54+
Side side
55+
) {
56+
typeMap.put(packetClass, packetType);
57+
58+
StreamCodec<? super RegistryFriendlyByteBuf, CustomPacketPayload> codec = StreamCodec.of((dest, src) -> {
59+
streamCodec.encode(dest, ((CustomDataPacket<T>) src).data());
60+
}, src -> {
61+
return new CustomDataPacket<T>(packetType, streamCodec.decode(src));
62+
});
63+
64+
if (side == Side.S2C || side == Side.BOTH) PayloadTypeRegistry.playS2C().register(packetType, codec);
65+
if (side == Side.C2S || side == Side.BOTH) PayloadTypeRegistry.playC2S().register(packetType, codec);
66+
67+
if (side == Side.C2S || side == Side.BOTH) registerServerReceiver(packetHandler, packetType);
68+
if (side == Side.S2C || side == Side.BOTH) registerClientReceiver(packetHandler, packetType);
69+
}
70+
71+
private <T> void registerServerReceiver(Consumer<PacketContext<T>> packetHandler, Type<CustomPacketPayload> packetType) {
72+
ServerPlayNetworking.registerGlobalReceiver(packetType, (payload, context) -> {
73+
packetHandler.accept(new PacketContext<T>() {
74+
75+
@Override
76+
@SuppressWarnings("unchecked")
77+
public T message() {
78+
return ((CustomDataPacket<T>) payload).data();
79+
}
80+
81+
@Override
82+
public Side side() {
83+
return Side.C2S;
84+
}
85+
86+
@Override
87+
public Player sender() {
88+
return context.player();
89+
}
90+
91+
});
92+
});
93+
}
94+
95+
private <T> void registerClientReceiver(Consumer<PacketContext<T>> packetHandler, Type<CustomPacketPayload> packetType) {
96+
ClientPlayNetworking.registerGlobalReceiver(packetType, (payload, context) -> {
97+
packetHandler.accept(new PacketContext<T>() {
98+
99+
@Override
100+
@SuppressWarnings("unchecked")
101+
public T message() {
102+
return ((CustomDataPacket<T>) payload).data();
103+
}
104+
105+
@Override
106+
public Side side() {
107+
return Side.S2C;
108+
}
109+
110+
@Override
111+
public Player sender() {
112+
return context.player();
113+
}
114+
115+
});
116+
});
117+
}
118+
119+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
li.cil.ocreloaded.fabric.common.FabricPlatformNetworkHelper

projects/Minecraft/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ neoForge {
88

99
dependencies {
1010
shadeApi(project(":Core"))
11-
api("mysticdrew:common-networking-common:1.0.20-1.21.1")
1211
}
1312

1413
tasks.register<Copy>("copyResources") {

projects/Minecraft/src/main/java/li/cil/ocreloaded/minecraft/common/entity/CaseBlockEntity.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212

1313
import javax.annotation.Nonnull;
1414

15-
import li.cil.ocreloaded.minecraft.common.network.packets.SoundPacket;
1615
import org.slf4j.Logger;
1716
import org.slf4j.LoggerFactory;
1817

19-
import commonnetwork.api.Dispatcher;
2018
import io.netty.buffer.Unpooled;
2119
import li.cil.ocreloaded.core.component.ComputerComponent;
2220
import li.cil.ocreloaded.core.component.FileSystemComponent;
@@ -39,6 +37,8 @@
3937
import li.cil.ocreloaded.minecraft.common.component.ComponentNetworkUtil;
4038
import li.cil.ocreloaded.minecraft.common.item.ComponentItem;
4139
import li.cil.ocreloaded.minecraft.common.menu.CaseMenu;
40+
import li.cil.ocreloaded.minecraft.common.network.IPlatformNetworkHelper;
41+
import li.cil.ocreloaded.minecraft.common.network.packets.SoundPacket;
4242
import li.cil.ocreloaded.minecraft.common.persistence.NBTPersistenceHolder;
4343
import li.cil.ocreloaded.minecraft.common.registry.CommonRegistered;
4444
import li.cil.ocreloaded.minecraft.common.util.ItemList;
@@ -290,7 +290,7 @@ private void beep(short frequency, short duration) {
290290
ChunkPos chunkPos = new ChunkPos(worldPosition);
291291
List<ServerPlayer> chunkTrackingPlayers = ((ServerLevel) level).getPlayers(player -> player.getChunkTrackingView().contains(chunkPos));
292292

293-
Dispatcher.sendToClients(SoundPacket.createBeepMessage(worldPosition, frequency, duration), chunkTrackingPlayers);
293+
IPlatformNetworkHelper.INSTANCE.sendToClients(SoundPacket.createBeepMessage(worldPosition, frequency, duration), chunkTrackingPlayers);
294294
}
295295

296296
}

projects/Minecraft/src/main/java/li/cil/ocreloaded/minecraft/common/entity/ScreenBlockEntity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import java.util.List;
44

55
import javax.annotation.Nonnull;
6-
import commonnetwork.api.Dispatcher;
7-
import li.cil.ocreloaded.minecraft.common.network.packets.ScreenPacket;
6+
87
import org.slf4j.Logger;
98
import org.slf4j.LoggerFactory;
109

@@ -19,6 +18,8 @@
1918
import li.cil.ocreloaded.minecraft.common.component.ComponentNetworkNode;
2019
import li.cil.ocreloaded.minecraft.common.component.ComponentNetworkUtil;
2120
import li.cil.ocreloaded.minecraft.common.item.GraphicsCardItem;
21+
import li.cil.ocreloaded.minecraft.common.network.IPlatformNetworkHelper;
22+
import li.cil.ocreloaded.minecraft.common.network.packets.ScreenPacket;
2223
import li.cil.ocreloaded.minecraft.common.network.packets.screen.NetworkedTextModeBufferProxy;
2324
import li.cil.ocreloaded.minecraft.common.network.packets.screen.ScreenNetworkInputMessages;
2425
import li.cil.ocreloaded.minecraft.common.persistence.NBTPersistenceHolder;
@@ -110,7 +111,7 @@ public void tick() {
110111
NetworkedTextModeBufferProxy proxy = (NetworkedTextModeBufferProxy) screenBuffer;
111112
if (!proxy.hasChanges()) return;
112113
ByteBuf changeBuffer = proxy.getBuffer();
113-
Dispatcher.sendToClients(new ScreenPacket(worldPosition, ScreenPacket.TEXT_MODE_BUFFER_CHANNEL, changeBuffer.array()), chunkTrackingPlayers);
114+
IPlatformNetworkHelper.INSTANCE.sendToClients(new ScreenPacket(worldPosition, ScreenPacket.TEXT_MODE_BUFFER_CHANNEL, changeBuffer.array()), chunkTrackingPlayers);
114115
}
115116

116117
public void onKeyPressed(int charCode, int keyCode, Player player) {

projects/Minecraft/src/main/java/li/cil/ocreloaded/minecraft/common/menu/CaseMenu.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
package li.cil.ocreloaded.minecraft.common.menu;
22

3-
import commonnetwork.api.Dispatcher;
3+
import java.util.List;
4+
5+
import javax.annotation.Nonnull;
6+
47
import li.cil.ocreloaded.minecraft.common.assets.SharedTextures;
58
import li.cil.ocreloaded.minecraft.common.container.BasicContainer;
69
import li.cil.ocreloaded.minecraft.common.entity.CaseBlockEntity;
7-
import li.cil.ocreloaded.minecraft.common.item.*;
10+
import li.cil.ocreloaded.minecraft.common.item.CPUItem;
11+
import li.cil.ocreloaded.minecraft.common.item.EepromItem;
12+
import li.cil.ocreloaded.minecraft.common.item.FloppyDiskItem;
13+
import li.cil.ocreloaded.minecraft.common.item.GraphicsCardItem;
14+
import li.cil.ocreloaded.minecraft.common.item.HardDiskItem;
15+
import li.cil.ocreloaded.minecraft.common.item.MemoryItem;
16+
import li.cil.ocreloaded.minecraft.common.network.IPlatformNetworkHelper;
817
import li.cil.ocreloaded.minecraft.common.network.packets.PowerPacket;
918
import li.cil.ocreloaded.minecraft.common.registry.CommonRegistered;
1019
import net.minecraft.core.BlockPos;
@@ -19,10 +28,6 @@
1928
import net.minecraft.world.item.Item;
2029
import net.minecraft.world.item.ItemStack;
2130

22-
import java.util.List;
23-
24-
import javax.annotation.Nonnull;
25-
2631
public class CaseMenu extends AbstractContainerMenu {
2732

2833
private static final List<List<ComponentSlotEntry>> COMPONENT_SLOTS = List.of(
@@ -116,7 +121,7 @@ public DataSlot getPower() {
116121

117122
public void sendServerPowerState() {
118123
BlockPos targetBlockPos = blockEntity.getBlockPos();
119-
Dispatcher.sendToServer(new PowerPacket(targetBlockPos, power.get() == 1));
124+
IPlatformNetworkHelper.INSTANCE.sendToServer(new PowerPacket(targetBlockPos, power.get() == 1));
120125
}
121126

122127
private void addContainerSlots() {

projects/Minecraft/src/main/java/li/cil/ocreloaded/minecraft/common/menu/ScreenMenu.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import javax.annotation.Nonnull;
44

5-
import commonnetwork.api.Dispatcher;
65
import li.cil.ocreloaded.minecraft.common.block.ScreenBlock;
76
import li.cil.ocreloaded.minecraft.common.entity.ScreenBlockEntity;
7+
import li.cil.ocreloaded.minecraft.common.network.IPlatformNetworkHelper;
88
import li.cil.ocreloaded.minecraft.common.network.packets.screen.ScreenNetworkInputMessages;
99
import li.cil.ocreloaded.minecraft.common.registry.CommonRegistered;
1010
import net.minecraft.network.FriendlyByteBuf;
@@ -40,38 +40,38 @@ public ScreenBlockEntity getBlockEntity() {
4040
}
4141

4242
public void onKeyPressed(int charCode, int keyCode) {
43-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createKeyPressedMessage(blockEntity.getBlockPos(), charCode, keyCode));
43+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createKeyPressedMessage(blockEntity.getBlockPos(), charCode, keyCode));
4444
}
4545

4646
public void onKeyReleased(int keyCode) {
47-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createKeyReleasedMessage(blockEntity.getBlockPos(), keyCode));
47+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createKeyReleasedMessage(blockEntity.getBlockPos(), keyCode));
4848
}
4949

5050
public void onMousePressed(int button, double x, double y) {
5151
if (!allowMouseEvents()) return;
52-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_PRESSED, blockEntity.getBlockPos(), button, x, y));
52+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_PRESSED, blockEntity.getBlockPos(), button, x, y));
5353
}
5454

5555
public void onMouseReleased(int button, double x, double y) {
5656
if (!allowMouseEvents()) return;
57-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_RELEASED, blockEntity.getBlockPos(), button, x, y));
57+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_RELEASED, blockEntity.getBlockPos(), button, x, y));
5858
}
5959

6060
public void onMouseDragged(int button, double x, double y) {
6161
if (!allowMouseEvents()) return;
62-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_DRAGGED, blockEntity.getBlockPos(), button, x, y));
62+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_DRAGGED, blockEntity.getBlockPos(), button, x, y));
6363
}
6464

6565
public void onMouseScrolled(int button, double x, double y) {
6666
if (!allowMouseEvents()) return;
67-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_SCROLLED, blockEntity.getBlockPos(), button, x, y));
67+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createMouseMessage(ScreenNetworkInputMessages.MOUSE_SCROLLED, blockEntity.getBlockPos(), button, x, y));
6868
}
6969

7070
private boolean allowMouseEvents() {
7171
return blockEntity.getBlockState().getBlock() instanceof ScreenBlock screenBlock && screenBlock.getTier() > 1;
7272
}
7373

7474
public void onKeyboardClipboard(String clipboard) {
75-
Dispatcher.sendToServer(ScreenNetworkInputMessages.createClipboardPasteMessage(blockEntity.getBlockPos(), clipboard));
75+
IPlatformNetworkHelper.INSTANCE.sendToServer(ScreenNetworkInputMessages.createClipboardPasteMessage(blockEntity.getBlockPos(), clipboard));
7676
}
7777
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package li.cil.ocreloaded.minecraft.common.network;
2+
3+
import java.util.List;
4+
import java.util.ServiceLoader;
5+
import java.util.function.Consumer;
6+
7+
import net.minecraft.network.RegistryFriendlyByteBuf;
8+
import net.minecraft.network.codec.StreamCodec;
9+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
10+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload.Type;
11+
import net.minecraft.server.level.ServerLevel;
12+
import net.minecraft.server.level.ServerPlayer;
13+
import net.minecraft.world.entity.player.Player;
14+
15+
public interface IPlatformNetworkHelper {
16+
17+
public static IPlatformNetworkHelper INSTANCE = ServiceLoader.load(IPlatformNetworkHelper.class).findFirst().orElseThrow();
18+
19+
<T> void registerPacket(
20+
Type<CustomPacketPayload> packetType, Class<? extends T> packetClass,
21+
StreamCodec<RegistryFriendlyByteBuf, T> streamCodec, Consumer<PacketContext<T>> packetHandler,
22+
Side side
23+
);
24+
25+
void sendToClients(Object packet, List<ServerPlayer> players);
26+
27+
void sendToClientsInLevel(Object packet, ServerLevel level);
28+
29+
void sendToServer(Object packet);
30+
31+
32+
interface PacketContext<T> {
33+
34+
T message();
35+
36+
Side side();
37+
38+
Player sender();
39+
40+
}
41+
42+
enum Side {
43+
C2S, S2C, BOTH;
44+
}
45+
46+
47+
}

0 commit comments

Comments
 (0)