diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java b/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java new file mode 100644 index 0000000..6141a14 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/networking/CraterNetworkHandler.java @@ -0,0 +1,28 @@ +package com.hypherionmc.craterlib.api.networking; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; + +import java.util.List; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public interface CraterNetworkHandler { + + void sendToServer(T packet); + + void sendToServer(T packet, boolean ignoreCheck); + + void sendToClient(T packet, ServerPlayer player); + + default void sendToClients(T packet, List players) { + for (ServerPlayer player : players) { + sendToClient(packet, player); + } + } + + default void sendToAllClients(T packet, MinecraftServer server) { + sendToClients(packet, server.getPlayerList().getPlayers()); + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/abstraction/server/AbstractServer.java b/Common/src/main/java/com/hypherionmc/craterlib/core/abstraction/server/AbstractServer.java index dc6d200..fef82b3 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/abstraction/server/AbstractServer.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/abstraction/server/AbstractServer.java @@ -1,5 +1,6 @@ package com.hypherionmc.craterlib.core.abstraction.server; +import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.MinecraftServer; @@ -9,4 +10,7 @@ public class AbstractServer { server.getPlayerList().broadcastSystemMessage(message, false); } + public static void executeCommand(MinecraftServer server, CommandSourceStack stack, String command) { + server.getCommands().performPrefixedCommand(stack, command); + } } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java index eb34a06..68c251a 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterNetworkHandler.java @@ -10,6 +10,7 @@ import java.util.function.Supplier; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public interface CraterNetworkHandler { > void registerPacket(Class clazz, Supplier supplier, PacketDirection packetDirection); diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java index 77be846..7b4c584 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/CraterPacket.java @@ -6,6 +6,7 @@ import net.minecraft.world.entity.player.Player; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public interface CraterPacket> { void write(final FriendlyByteBuf buf); diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java b/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java index f26eb0b..cf70170 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/network/PacketDirection.java @@ -3,6 +3,7 @@ package com.hypherionmc.craterlib.core.network; /** * @author HypherionSA */ +@Deprecated(forRemoval = true) public enum PacketDirection { TO_SERVER, TO_CLIENT diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java new file mode 100644 index 0000000..483e701 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/CraterPacketNetwork.java @@ -0,0 +1,44 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterPacketNetwork { + + private final PacketRegistry packetRegistry; + public static CraterPacketNetwork INSTANCE; + private static DeferredPacketRegistrar delayedHandler; + + public CraterPacketNetwork(PacketRegistry registry) { + INSTANCE = this; + this.packetRegistry = registry; + getDelayedHandler().registerQueuedPackets(registry); + } + + private static DeferredPacketRegistrar getDelayedHandler() { + if (delayedHandler == null) { + delayedHandler = new DeferredPacketRegistrar(); + } + return delayedHandler; + } + + public static PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + if (INSTANCE != null) { + return INSTANCE.packetRegistry.registerPacket(id, messageType, encoder, decoder, handler); + } else { + return getDelayedHandler().registerPacket(id, messageType, encoder, decoder, handler); + } + } + + public PacketRegistry getPacketRegistry() { + return packetRegistry; + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java new file mode 100644 index 0000000..8e66b62 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/DeferredPacketRegistrar.java @@ -0,0 +1,41 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class DeferredPacketRegistrar implements PacketRegistrar { + + private static final Map, PacketHolder> QUEUED_PACKET_MAP = new HashMap<>(); + + @Override + public PacketSide side() { + return PacketSide.CLIENT; + } + + @Override + public PacketRegistrar registerPacket(ResourceLocation packetIdentifier, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + PacketHolder container = new PacketHolder<>(packetIdentifier, messageType, encoder, decoder, handler); + QUEUED_PACKET_MAP.put(messageType, container); + return this; + } + + + public void registerQueuedPackets(PacketRegistry packetRegistration) { + if (!QUEUED_PACKET_MAP.isEmpty()) { + packetRegistration.PACKET_MAP.putAll(QUEUED_PACKET_MAP); + QUEUED_PACKET_MAP.forEach((aClass, container) -> packetRegistration.registerPacket(container)); + } + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java new file mode 100644 index 0000000..106d08c --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistrar.java @@ -0,0 +1,21 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public interface PacketRegistrar { + + PacketSide side(); + + PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler); + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java new file mode 100644 index 0000000..27a52e0 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/PacketRegistry.java @@ -0,0 +1,41 @@ +package com.hypherionmc.craterlib.core.networking; + +import com.hypherionmc.craterlib.api.networking.CraterNetworkHandler; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public abstract class PacketRegistry implements CraterNetworkHandler, PacketRegistrar { + + final Map, PacketHolder> PACKET_MAP = new HashMap<>(); + + protected final PacketSide side; + + public PacketRegistry(PacketSide side) { + this.side = side; + } + + public PacketRegistrar registerPacket(ResourceLocation id, Class messageType, BiConsumer encoder, Function decoder, Consumer> handler) { + PacketHolder holder = new PacketHolder<>(id, messageType, encoder, decoder, handler); + PACKET_MAP.put(messageType, holder); + registerPacket(holder); + return this; + } + + public PacketSide side() { + return side; + } + + protected abstract void registerPacket(PacketHolder packetHolder); +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java new file mode 100644 index 0000000..bd3eba7 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketContext.java @@ -0,0 +1,15 @@ +package com.hypherionmc.craterlib.core.networking.data; + +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record PacketContext(@Nullable Player sender, T message, PacketSide side) { + + public PacketContext(T message, PacketSide side) { + this(null, message, side); + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java new file mode 100644 index 0000000..4e12fc7 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketHolder.java @@ -0,0 +1,18 @@ +package com.hypherionmc.craterlib.core.networking.data; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public record PacketHolder(ResourceLocation packetId, + Class messageType, + BiConsumer encoder, + Function decoder, + Consumer> handler) { +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java new file mode 100644 index 0000000..c843090 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/networking/data/PacketSide.java @@ -0,0 +1,13 @@ +package com.hypherionmc.craterlib.core.networking.data; + +public enum PacketSide { + CLIENT, + SERVER; + + public PacketSide flipped() { + if (CLIENT.equals(this)) + return SERVER; + + return CLIENT; + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java index b9b8596..2d2420b 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java @@ -14,7 +14,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) public class MinecraftMixin { - @Shadow @Nullable + @Shadow + @Nullable public Screen screen; @Inject(method = "setScreen", at = @At(value = "TAIL")) diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java index eda7fe0..888a275 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibInitializer.java @@ -4,6 +4,9 @@ import com.hypherionmc.craterlib.api.event.server.CraterRegisterCommandEvent; import com.hypherionmc.craterlib.api.event.server.CraterServerLifecycleEvent; import com.hypherionmc.craterlib.common.FabricCommonPlatform; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -12,6 +15,7 @@ public class CraterLibInitializer implements ModInitializer { @Override public void onInitialize() { + new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.SERVER)); CommandRegistrationCallback.EVENT.register( (dispatcher, registryAccess, environment) -> CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent(dispatcher))); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java index 50f30a4..0c91c1a 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java @@ -2,6 +2,9 @@ package com.hypherionmc.craterlib.client; import com.hypherionmc.craterlib.api.event.client.CraterClientTickEvent; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; @@ -9,6 +12,7 @@ public class CraterLibClientInitializer implements ClientModInitializer { @Override public void onInitializeClient() { + new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT)); ClientTickEvents.START_CLIENT_TICK.register((listener) -> { CraterClientTickEvent event = new CraterClientTickEvent(listener.level); CraterEventBus.INSTANCE.postEvent(event); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java new file mode 100644 index 0000000..923f30b --- /dev/null +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/CraterFabricNetworkHandler.java @@ -0,0 +1,81 @@ +package com.hypherionmc.craterlib.network; + +import com.hypherionmc.craterlib.CraterConstants; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +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.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterFabricNetworkHandler extends PacketRegistry { + + private final Map, Message> CHANNELS = new HashMap(); + + public CraterFabricNetworkHandler(PacketSide side) { + super(side); + } + + protected void registerPacket(PacketHolder holder) { + if (CHANNELS.get(holder.messageType()) == null) { + CHANNELS.put(holder.messageType(), new Message<>(holder.packetId(), holder.encoder())); + + if (PacketSide.CLIENT.equals(this.side)) { + ClientPlayNetworking.registerGlobalReceiver(holder.packetId(), ((client, listener, buf, responseSender) -> { + buf.readByte(); + T message = holder.decoder().apply(buf); + client.execute(() -> holder.handler().accept(new PacketContext<>(message, PacketSide.CLIENT))); + })); + } else { + + ServerPlayNetworking.registerGlobalReceiver(holder.packetId(), ((server, player, listener, buf, responseSender) -> { + buf.readByte(); + T message = holder.decoder().apply(buf); + server.execute(() -> holder.handler().accept(new PacketContext<>(player, message, PacketSide.SERVER))); + })); + } + + } else { + CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType()); + } + } + + public void sendToServer(T packet) { + this.sendToServer(packet, false); + } + + public void sendToServer(T packet, boolean ignoreCheck) { + Message message = (Message) CHANNELS.get(packet.getClass()); + + if (ClientPlayNetworking.canSend(message.id()) || ignoreCheck) { + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeByte(0); + message.encoder().accept(packet, buf); + ClientPlayNetworking.send(message.id(), buf); + } + } + + public void sendToClient(T packet, ServerPlayer player) { + Message message = (Message) CHANNELS.get(packet.getClass()); + if (ServerPlayNetworking.canSend(player, message.id())) + { + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeByte(0); + message.encoder().accept(packet, buf); + ServerPlayNetworking.send(player, message.id(), buf); + } + } + + public record Message(ResourceLocation id, BiConsumer encoder) { } +} diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java index 76e5224..b731c8a 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHandler.java @@ -23,6 +23,7 @@ import java.util.function.Supplier; * @author HypherionSA * @date 24/09/2022 */ +@Deprecated(forRemoval = true) public class FabricNetworkHandler implements CraterNetworkHandler { private static final Map NETWORK_HANDLERS = Maps.newConcurrentMap(); diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java index e5ec67f..a4fcd5c 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/FabricNetworkHelper.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public interface FabricNetworkHelper { /* FABRIC ONLY */ diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java index 9e0eaf8..800dde7 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricClientNetworkHelper.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public class FabricClientNetworkHelper extends FabricServerNetworkHelper { @Override diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java index 161e011..b6c9547 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/network/impl/FabricServerNetworkHelper.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Function; +@Deprecated(forRemoval = true) public class FabricServerNetworkHelper implements FabricNetworkHelper { @Override public void registerClientReceiver(@NotNull ResourceLocation channelName, @NotNull Function> factory) { diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java b/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java index cef73f1..270a2d5 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/CraterLib.java @@ -3,6 +3,9 @@ package com.hypherionmc.craterlib; import com.hypherionmc.craterlib.api.event.client.LateInitEvent; import com.hypherionmc.craterlib.common.ForgeServerEvents; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import com.hypherionmc.craterlib.network.CraterForgeNetworkHandler; import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; @@ -10,6 +13,7 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLLoader; @Mod(CraterConstants.MOD_ID) public class CraterLib { @@ -20,6 +24,7 @@ public class CraterLib { } public void commonSetup(FMLCommonSetupEvent evt) { + new CraterPacketNetwork(new CraterForgeNetworkHandler(FMLLoader.getDist().isClient() ? PacketSide.CLIENT : PacketSide.SERVER)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { LateInitEvent event = new LateInitEvent(Minecraft.getInstance(), Minecraft.getInstance().options); CraterEventBus.INSTANCE.postEvent(event); diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java b/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java new file mode 100644 index 0000000..cf404c2 --- /dev/null +++ b/Forge/src/main/java/com/hypherionmc/craterlib/network/CraterForgeNetworkHandler.java @@ -0,0 +1,87 @@ +package com.hypherionmc.craterlib.network; + +import com.hypherionmc.craterlib.CraterConstants; +import com.hypherionmc.craterlib.core.networking.PacketRegistry; +import com.hypherionmc.craterlib.core.networking.data.PacketContext; +import com.hypherionmc.craterlib.core.networking.data.PacketHolder; +import com.hypherionmc.craterlib.core.networking.data.PacketSide; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Connection; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static net.minecraftforge.network.NetworkDirection.PLAY_TO_CLIENT; + +/** + * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 + */ +public class CraterForgeNetworkHandler extends PacketRegistry { + private final Map, SimpleChannel> CHANNELS = new HashMap<>(); + + public CraterForgeNetworkHandler(PacketSide side) { + super(side); + } + + protected void registerPacket(PacketHolder holder) { + if (CHANNELS.get(holder.messageType()) == null) { + SimpleChannel channel = NetworkRegistry.ChannelBuilder + .named(holder.packetId()) + .clientAcceptedVersions((a) -> true) + .serverAcceptedVersions((a) -> true) + .networkProtocolVersion(() -> "1") + .simpleChannel(); + + channel.registerMessage( + 0, + holder.messageType(), + holder.encoder(), + holder.decoder(), + buildHandler(holder.handler()) + ); + + CHANNELS.put(holder.messageType(), channel); + } else { + CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType()); + } + } + + public void sendToServer(T packet) { + this.sendToServer(packet, false); + } + + public void sendToServer(T packet, boolean ignoreCheck) { + SimpleChannel channel = CHANNELS.get(packet.getClass()); + Connection connection = Minecraft.getInstance().getConnection().getConnection(); + if (channel.isRemotePresent(connection) || ignoreCheck) { + channel.sendToServer(packet); + } + } + + public void sendToClient(T packet, ServerPlayer player) { + SimpleChannel channel = CHANNELS.get(packet.getClass()); + Connection connection = player.connection.connection; + if (channel.isRemotePresent(connection)) { + channel.sendTo(packet, player.connection.connection, PLAY_TO_CLIENT); + } + } + + + private BiConsumer> buildHandler(Consumer> handler) { + return (message, ctx) -> { + ctx.get().enqueueWork(() -> { + PacketSide side = ctx.get().getDirection().getReceptionSide().isServer() ? PacketSide.SERVER : PacketSide.CLIENT; + ServerPlayer player = ctx.get().getSender(); + handler.accept(new PacketContext<>(player, message, side)); + }); + ctx.get().setPacketHandled(true); + }; + } +} \ No newline at end of file diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java b/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java index 0ffeec8..1928917 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/network/ForgeNetworkHandler.java @@ -26,6 +26,7 @@ import java.util.function.Supplier; * @author HypherionSA * Partly inspired by and based on ... */ +@Deprecated(forRemoval = true) public class ForgeNetworkHandler implements CraterNetworkHandler { private static final Map NETWORK_HANDLERS = Maps.newConcurrentMap(); diff --git a/build.gradle b/build.gradle index 0921fab..1a056a2 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ plugins { } ext { - release=project.properties['release'] ?: false + release = project.properties['release'] ?: false } var base_version = "${version_major}.${version_minor}" @@ -68,7 +68,7 @@ subprojects { 'Implementation-Version' : project.jar.archiveVersion, 'Implementation-Vendor' : mod_author, 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'Timestamp' : System.currentTimeMillis(), + 'Timestamp' : System.currentTimeMillis(), 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", 'Build-On-Minecraft' : minecraft_version ]) diff --git a/gradle.properties b/gradle.properties index c89c9e7..eed135e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ #Project version_major=1 version_minor=1 -version_patch=1 +version_patch=2 project_group=com.hypherionmc.craterlib #Mod