diff --git a/src/main/java/net/orcinus/galosphere/Galosphere.java b/src/main/java/net/orcinus/galosphere/Galosphere.java index 2facd3b3..2d989a39 100644 --- a/src/main/java/net/orcinus/galosphere/Galosphere.java +++ b/src/main/java/net/orcinus/galosphere/Galosphere.java @@ -28,6 +28,7 @@ import net.orcinus.galosphere.init.GMemoryModuleTypes; import net.orcinus.galosphere.init.GMenuTypes; import net.orcinus.galosphere.init.GMobEffects; +import net.orcinus.galosphere.init.GNetwork; import net.orcinus.galosphere.init.GParticleTypes; import net.orcinus.galosphere.init.GPlacedFeatures; import net.orcinus.galosphere.init.GPotions; @@ -69,6 +70,7 @@ public void onInitialize() { GRecipeSerializers.init(); GStructureProcessorTypes.init(); GVanillaIntegration.init(); + GNetwork.init(); SpawnPlacements.register(GEntityTypes.SPARKLE, SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Sparkle::checkSparkleSpawnRules); SpawnPlacements.register(GEntityTypes.SPECTRE, SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Spectre::checkSpectreSpawnRules); @@ -82,3 +84,4 @@ public static ResourceLocation id(String path) { } } + diff --git a/src/main/java/net/orcinus/galosphere/GalosphereClient.java b/src/main/java/net/orcinus/galosphere/GalosphereClient.java index 8d18823f..fd8c858a 100644 --- a/src/main/java/net/orcinus/galosphere/GalosphereClient.java +++ b/src/main/java/net/orcinus/galosphere/GalosphereClient.java @@ -126,7 +126,7 @@ public void onInitializeClient() { EntityModelLayerRegistry.registerModelLayer(GModelLayers.PRESERVED, PreservedModel::createBodyLayer); GEvents.clientInit(); - GNetwork.init(); + GNetwork.initClient(); ItemProperties.register(Items.CROSSBOW, Galosphere.id("glow_flare"), (stack, world, entity, i) -> { ChargedProjectiles chargedProjectiles = stack.get(DataComponents.CHARGED_PROJECTILES); @@ -185,4 +185,4 @@ public float unclampedCall(ItemStack itemStack, @Nullable ClientLevel clientLeve ItemProperties.register(GItems.SALTBOUND_TABLET, Galosphere.id("using"), (stack, world, entity, i) -> entity != null && entity.getUseItem().getItem() instanceof SaltboundTabletItem ? 1 : 0); ItemProperties.register(GItems.SALTBOUND_TABLET, Galosphere.id("cooldown"), (stack, world, entity, i) -> entity instanceof Player player && player.getCooldowns().isOnCooldown(GItems.SALTBOUND_TABLET) ? 1 : 0); } -} \ No newline at end of file +} diff --git a/src/main/java/net/orcinus/galosphere/blocks/blockentities/GlowInkClumpsBlockEntity.java b/src/main/java/net/orcinus/galosphere/blocks/blockentities/GlowInkClumpsBlockEntity.java index 501647db..b606a63c 100644 --- a/src/main/java/net/orcinus/galosphere/blocks/blockentities/GlowInkClumpsBlockEntity.java +++ b/src/main/java/net/orcinus/galosphere/blocks/blockentities/GlowInkClumpsBlockEntity.java @@ -18,7 +18,7 @@ import net.orcinus.galosphere.blocks.GlowInkClumpsBlock; import net.orcinus.galosphere.init.GBlockEntityTypes; import net.orcinus.galosphere.init.GBlocks; -import net.orcinus.galosphere.network.SendParticlesPacket; +import net.orcinus.galosphere.network.ServerPacketTypes; public class GlowInkClumpsBlockEntity extends BlockEntity { private static int delay = 0; @@ -57,7 +57,7 @@ private static void generateGlowInk(Level world, BlockPos pos, BlockState origin if (delay == 0) { if (!world.isClientSide()) { for (ServerPlayer serverPlayer : PlayerLookup.tracking((ServerLevel) world, offset)) { - ServerPlayNetworking.send(serverPlayer, new SendParticlesPacket(offset)); + ServerPlayNetworking.send(serverPlayer, new ServerPacketTypes.ServerSendParticlesPacket(offset)); } } int age = 0; diff --git a/src/main/java/net/orcinus/galosphere/entities/Spectre.java b/src/main/java/net/orcinus/galosphere/entities/Spectre.java index aa0e37cb..5519fd86 100644 --- a/src/main/java/net/orcinus/galosphere/entities/Spectre.java +++ b/src/main/java/net/orcinus/galosphere/entities/Spectre.java @@ -69,7 +69,7 @@ import net.orcinus.galosphere.init.GSensorTypes; import net.orcinus.galosphere.init.GSoundEvents; import net.orcinus.galosphere.items.components.SpectreBound; -import net.orcinus.galosphere.network.SendPerspectivePacket; +import net.orcinus.galosphere.network.ServerPacketTypes; import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -378,7 +378,7 @@ public void setCamera(Player player) { if (!this.level().isClientSide()) { ((SpectreBoundSpyglass)player).setUsingSpectreBoundedSpyglass(true); this.setManipulatorUUID(player.getUUID()); - ServerPlayNetworking.send((ServerPlayer) player, new SendPerspectivePacket(player.getUUID(), this.getId())); + ServerPlayNetworking.send((ServerPlayer) player, new ServerPacketTypes.ServerSendPerspectivePacket(player.getUUID(), this.getId())); player.playNotifySound(GSoundEvents.SPECTRE_MANIPULATE_BEGIN, getSoundSource(), 1, 1); } } @@ -397,4 +397,4 @@ public boolean fromBottle() { public void setFromBottle(boolean fromBottle) { this.entityData.set(FROM_BOTTLE, fromBottle); } -} \ No newline at end of file +} diff --git a/src/main/java/net/orcinus/galosphere/entities/SpectreFlare.java b/src/main/java/net/orcinus/galosphere/entities/SpectreFlare.java index 6d9276fb..589f899b 100644 --- a/src/main/java/net/orcinus/galosphere/entities/SpectreFlare.java +++ b/src/main/java/net/orcinus/galosphere/entities/SpectreFlare.java @@ -18,7 +18,7 @@ import net.orcinus.galosphere.init.GItems; import net.orcinus.galosphere.init.GSoundEvents; import net.orcinus.galosphere.mixin.access.FireworkRocketEntityAccessor; -import net.orcinus.galosphere.network.SendPerspectivePacket; +import net.orcinus.galosphere.network.ServerPacketTypes; import org.jetbrains.annotations.Nullable; public class SpectreFlare extends ThrowableLaunchedProjectile { @@ -75,7 +75,7 @@ private void spawnSpectatorVision(Vec3 vec3) { serverPlayer.playNotifySound(GSoundEvents.SPECTRE_MANIPULATE_BEGIN, getSoundSource(), 1, 1); world.addFreshEntity(spectatorVision); ((SpectreBoundSpyglass)serverPlayer).setUsingSpectreBoundedSpyglass(true); - ServerPlayNetworking.send(serverPlayer, new SendPerspectivePacket(serverPlayer.getUUID(), spectatorVision.getId())); + ServerPlayNetworking.send(serverPlayer, new ServerPacketTypes.ServerSendPerspectivePacket(serverPlayer.getUUID(), spectatorVision.getId())); } } } diff --git a/src/main/java/net/orcinus/galosphere/init/GEvents.java b/src/main/java/net/orcinus/galosphere/init/GEvents.java index eb06e670..37eb0622 100644 --- a/src/main/java/net/orcinus/galosphere/init/GEvents.java +++ b/src/main/java/net/orcinus/galosphere/init/GEvents.java @@ -41,7 +41,7 @@ import net.orcinus.galosphere.api.SpectreBoundSpyglass; import net.orcinus.galosphere.blocks.LumiereComposterBlock; import net.orcinus.galosphere.config.GalosphereConfig; -import net.orcinus.galosphere.network.BarometerPacket; +import net.orcinus.galosphere.network.ServerPacketTypes; import net.orcinus.galosphere.util.BannerRendererUtil; import net.orcinus.galosphere.util.PreservedShulkerBox; @@ -73,7 +73,7 @@ private static void registerServerTickEvents() { level.getPlayers((player) -> player.level() != null).forEach((player) -> { ServerLevelData levelData = (ServerLevelData) level.getLevelData(); int rainTime = levelData.getClearWeatherTime() > 0 ? levelData.getClearWeatherTime() : levelData.getRainTime(); - ServerPlayNetworking.send(player, new BarometerPacket(rainTime)); + ServerPlayNetworking.send(player, new ServerPacketTypes.ServerBarometerPacket(rainTime)); }); }); } diff --git a/src/main/java/net/orcinus/galosphere/init/GNetwork.java b/src/main/java/net/orcinus/galosphere/init/GNetwork.java index b95c59ac..a93b5be2 100644 --- a/src/main/java/net/orcinus/galosphere/init/GNetwork.java +++ b/src/main/java/net/orcinus/galosphere/init/GNetwork.java @@ -2,28 +2,22 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; -import net.orcinus.galosphere.network.BarometerPacket; -import net.orcinus.galosphere.network.PlayCooldownSoundPacket; -import net.orcinus.galosphere.network.SendParticlesPacket; -import net.orcinus.galosphere.network.SendPerspectivePacket; +import net.orcinus.galosphere.network.ServerPacketTypes; public class GNetwork { - @Environment(EnvType.CLIENT) public static void init() { - PayloadTypeRegistry.playS2C().register(SendParticlesPacket.TYPE, SendParticlesPacket.STREAM_CODEC); - ClientPlayNetworking.registerGlobalReceiver(SendParticlesPacket.TYPE, SendParticlesPacket::receive); - - PayloadTypeRegistry.playS2C().register(SendPerspectivePacket.TYPE, SendPerspectivePacket.STREAM_CODEC); - ClientPlayNetworking.registerGlobalReceiver(SendPerspectivePacket.TYPE, SendPerspectivePacket::receive); - - PayloadTypeRegistry.playS2C().register(BarometerPacket.TYPE, BarometerPacket.STREAM_CODEC); - ClientPlayNetworking.registerGlobalReceiver(BarometerPacket.TYPE, BarometerPacket::receive); + // Register server-safe packet types + ServerPacketTypes.register(); + } - PayloadTypeRegistry.playS2C().register(PlayCooldownSoundPacket.TYPE, PlayCooldownSoundPacket.STREAM_CODEC); - ClientPlayNetworking.registerGlobalReceiver(PlayCooldownSoundPacket.TYPE, PlayCooldownSoundPacket::receive); + @Environment(EnvType.CLIENT) + public static void initClient() { + // Register client-side packet handlers + net.orcinus.galosphere.network.SendParticlesPacket.register(); + net.orcinus.galosphere.network.SendPerspectivePacket.register(); + net.orcinus.galosphere.network.BarometerPacket.register(); + net.orcinus.galosphere.network.PlayCooldownSoundPacket.register(); } } diff --git a/src/main/java/net/orcinus/galosphere/mixin/ServerItemCooldownsMixin.java b/src/main/java/net/orcinus/galosphere/mixin/ServerItemCooldownsMixin.java index e764ab02..340d83e7 100644 --- a/src/main/java/net/orcinus/galosphere/mixin/ServerItemCooldownsMixin.java +++ b/src/main/java/net/orcinus/galosphere/mixin/ServerItemCooldownsMixin.java @@ -5,7 +5,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ServerItemCooldowns; import net.orcinus.galosphere.init.GItems; -import net.orcinus.galosphere.network.PlayCooldownSoundPacket; +import net.orcinus.galosphere.network.ServerPacketTypes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -23,7 +23,7 @@ public class ServerItemCooldownsMixin { @Inject(at = @At("TAIL"), method = "onCooldownEnded") private void G$removeCooldown(Item item, CallbackInfo ci) { if (item.equals(GItems.SALTBOUND_TABLET)) { - ServerPlayNetworking.send(this.player, new PlayCooldownSoundPacket()); + ServerPlayNetworking.send(this.player, new ServerPacketTypes.ServerPlayCooldownSoundPacket()); } } diff --git a/src/main/java/net/orcinus/galosphere/network/BarometerPacket.java b/src/main/java/net/orcinus/galosphere/network/BarometerPacket.java index 80f6ccc6..a92a9dce 100644 --- a/src/main/java/net/orcinus/galosphere/network/BarometerPacket.java +++ b/src/main/java/net/orcinus/galosphere/network/BarometerPacket.java @@ -10,11 +10,17 @@ public record BarometerPacket(int time) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Galosphere.id("barometer_info")); - public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(BarometerPacket::write, BarometerPacket::new); + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public BarometerPacket decode(FriendlyByteBuf buf) { + return new BarometerPacket(buf.readInt()); + } - private BarometerPacket(FriendlyByteBuf buf) { - this(buf.readInt()); - } + @Override + public void encode(FriendlyByteBuf buf, BarometerPacket packet) { + buf.writeInt(packet.time()); + } + }; public void write(FriendlyByteBuf friendlyByteBuf) { friendlyByteBuf.writeInt(this.time); @@ -29,4 +35,13 @@ public void receive(ClientPlayNetworking.Context context) { public Type type() { return TYPE; } -} \ No newline at end of file + + public static void register() { + // Register receiver for the server packet type + ClientPlayNetworking.registerGlobalReceiver(net.orcinus.galosphere.network.ServerPacketTypes.BAROMETER_TYPE, (packet, context) -> { + // Convert server packet to client packet and handle + BarometerPacket clientPacket = new BarometerPacket(packet.time()); + clientPacket.receive(context); + }); + } +} diff --git a/src/main/java/net/orcinus/galosphere/network/PlayCooldownSoundPacket.java b/src/main/java/net/orcinus/galosphere/network/PlayCooldownSoundPacket.java index 0e97baaa..218f6dcf 100644 --- a/src/main/java/net/orcinus/galosphere/network/PlayCooldownSoundPacket.java +++ b/src/main/java/net/orcinus/galosphere/network/PlayCooldownSoundPacket.java @@ -11,11 +11,17 @@ public record PlayCooldownSoundPacket() implements CustomPacketPayload { public static final Type TYPE = new Type<>(Galosphere.id("play_cooldown_sound")); - public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(PlayCooldownSoundPacket::write, PlayCooldownSoundPacket::new); + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public PlayCooldownSoundPacket decode(FriendlyByteBuf buf) { + return new PlayCooldownSoundPacket(); + } - private PlayCooldownSoundPacket(FriendlyByteBuf buf) { - this(); - } + @Override + public void encode(FriendlyByteBuf buf, PlayCooldownSoundPacket packet) { + // No data to encode for this packet + } + }; public void write(FriendlyByteBuf friendlyByteBuf) { } @@ -31,4 +37,13 @@ public void receive(ClientPlayNetworking.Context context) { public Type type() { return TYPE; } + + public static void register() { + // Register receiver for the server packet type (packet type already registered by ServerPacketTypes) + ClientPlayNetworking.registerGlobalReceiver(net.orcinus.galosphere.network.ServerPacketTypes.PLAY_COOLDOWN_SOUND_TYPE, (packet, context) -> { + // Convert server packet to client packet and handle + PlayCooldownSoundPacket clientPacket = new PlayCooldownSoundPacket(); + clientPacket.receive(context); + }); + } } diff --git a/src/main/java/net/orcinus/galosphere/network/SendParticlesPacket.java b/src/main/java/net/orcinus/galosphere/network/SendParticlesPacket.java index f261bef8..39a6ba01 100644 --- a/src/main/java/net/orcinus/galosphere/network/SendParticlesPacket.java +++ b/src/main/java/net/orcinus/galosphere/network/SendParticlesPacket.java @@ -15,11 +15,17 @@ public record SendParticlesPacket(BlockPos blockPos) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Galosphere.id("send_particles")); - public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(SendParticlesPacket::write, SendParticlesPacket::new); + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public SendParticlesPacket decode(FriendlyByteBuf buf) { + return new SendParticlesPacket(buf.readBlockPos()); + } - private SendParticlesPacket(FriendlyByteBuf friendlyByteBuf) { - this(friendlyByteBuf.readBlockPos()); - } + @Override + public void encode(FriendlyByteBuf buf, SendParticlesPacket packet) { + buf.writeBlockPos(packet.blockPos()); + } + }; public void write(FriendlyByteBuf friendlyByteBuf) { friendlyByteBuf.writeBlockPos(this.blockPos); @@ -50,4 +56,13 @@ public void receive(ClientPlayNetworking.Context context) { public Type type() { return TYPE; } -} \ No newline at end of file + + public static void register() { + // Register receiver for the server packet type (packet type already registered by ServerPacketTypes) + ClientPlayNetworking.registerGlobalReceiver(net.orcinus.galosphere.network.ServerPacketTypes.SEND_PARTICLES_TYPE, (packet, context) -> { + // Convert server packet to client packet and handle + SendParticlesPacket clientPacket = new SendParticlesPacket(packet.blockPos()); + clientPacket.receive(context); + }); + } +} diff --git a/src/main/java/net/orcinus/galosphere/network/SendPerspectivePacket.java b/src/main/java/net/orcinus/galosphere/network/SendPerspectivePacket.java index f5c83bae..b3fa1717 100644 --- a/src/main/java/net/orcinus/galosphere/network/SendPerspectivePacket.java +++ b/src/main/java/net/orcinus/galosphere/network/SendPerspectivePacket.java @@ -14,11 +14,18 @@ public record SendPerspectivePacket(UUID uuid, int id) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Galosphere.id("send_perspective")); - public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(SendPerspectivePacket::write, SendPerspectivePacket::new); + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public SendPerspectivePacket decode(FriendlyByteBuf buf) { + return new SendPerspectivePacket(buf.readUUID(), buf.readInt()); + } - private SendPerspectivePacket(FriendlyByteBuf buf) { - this(buf.readUUID(), buf.readInt()); - } + @Override + public void encode(FriendlyByteBuf buf, SendPerspectivePacket packet) { + buf.writeUUID(packet.uuid()); + buf.writeInt(packet.id()); + } + }; public void write(FriendlyByteBuf friendlyByteBuf) { friendlyByteBuf.writeUUID(this.uuid); @@ -44,4 +51,13 @@ public void receive(ClientPlayNetworking.Context context) { public Type type() { return TYPE; } + + public static void register() { + // Register receiver for the server packet type (packet type already registered by ServerPacketTypes) + ClientPlayNetworking.registerGlobalReceiver(net.orcinus.galosphere.network.ServerPacketTypes.SEND_PERSPECTIVE_TYPE, (packet, context) -> { + // Convert server packet to client packet and handle + SendPerspectivePacket clientPacket = new SendPerspectivePacket(packet.uuid(), packet.id()); + clientPacket.receive(context); + }); + } } diff --git a/src/main/java/net/orcinus/galosphere/network/ServerPacketTypes.java b/src/main/java/net/orcinus/galosphere/network/ServerPacketTypes.java new file mode 100644 index 00000000..ed34cb1f --- /dev/null +++ b/src/main/java/net/orcinus/galosphere/network/ServerPacketTypes.java @@ -0,0 +1,108 @@ +package net.orcinus.galosphere.network; + +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.orcinus.galosphere.Galosphere; + +/** + * Server-safe packet type definitions without client-side imports + */ +public class ServerPacketTypes { + + // Packet types + public static final CustomPacketPayload.Type BAROMETER_TYPE = + new CustomPacketPayload.Type<>(Galosphere.id("barometer_info")); + public static final CustomPacketPayload.Type PLAY_COOLDOWN_SOUND_TYPE = + new CustomPacketPayload.Type<>(Galosphere.id("play_cooldown_sound")); + public static final CustomPacketPayload.Type SEND_PARTICLES_TYPE = + new CustomPacketPayload.Type<>(Galosphere.id("send_particles")); + public static final CustomPacketPayload.Type SEND_PERSPECTIVE_TYPE = + new CustomPacketPayload.Type<>(Galosphere.id("send_perspective")); + + // Server-safe packet implementations + public record ServerBarometerPacket(int time) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public ServerBarometerPacket decode(FriendlyByteBuf buf) { + return new ServerBarometerPacket(buf.readInt()); + } + + @Override + public void encode(FriendlyByteBuf buf, ServerBarometerPacket packet) { + buf.writeInt(packet.time()); + } + }; + + @Override + public Type type() { + return BAROMETER_TYPE; + } + } + + public record ServerPlayCooldownSoundPacket() implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public ServerPlayCooldownSoundPacket decode(FriendlyByteBuf buf) { + return new ServerPlayCooldownSoundPacket(); + } + + @Override + public void encode(FriendlyByteBuf buf, ServerPlayCooldownSoundPacket packet) { + // No data to encode + } + }; + + @Override + public Type type() { + return PLAY_COOLDOWN_SOUND_TYPE; + } + } + + public record ServerSendParticlesPacket(net.minecraft.core.BlockPos blockPos) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public ServerSendParticlesPacket decode(FriendlyByteBuf buf) { + return new ServerSendParticlesPacket(buf.readBlockPos()); + } + + @Override + public void encode(FriendlyByteBuf buf, ServerSendParticlesPacket packet) { + buf.writeBlockPos(packet.blockPos()); + } + }; + + @Override + public Type type() { + return SEND_PARTICLES_TYPE; + } + } + + public record ServerSendPerspectivePacket(java.util.UUID uuid, int id) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public ServerSendPerspectivePacket decode(FriendlyByteBuf buf) { + return new ServerSendPerspectivePacket(buf.readUUID(), buf.readInt()); + } + + @Override + public void encode(FriendlyByteBuf buf, ServerSendPerspectivePacket packet) { + buf.writeUUID(packet.uuid()); + buf.writeInt(packet.id()); + } + }; + + @Override + public Type type() { + return SEND_PERSPECTIVE_TYPE; + } + } + + public static void register() { + PayloadTypeRegistry.playS2C().register(BAROMETER_TYPE, ServerBarometerPacket.STREAM_CODEC); + PayloadTypeRegistry.playS2C().register(PLAY_COOLDOWN_SOUND_TYPE, ServerPlayCooldownSoundPacket.STREAM_CODEC); + PayloadTypeRegistry.playS2C().register(SEND_PARTICLES_TYPE, ServerSendParticlesPacket.STREAM_CODEC); + PayloadTypeRegistry.playS2C().register(SEND_PERSPECTIVE_TYPE, ServerSendPerspectivePacket.STREAM_CODEC); + } +} \ No newline at end of file