MCPcopy Index your code
hub / github.com/aggyomfg/bevy_slinet

github.com/aggyomfg/bevy_slinet @v0.14.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.14.0 ↗ · + Follow
230 symbols 383 edges 20 files 43 documented · 19%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

bevy_slinet

A simple networking plugin for bevy.

docs.rs Crates.io Crates.io

Features

  • You can choose TCP or UDP protocol. Adding your own protocols is as easy as implementing a few traits.
  • Multiple clients/servers with different configs (specifies a protocol, packet types, serializer, etc.)
  • De/serialization. You choose a serialization format, packet type (you probably want it to be enum), and receive events with deserialized packets.

Note: Everything in bevy_slinet is feature-gated. Make sure to enable features you need (client, server, protocol_tcp, protocol_udp, serializer_bincode).

Client example

use bevy::prelude::*;
use serde::{Deserialize, Serialize};

use bevy_slinet::client::{ClientPlugin, ConnectionEstablishEvent, PacketReceiveEvent};
use bevy_slinet::packet_length_serializer::LittleEndian;
use bevy_slinet::protocols::tcp::TcpProtocol;
use bevy_slinet::serializers::bincode::{BincodeSerializer, DefaultOptions};
use bevy_slinet::ClientConfig;

struct Config;

impl ClientConfig for Config {
    type ClientPacket = Packet;
    type ServerPacket = Packet;
    type Protocol = TcpProtocol;
    type SerializerError = bincode::Error;
    type LengthSerializer = LittleEndian<u32>;
    fn build_serializer(
    ) -> SerializerAdapter<Self::ClientPacket, Self::ServerPacket, Self::SerializerError> {
        SerializerAdapter::ReadOnly(Arc::new(
            BincodeSerializer::<DefaultOptions>::default(),
        ))
    }
}

#[derive(Serialize, Deserialize, Debug)]
enum ClientPacket {
    String(String),
}

#[derive(Serialize, Deserialize, Debug)]
enum ServerPacket {
    String(String),
}

fn main() {
    App::new()
        .add_plugins(MinimalPlugins)
        .add_plugins(ClientPlugin::<Config>::connect("127.0.0.1:3000"))
        .add_observer(connection_establish_system)
        .add_observer(packet_receive_system)
        .run()
}

fn connection_establish_system(event: Trigger<ConnectionEstablishEvent<Config>>) {
    println!("Connected!");
}

fn packet_receive_system(event: Trigger<PacketReceiveEvent<Config>>) {
    match &event.event().packet {
        ServerPacket::String(s) => println!("Got a message: {}", s),
    }
    event
        .event()
        .connection
        .send(ClientPacket::String("Hello, Server!".to_string()))
        .unwrap();
}

Server Example

use bevy::prelude::*;
use serde::{Deserialize, Serialize};

use bevy_slinet::packet_length_serializer::LittleEndian;
use bevy_slinet::protocols::tcp::TcpProtocol;
use bevy_slinet::serializers::bincode::{BincodeSerializer, DefaultOptions};
use bevy_slinet::server::{NewConnectionEvent, ServerPlugin, PacketReceiveEvent};
use bevy_slinet::ServerConfig;

struct Config;

impl ServerConfig for Config {
    type ClientPacket = Packet;
    type ServerPacket = Packet;
    type Protocol = TcpProtocol;
    type SerializerError = bincode::Error;
    type LengthSerializer = LittleEndian<u32>;
    fn build_serializer(
    ) -> SerializerAdapter<Self::ClientPacket, Self::ServerPacket, Self::SerializerError> {
        SerializerAdapter::ReadOnly(Arc::new(
            BincodeSerializer::<DefaultOptions>::default(),
        ))
    }
}

#[derive(Serialize, Deserialize, Debug)]
enum ClientPacket {
    String(String),
}

#[derive(Serialize, Deserialize, Debug)]
enum ServerPacket {
    String(String),
}

fn main() {
    App::new()
        .add_plugins(MinimalPlugins)
        .add_plugins(ServerPlugin::<Config>::bind("127.0.0.1:3000").unwrap())
        .add_observer(new_connection_system)
        .add_observer(packet_receive_system)
        .run()
}

fn new_connection_system(event: Trigger<NewConnectionEvent<Config>>) {
    event
        .event()
        .connection
        .send(ServerPacket::String("Hello, Client!".to_string()))
        .unwrap();
}

fn packet_receive_system(event: Trigger<PacketReceiveEvent<Config>>) {
    match &event.event().packet {
        ClientPacket::String(s) => println!("Got a message from a client: {}", s),
    }
    event
        .event()
        .connection
        .send(ServerPacket::String("Hello, Client!".to_string()))
        .unwrap();
}

Note: you should implement keep-alive and disconnection systems yourself, or look at lobby_and_battle_servers example

More examples

Here.

Compatibility table

Plugin Version Bevy Version
0.1 0.6
0.2 0.6
0.3 0.7
0.4 0.8
0.5 0.9
0.6 0.10.1
0.7 0.11
0.8 0.12
0.9 0.13
0.10 0.13
0.11 0.14
0.12 0.14
0.13 0.15
main 0.15

Extension points exported contracts — how you extend this code

Core symbols most depended-on inside this repo

Shape

Method 70
Class 65
Function 65
Enum 16
Interface 14

Languages

Rust100%

Modules by API surface

examples/lobby_and_battle_servers.rs29 symbols
src/client.rs25 symbols
src/protocols/udp.rs23 symbols
src/connection.rs19 symbols
src/server.rs18 symbols
src/serializers/custom_crypt.rs18 symbols
src/protocol.rs13 symbols
src/tests.rs12 symbols
src/protocols/tcp.rs12 symbols
src/tests_mut_serializer.rs11 symbols
examples/multiple_connections.rs9 symbols
examples/hello_world_udp.rs8 symbols

For agents

$ claude mcp add bevy_slinet \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page