This commit is contained in:
parent
53fe3333f0
commit
27b4644730
12 changed files with 852 additions and 642 deletions
1432
Cargo.lock
generated
1432
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -39,14 +39,15 @@ incremental = false
|
||||||
debug = false
|
debug = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
avian2d = { version = "0.3.0", features = ["serialize", "simd"] }
|
avian2d = { version = "0.4.0", features = ["serialize", "simd"] }
|
||||||
bevy = { version = "0.16.1", default-features = false, features = [
|
bevy = { version = "0.17.2", default-features = false, features = [
|
||||||
"bevy_color",
|
"bevy_color",
|
||||||
"bevy_core_pipeline",
|
"bevy_core_pipeline",
|
||||||
"bevy_remote",
|
"bevy_remote",
|
||||||
"bevy_render",
|
"bevy_render",
|
||||||
"bevy_state",
|
"bevy_state",
|
||||||
"bevy_ui",
|
"bevy_ui",
|
||||||
|
"bevy_ui_render",
|
||||||
"bevy_window",
|
"bevy_window",
|
||||||
"bevy_winit",
|
"bevy_winit",
|
||||||
"default_font",
|
"default_font",
|
||||||
|
|
@ -54,7 +55,7 @@ bevy = { version = "0.16.1", default-features = false, features = [
|
||||||
"std",
|
"std",
|
||||||
"wayland",
|
"wayland",
|
||||||
] }
|
] }
|
||||||
bevy_rand = { version = "0.11.0", features = ["wyrand", "std"] }
|
bevy_rand = { version = "0.12.0", features = ["wyrand", "std"] }
|
||||||
clap = { version = "4.5.48", features = ["derive"] }
|
clap = { version = "4.5.48", features = ["derive"] }
|
||||||
crossbeam-channel = "0.5.15"
|
crossbeam-channel = "0.5.15"
|
||||||
log = { version = "0.4.28", features = ["release_max_level_warn"] }
|
log = { version = "0.4.28", features = ["release_max_level_warn"] }
|
||||||
|
|
|
||||||
|
|
@ -27,4 +27,5 @@ fn toggle_debug_ui(mut ui: ResMut<UiDebugOptions>) {
|
||||||
|
|
||||||
fn toggle_fps(mut fps: ResMut<FpsOverlayConfig>) {
|
fn toggle_fps(mut fps: ResMut<FpsOverlayConfig>) {
|
||||||
fps.enabled = !fps.enabled;
|
fps.enabled = !fps.enabled;
|
||||||
|
fps.frame_time_graph_config.enabled = !fps.frame_time_graph_config.enabled;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ pub fn handle_deleted_peer(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_incoming_packets(mut packets: EventReader<InboundPacket>) {
|
pub fn handle_incoming_packets(mut packets: MessageReader<InboundPacket>) {
|
||||||
for InboundPacket(packet) in packets.read() {
|
for InboundPacket(packet) in packets.read() {
|
||||||
info!("Packet received: {:?}", packet.message);
|
info!("Packet received: {:?}", packet.message);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use super::state::AppState;
|
||||||
|
|
||||||
/// Basic implementation of a physics object
|
/// Basic implementation of a physics object
|
||||||
#[derive(Component, Debug, Default)]
|
#[derive(Component, Debug, Default)]
|
||||||
#[require(Collider, Mesh2d, MeshMaterial2d<ColorMaterial>, Restitution = Restitution::new(1.0), RigidBody, TransformInterpolation, Transform, StateScoped<AppState> = StateScoped(AppState::InGame))]
|
#[require(Collider, Mesh2d, MeshMaterial2d<ColorMaterial>, Restitution = Restitution::new(1.0), RigidBody, TransformInterpolation, Transform, DespawnOnExit<AppState> = DespawnOnExit(AppState::InGame))]
|
||||||
struct GameObject;
|
struct GameObject;
|
||||||
|
|
||||||
/// Radius of a ball
|
/// Radius of a ball
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ pub fn move_player(
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Neatly exit game
|
/// Neatly exit game
|
||||||
pub fn quit(mut exit: EventWriter<AppExit>) {
|
pub fn quit(mut exit: MessageWriter<AppExit>) {
|
||||||
exit.write(AppExit::Success);
|
exit.write(AppExit::Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use super::{
|
||||||
};
|
};
|
||||||
|
|
||||||
fn spawner<T: TryFrom<Vec<u8>> + Component>(
|
fn spawner<T: TryFrom<Vec<u8>> + Component>(
|
||||||
mut inbound: EventReader<InboundPacket>,
|
mut inbound: MessageReader<InboundPacket>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
) {
|
) {
|
||||||
for InboundPacket(packet) in inbound.read() {
|
for InboundPacket(packet) in inbound.read() {
|
||||||
|
|
@ -19,7 +19,7 @@ fn spawner<T: TryFrom<Vec<u8>> + Component>(
|
||||||
fn sender<T: Into<Vec<u8>> + Component + Clone>(
|
fn sender<T: Into<Vec<u8>> + Component + Clone>(
|
||||||
peers: Query<&PeerID, Added<Peer>>,
|
peers: Query<&PeerID, Added<Peer>>,
|
||||||
entities: Query<&T>,
|
entities: Query<&T>,
|
||||||
mut outbound: EventWriter<OutboundPacket>,
|
mut outbound: MessageWriter<OutboundPacket>,
|
||||||
) {
|
) {
|
||||||
for peer in peers {
|
for peer in peers {
|
||||||
for entity in entities {
|
for entity in entities {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use crate::net::{packet::PacketType, peer::PotentialPeers};
|
||||||
use super::{
|
use super::{
|
||||||
io::{Config, format_message},
|
io::{Config, format_message},
|
||||||
packet::{OutboundPacket, Packet},
|
packet::{OutboundPacket, Packet},
|
||||||
peer::{Peer, PeerChangeEvent, PeerID, PeerReceiveTiming, PeerSendTiming},
|
peer::{Peer, PeerChangeMessage, PeerID, PeerReceiveTiming, PeerSendTiming},
|
||||||
queues::NetworkSend,
|
queues::NetworkSend,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ const MISSED_PINGS: u32 = 3;
|
||||||
pub fn heartbeat(
|
pub fn heartbeat(
|
||||||
peers: Query<(&PeerID, &PeerSendTiming)>,
|
peers: Query<(&PeerID, &PeerSendTiming)>,
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
mut outbound: EventWriter<OutboundPacket>,
|
mut outbound: MessageWriter<OutboundPacket>,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
for (peer, last) in peers {
|
for (peer, last) in peers {
|
||||||
// Allow for 2 consecutive missed heartbeats without timing out
|
// Allow for 2 consecutive missed heartbeats without timing out
|
||||||
|
|
@ -34,12 +34,12 @@ pub fn heartbeat(
|
||||||
pub fn timeout(
|
pub fn timeout(
|
||||||
peers: Query<(&PeerID, &PeerReceiveTiming), With<Peer>>, // I mean... With<Peer> is inherent, but I guess I'll keep it as that might change
|
peers: Query<(&PeerID, &PeerReceiveTiming), With<Peer>>, // I mean... With<Peer> is inherent, but I guess I'll keep it as that might change
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
mut delete: EventWriter<PeerChangeEvent>,
|
mut delete: MessageWriter<PeerChangeMessage>,
|
||||||
) {
|
) {
|
||||||
for (peer, last) in peers {
|
for (peer, last) in peers {
|
||||||
if last.time() + PING_FREQUENCY * MISSED_PINGS < time.elapsed() {
|
if last.time() + PING_FREQUENCY * MISSED_PINGS < time.elapsed() {
|
||||||
warn!("Peer {} timed out", peer.id);
|
warn!("Peer {} timed out", peer.id);
|
||||||
delete.write(PeerChangeEvent::new(peer.id, None));
|
delete.write(PeerChangeMessage::new(peer.id, None));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +65,7 @@ pub fn ping_potential_peers(
|
||||||
config: Res<Config>,
|
config: Res<Config>,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
timer.timer.tick(time.delta());
|
timer.timer.tick(time.delta());
|
||||||
if timer.timer.finished() {
|
if timer.timer.is_finished() {
|
||||||
for peer in &peers.addresses {
|
for peer in &peers.addresses {
|
||||||
to_socket.send(
|
to_socket.send(
|
||||||
format_message(&Vec::new(), PacketType::Peer, config.id),
|
format_message(&Vec::new(), PacketType::Peer, config.id),
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use crate::net::packet::PacketType;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
packet::{InboundPacket, OutboundPacket, Packet},
|
packet::{InboundPacket, OutboundPacket, Packet},
|
||||||
peer::{PeerChangeEvent, PeerData, PeerMap, PeerReceiveTiming, PeerSendTiming},
|
peer::{PeerChangeMessage, PeerData, PeerMap, PeerReceiveTiming, PeerSendTiming},
|
||||||
queues::{NetworkReceive, NetworkSend},
|
queues::{NetworkReceive, NetworkSend},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -28,9 +28,9 @@ pub fn handle_network_input(
|
||||||
from_socket: Res<NetworkReceive>,
|
from_socket: Res<NetworkReceive>,
|
||||||
peer_map: Res<PeerMap>,
|
peer_map: Res<PeerMap>,
|
||||||
mut peers: Query<(&PeerData, &mut PeerReceiveTiming)>,
|
mut peers: Query<(&PeerData, &mut PeerReceiveTiming)>,
|
||||||
mut to_app: EventWriter<InboundPacket>,
|
mut to_app: MessageWriter<InboundPacket>,
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
mut change_peer: EventWriter<PeerChangeEvent>,
|
mut change_peer: MessageWriter<PeerChangeMessage>,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
for (message, address) in from_socket.iter() {
|
for (message, address) in from_socket.iter() {
|
||||||
match Packet::try_from(message) {
|
match Packet::try_from(message) {
|
||||||
|
|
@ -46,7 +46,7 @@ pub fn handle_network_input(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
change_peer.write(PeerChangeEvent::new(packet.peer, Some(address)));
|
change_peer.write(PeerChangeMessage::new(packet.peer, Some(address)));
|
||||||
}
|
}
|
||||||
Err(err) => warn!("Error reading packet: {:?}", err),
|
Err(err) => warn!("Error reading packet: {:?}", err),
|
||||||
}
|
}
|
||||||
|
|
@ -55,7 +55,7 @@ pub fn handle_network_input(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_network_output(
|
pub fn handle_network_output(
|
||||||
mut from_app: EventReader<OutboundPacket>,
|
mut from_app: MessageReader<OutboundPacket>,
|
||||||
peer_map: Res<PeerMap>,
|
peer_map: Res<PeerMap>,
|
||||||
mut peers: Query<(&PeerData, &mut PeerSendTiming)>,
|
mut peers: Query<(&PeerData, &mut PeerSendTiming)>,
|
||||||
config: Res<Config>,
|
config: Res<Config>,
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ impl TryFrom<Vec<u8>> for Packet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Event)]
|
#[derive(Debug, Message)]
|
||||||
pub struct OutboundPacket(pub Packet);
|
pub struct OutboundPacket(pub Packet);
|
||||||
|
|
||||||
impl From<Packet> for OutboundPacket {
|
impl From<Packet> for OutboundPacket {
|
||||||
|
|
@ -86,7 +86,7 @@ impl From<Packet> for OutboundPacket {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Event)]
|
#[derive(Debug, Message)]
|
||||||
pub struct InboundPacket(pub Packet);
|
pub struct InboundPacket(pub Packet);
|
||||||
|
|
||||||
impl From<Packet> for InboundPacket {
|
impl From<Packet> for InboundPacket {
|
||||||
|
|
|
||||||
|
|
@ -181,20 +181,20 @@ impl PeerMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Event)]
|
#[derive(Debug, Message)]
|
||||||
pub struct PeerChangeEvent {
|
pub struct PeerChangeMessage {
|
||||||
peer: Uuid,
|
peer: Uuid,
|
||||||
addr: Option<SocketAddr>,
|
addr: Option<SocketAddr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PeerChangeEvent {
|
impl PeerChangeMessage {
|
||||||
pub fn new(peer: Uuid, addr: Option<SocketAddr>) -> Self {
|
pub fn new(peer: Uuid, addr: Option<SocketAddr>) -> Self {
|
||||||
Self { peer, addr }
|
Self { peer, addr }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_peer_change(
|
pub fn handle_peer_change(
|
||||||
mut changes: EventReader<PeerChangeEvent>,
|
mut changes: MessageReader<PeerChangeMessage>,
|
||||||
mut peer_map: ResMut<PeerMap>,
|
mut peer_map: ResMut<PeerMap>,
|
||||||
mut peers: Query<&mut PeerData>,
|
mut peers: Query<&mut PeerData>,
|
||||||
mut potential_peers: ResMut<PotentialPeers>,
|
mut potential_peers: ResMut<PotentialPeers>,
|
||||||
|
|
@ -242,7 +242,7 @@ pub fn handle_peer_change(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_peer_message(
|
pub fn new_peer_message(
|
||||||
mut from_network: EventReader<InboundPacket>,
|
mut from_network: MessageReader<InboundPacket>,
|
||||||
peers: Query<&PeerData>,
|
peers: Query<&PeerData>,
|
||||||
mut potential_peers: ResMut<PotentialPeers>,
|
mut potential_peers: ResMut<PotentialPeers>,
|
||||||
) {
|
) {
|
||||||
|
|
@ -264,7 +264,7 @@ pub fn new_peer_message(
|
||||||
// TODO: Make this a more generic system
|
// TODO: Make this a more generic system
|
||||||
pub fn handle_new_peer(
|
pub fn handle_new_peer(
|
||||||
peers: Query<(Ref<Peer>, &PeerID, &PeerData)>,
|
peers: Query<(Ref<Peer>, &PeerID, &PeerData)>,
|
||||||
mut outbound: EventWriter<OutboundPacket>,
|
mut outbound: MessageWriter<OutboundPacket>,
|
||||||
) {
|
) {
|
||||||
for (change, peer, _) in peers {
|
for (change, peer, _) in peers {
|
||||||
if change.is_added() {
|
if change.is_added() {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use super::{
|
||||||
io::{Config, handle_network_input, handle_network_output},
|
io::{Config, handle_network_input, handle_network_output},
|
||||||
packet::{InboundPacket, OutboundPacket},
|
packet::{InboundPacket, OutboundPacket},
|
||||||
peer::{
|
peer::{
|
||||||
PeerChangeEvent, PeerMap, PotentialPeers, handle_new_peer, handle_peer_change,
|
PeerChangeMessage, PeerMap, PotentialPeers, handle_new_peer, handle_peer_change,
|
||||||
new_peer_message,
|
new_peer_message,
|
||||||
},
|
},
|
||||||
queues::{NetworkReceive, NetworkSend},
|
queues::{NetworkReceive, NetworkSend},
|
||||||
|
|
@ -46,9 +46,9 @@ impl Plugin for NetIOPlugin {
|
||||||
.init_resource::<PeerMap>()
|
.init_resource::<PeerMap>()
|
||||||
.init_resource::<PotentialPeerTimer>()
|
.init_resource::<PotentialPeerTimer>()
|
||||||
.insert_resource(PotentialPeers::new(self.initial_peers.clone()))
|
.insert_resource(PotentialPeers::new(self.initial_peers.clone()))
|
||||||
.add_event::<PeerChangeEvent>()
|
.add_message::<PeerChangeMessage>()
|
||||||
.add_event::<InboundPacket>()
|
.add_message::<InboundPacket>()
|
||||||
.add_event::<OutboundPacket>();
|
.add_message::<OutboundPacket>();
|
||||||
|
|
||||||
match bind_socket(self.listen) {
|
match bind_socket(self.listen) {
|
||||||
Ok((send, receive)) => {
|
Ok((send, receive)) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue