Implement ball_sync

This commit is contained in:
Sofia 2026-07-21 22:15:53 +03:00
parent 3faeb9fd2c
commit d117bb2f72
3 changed files with 44 additions and 7 deletions

View File

@ -4,7 +4,7 @@ use godot::{
}; };
use crate::{ use crate::{
net::util::NetVector3, net::{network_manager::BallSync, util::NetVector3},
player::{IPlayer, NetTransform}, player::{IPlayer, NetTransform},
}; };
@ -61,4 +61,22 @@ impl Ball {
self.run_deferred(move |s| s.signals().on_ball_pickup().emit(player_id)); self.run_deferred(move |s| s.signals().on_ball_pickup().emit(player_id));
} }
} }
pub fn get_sync(&self) -> BallSync {
BallSync {
transform: NetTransform {
location: self.base().get_global_position().into(),
rotation: self.base().get_global_rotation().into(),
},
velocity: self.base().get_linear_velocity().into(),
}
}
pub fn apply_sync(&mut self, sync: BallSync) {
self.base_mut()
.set_global_position(sync.transform.location.into());
self.base_mut()
.set_global_rotation(sync.transform.rotation.into());
self.base_mut().set_linear_velocity(sync.velocity.into());
}
} }

View File

@ -9,7 +9,7 @@ use crate::{
map_resource::MapResource, map_resource::MapResource,
net::{ net::{
network_manager::{ network_manager::{
NetworkManager, BallSync, NetworkManager,
Package::{self, Kill, SelfSync, SpawnPlayer, TakeDamage}, Package::{self, Kill, SelfSync, SpawnPlayer, TakeDamage},
PeerKind, SyncPackage, PeerKind, SyncPackage,
}, },
@ -147,7 +147,10 @@ impl INode for Game {
); );
} }
} }
peer.broadcast_unreliable(Package::Sync(sync_data)); peer.broadcast_unreliable(Package::Sync(
sync_data,
self.world_ball.as_ref().map(|b| b.bind().get_sync()),
));
} }
} }
} }
@ -458,7 +461,11 @@ impl Game {
} }
// Handle a sync package from the server // Handle a sync package from the server
pub fn handle_sync(&mut self, sync_data: HashMap<u16, SyncPackage>) { pub fn handle_sync(
&mut self,
sync_data: HashMap<u16, SyncPackage>,
ball_sync: Option<BallSync>,
) {
for ( for (
player_id, player_id,
SyncPackage { SyncPackage {
@ -486,6 +493,12 @@ impl Game {
} }
} }
} }
if let Some(ball_sync) = ball_sync
&& let Some(ball) = &mut self.world_ball
{
ball.bind_mut().apply_sync(ball_sync);
}
} }
// Handle a jump, either from the server or from a client // Handle a jump, either from the server or from a client

View File

@ -218,9 +218,9 @@ impl INode for NetworkManager {
game.bind_mut().spawn_player_client(id, transform); game.bind_mut().spawn_player_client(id, transform);
} }
} }
Package::Sync(sync_data) => { Package::Sync(sync_data, ball_sync) => {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
game.bind_mut().handle_sync(sync_data); game.bind_mut().handle_sync(sync_data, ball_sync);
} }
} }
Package::Jump(player_id) => { Package::Jump(player_id) => {
@ -592,7 +592,7 @@ pub enum Package {
// Game packages // Game packages
SpawnPlayer(u16, NetTransform), SpawnPlayer(u16, NetTransform),
Sync(HashMap<u16, SyncPackage>), Sync(HashMap<u16, SyncPackage>, Option<BallSync>),
SelfSync(SyncPackage), SelfSync(SyncPackage),
Jump(u16), Jump(u16),
Shoot(u16, NetVector3, NetTransform, f32), Shoot(u16, NetVector3, NetTransform, f32),
@ -610,6 +610,12 @@ pub struct SyncPackage {
pub transform: NetTransform, pub transform: NetTransform,
} }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BallSync {
pub transform: NetTransform,
pub velocity: NetVector3,
}
pub enum PeerKind { pub enum PeerKind {
Client(Peer<Package>, SocketAddr), Client(Peer<Package>, SocketAddr),
Server(Peer<Package>, u16), Server(Peer<Package>, u16),