# Examples This folder contains various examples that showcase various `lightyear` features. ## Easy - `simple_setup`: minimal example that just shows how to create the lightyear client and server plugins - `simple_box`: example that showcases how to send inputs from client to server, and how to add client-prediction and interpolation ## Medium - `replication_groups`: example that shows how to replicate entities that refer to other entities (e.g. they have a component containing an `Entity` id). You need to use `ReplicationGroup` to ensure that the those entities are replicated in the same message - `interest_management`: example that shows how to use interest management to only replicate a subset of entities to each player, via the `VisibilityManager` and the `RoomManager` - `client_replication`: example that shows how to replicate entities from the client to the server. (i.e. the client has authority) - `priority`: example that shows how to manage bandwidth by enabling priority accumulation. Messages will be sent in order of their priority. ## Advanced - `xpbd_physics`: example that shows how to replicate a physics simulation using xpbd. We also use the `leafwing` feature for a better way to manage inputs. - `spaceships`: more advanced version of `xpbd_physics` with player movement based on forces, fully server authoritative, predicted bullet spawning. - `bullet_prespawn`: example that shows how to spawn player-objects on the Predicted timeline. This is useful to avoid having to wait a full round-trip before the object is spawned. - `auth`: an example that shows how a client can get a `ConnectToken` to connect to a server - `lobby`: an example that shows how the network topology can be changed at runtime. Every client can potentially act as a host for the game (instead of the dedicated server). ## Running an example Each example runs in a similar way. There are different 'modes' of operation: - as a dedicated server with `cargo run -- server` - as a listen server with `cargo run -- client-and-server`. This will launch 2 independent bevy apps (client and server) in separate threads. They will communicate via channels (so with almost 0 latency) - as a listen server with `cargo run -- host-server`. This will launch a single bevy app, where the server will also act as a client. Functionally, it is similar to the "client-and-server" mode, but you have a single bevy `World` instead of separate client and server `Worlds`s. Then you can launch clients with the commands: - `cargo run -- client -c 1` (`-c 1` overrides the client id, to use client id 1) - `cargo run -- client -c 2` You can modify the file `assets/settings.ron` to modify some networking settings. ### Testing in wasm with webtransport NOTE: I am using [trunk](https://trunkrs.dev/) to build and serve the wasm example. To test the example in wasm, you can run the following commands: `trunk serve` You will need a valid SSL certificate to test the example in wasm using webtransport. You will need to run the following commands: - `cd "$(git rev-parse --show-toplevel)" && sh examples/certificates/generate.sh` (to generate the temporary SSL certificates, they are only valid for 2 weeks) - `cargo run -- server` to start the server. The server will print out the certificate digest (something like `1fd28860bd2010067cee636a64bcbb492142295b297fd8c480e604b70ce4d644`) - You then have to replace the certificate digest in the `assets/settings.ron` file with the one that the server printed out. - then start the client wasm test with `trunk serve`