Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support custom (same) schedules #139

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
[workspace]
members = [
"renet",
"demo_chat",
"demo_bevy",
"renetcode",
"bevy_renet",
"renet_visualizer",
"renet_steam",
"renet_netcode",
]
resolver = "2"
17 changes: 11 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ Provides the following features:
- ReliableUnordered: guarantee of message delivery but not order
- Unreliable: no guarantee of message delivery or order
- Packet fragmentation and reassembly
- Authentication and encryption, using [renetcode](https://github.com/lucaspoffo/renet/tree/master/renetcode)
- The transport layer can be customizable. The default transport can be disabled and replaced with a custom one
- Authentication and encryption, using [renet_netcode](https://github.com/lucaspoffo/renet/tree/master/renet_netcode)
- You can also use [renet_steam](https://github.com/lucaspoffo/renet/tree/master/renet_steam) to use the `Steam` transport and authenticantion layer
- The transport/authentication layer can be customizable, you can write your own if necessary

## Channels

Expand Down Expand Up @@ -57,7 +58,7 @@ Renet aims to have a simple API that is easy to integrate with any code base. Po
```rust
let mut server = RenetServer::new(ConnectionConfig::default());

// Setup transport layer
// Setup transport layer using renet_netcode
const SERVER_ADDR: SocketAddr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 5000);
let socket: UdpSocket = UdpSocket::bind(SERVER_ADDR).unwrap();
let server_config = ServerConfig {
Expand Down Expand Up @@ -118,7 +119,7 @@ loop {
```rust
let mut client = RenetClient::new(ConnectionConfig::default());

// Setup transport layer
// Setup transport layer using renet_netcode
const server_addr: SocketAddr = "127.0.0.1:5000".parse().unwrap();
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
Expand Down Expand Up @@ -155,6 +156,12 @@ loop {
}
```

## Transport Layers

Checkout [renet_netcode](https://github.com/lucaspoffo/renet/tree/master/renet_netcode) if you want to use UDP with the [netcode](https://github.com/lucaspoffo/renet/tree/master/renetcode) protocol.

Checkout [renet_steam](https://github.com/lucaspoffo/renet/tree/master/renet_steam) if you want to use the steam transport layer.

## Demos

You can checkout the [echo example](https://github.com/lucaspoffo/renet/blob/master/renet/examples/echo.rs) for a simple usage of the library. Usage:
Expand Down Expand Up @@ -190,8 +197,6 @@ Simple chat application made with egui to demonstrate how you could handle error

Checkout [bevy_renet](https://github.com/lucaspoffo/renet/tree/master/bevy_renet) if you want to use renet as a plugin with the [Bevy engine](https://bevyengine.org/).

Checkout [renet_steam](https://github.com/lucaspoffo/renet/tree/master/renet_steam) if you want to use the steam transport layer instead of the default one.

## Visualizer

Checkout [renet_visualizer](https://github.com/lucaspoffo/renet/tree/master/renet_visualizer) for a egui plugin to plot metrics data from renet clients and servers:
Expand Down
22 changes: 11 additions & 11 deletions bevy_renet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,25 @@ keywords = ["gamedev", "networking"]
license = "MIT OR Apache-2.0"
readme = "README.md"
repository = "https://github.com/lucaspoffo/renet"
version = "0.0.12"
version = "1.0.0"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[features]
default = ["transport"]
serde = ["renet/serde"]
transport = ["renet/transport"]

[[example]]
name = "simple"
required-features = ["serde", "transport"]
default = ["netcode"]
netcode = ["dep:renet_netcode"]
steam = ["dep:renet_steam"]

[dependencies]
bevy = {version = "0.14", default-features = false}
renet = {path = "../renet", version = "0.0.16", default-features=false, features = ["bevy"]}
bevy_app = "0.15"
bevy_ecs = "0.15"
bevy_time = "0.15"
renet = { path="../renet", version = "1.0.0", features = ["bevy"] }
renet_netcode = { path="../renet_netcode", version = "1.0.0", features = ["bevy"], optional = true }
renet_steam = { path="../renet_steam", version = "1.0.0", features = ["bevy"], optional = true }

[dev-dependencies]
bevy = {version = "0.14", default-features = false, features = ["bevy_core_pipeline", "bevy_render", "bevy_asset", "bevy_pbr", "x11", "tonemapping_luts", "ktx2", "zstd"]}
bevy = {version = "0.15.0", default-features = false, features = ["bevy_core_pipeline", "bevy_render", "bevy_asset", "bevy_pbr", "x11", "tonemapping_luts", "ktx2", "zstd", "bevy_window"]}
bincode = "1.3"
env_logger = "0.11"
serde = {version = "1.0", features = ["derive"]}
125 changes: 73 additions & 52 deletions bevy_renet/README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,46 @@
# Bevy Renet

[![Latest version](https://img.shields.io/crates/v/bevy_renet.svg)](https://crates.io/crates/bevy_renet)
[![Documentation](https://docs.rs/bevy_renet/badge.svg)](https://docs.rs/bevy_renet)
![MIT](https://img.shields.io/badge/license-MIT-blue.svg)
![Apache](https://img.shields.io/badge/license-Apache-blue.svg)

A Bevy Plugin for the [renet](https://github.com/lucaspoffo/renet) crate.
A network crate for Server/Client with cryptographically secure authentication and encypted packets.
Designed for fast paced competitive multiplayer games.
A network crate for Server/Client with cryptographically secure authentication and encrypted packets.
Designed for fast-paced competitive multiplayer games.

## Usage

Bevy renet is a small layer over the `renet` crate, it adds systems to call the update function from the client/server. `RenetClient`, `RenetServer`, `NetcodeClientTransport` and `NetcodeServerTransport` need to be added as a resource, so the setup is similar to `renet` itself:

#### Server
### Server

```rust
let mut app = App::new();
app.add_plugin(RenetServerPlugin);

let server = RenetServer::new(ConnectionConfig::default());
app.insert_resource(server);

// Transport layer setup
app.add_plugin(NetcodeServerPlugin);
let server_addr = "127.0.0.1:5000".parse().unwrap();
let socket = UdpSocket::bind(server_addr).unwrap();
let server_config = ServerConfig {
current_time: SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap(),
max_clients: 64,
protocol_id: 0,
public_addresses: vec![server_addr],
authentication: ServerAuthentication::Unsecure
};
let transport = NetcodeServerTransport::new(server_config, socket).unwrap();
app.insert_resource(transport);

app.add_system(send_message_system);
app.add_system(receive_message_system);
app.add_system(handle_events_system);
fn main() {
let mut app = App::new();
app.add_plugin(RenetServerPlugin);

let server = RenetServer::new(ConnectionConfig::default());
app.insert_resource(server);

// Transport layer setup
app.add_plugin(NetcodeServerPlugin);
let server_addr = "127.0.0.1:5000".parse().unwrap();
let socket = UdpSocket::bind(server_addr).unwrap();
let server_config = ServerConfig {
current_time: SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap(),
max_clients: 64,
protocol_id: 0,
public_addresses: vec![server_addr],
authentication: ServerAuthentication::Unsecure
};
let transport = NetcodeServerTransport::new(server_config, socket).unwrap();
app.insert_resource(transport);

app.add_system(send_message_system);
app.add_system(receive_message_system);
app.add_system(handle_events_system);
}

// Systems

Expand Down Expand Up @@ -69,31 +74,34 @@ fn handle_events_system(mut server_events: EventReader<ServerEvent>) {
}
```

#### Client
```rust
let mut app = App::new();
app.add_plugin(RenetClientPlugin);

let client = RenetClient::new(ConnectionConfig::default());
app.insert_resource(client);

// Setup the transport layer
app.add_plugin(NetcodeClientPlugin);

let authentication = ClientAuthentication::Unsecure {
server_addr: SERVER_ADDR,
client_id: 0,
user_data: None,
protocol_id: 0,
};
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
let mut transport = NetcodeClientTransport::new(current_time, authentication, socket).unwrap();

app.insert_resource(transport);
### Client

app.add_system(send_message_system);
app.add_system(receive_message_system);
```rust
fn main() {
let mut app = App::new();
app.add_plugin(RenetClientPlugin);

let client = RenetClient::new(ConnectionConfig::default());
app.insert_resource(client);

// Setup the transport layer
app.add_plugin(NetcodeClientPlugin);

let authentication = ClientAuthentication::Unsecure {
server_addr: SERVER_ADDR,
client_id: 0,
user_data: None,
protocol_id: 0,
};
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
let mut transport = NetcodeClientTransport::new(current_time, authentication, socket).unwrap();

app.insert_resource(transport);

app.add_system(send_message_system);
app.add_system(receive_message_system);
}

// Systems

Expand All @@ -113,8 +121,8 @@ fn receive_message_system(mut client: ResMut<RenetClient>) {

You can run the `simple` example with:

* Server: `cargo run --features="serde transport" --example simple -- server`
* Client: `cargo run --features="serde transport" --example simple -- client`
* Server: `cargo run --features="netcode" --example simple -- server`
* Client: `cargo run --features="netcode" --example simple -- client`

If you want a more complex example you can checkout the [demo_bevy](https://github.com/lucaspoffo/renet/tree/master/demo_bevy) sample:

Expand All @@ -124,6 +132,7 @@ If you want a more complex example you can checkout the [demo_bevy](https://gith

|bevy|bevy_renet|
|---|---|
|0.15|1.0|
|0.14|0.0.12|
|0.13|0.0.11|
|0.12|0.0.10|
Expand All @@ -132,3 +141,15 @@ If you want a more complex example you can checkout the [demo_bevy](https://gith
|0.9|0.0.6|
|0.8|0.0.5|
|0.7|0.0.4|

## Steam

By default `bevy_renet` uses `renet_netcode` as the transport layer, but you can also use the steam transport layer if you wish by enabling the `steam` feature.

This adds the transport structs `SteamServerTransport`, `SteamClientTransport` and the bevy plugins `SteamServerPlugin`, `SteamClientPlugin`, the setup should be similar to default transport layer.

You can check the [Bevy Demo](https://github.com/lucaspoffo/renet/tree/master/demo_bevy) for how to use the default and steam transport switching between them using feature flags.

# Custom Schedules

If you want more control over how renet is run, instead of adding the `RenetServerPlugin`, `RenetClientPlugin`, you can manually setup the functions they implement (they are all public). Make sure to also setup the plugins for the desired Transport layer.
Loading