Move common data from Player to NetPlayer
This commit is contained in:
parent
609a803104
commit
ef1bb3946d
@ -124,7 +124,7 @@ impl INode for Game {
|
||||
if let Some(player) = self
|
||||
.players
|
||||
.iter()
|
||||
.find(|p| p.id == self.self_id.unwrap_or(0))
|
||||
.find(|p| p.id() == self.self_id.unwrap_or(0))
|
||||
{
|
||||
if let Some(data) = &player.get_self_sync() {
|
||||
peer.send_unreliable(socket_addr, SelfSync(data.clone()));
|
||||
@ -145,7 +145,7 @@ impl INode for Game {
|
||||
player.get_transform(),
|
||||
) {
|
||||
sync_data.insert(
|
||||
player.id,
|
||||
player.id(),
|
||||
SyncPackage {
|
||||
movement_direction: dir,
|
||||
look_up,
|
||||
@ -167,13 +167,14 @@ impl INode for Game {
|
||||
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
|
||||
if let PeerKind::Server(peer, _) = peer {
|
||||
for player in self.players.clone() {
|
||||
let player_id = player.id();
|
||||
if let Some(character) = player.character {
|
||||
if character.dyn_bind().dead_for() > self.respawn_timer {
|
||||
let character = self.spawn_player_server(player.id);
|
||||
let character = self.spawn_player_server(player_id);
|
||||
|
||||
if let Some(character) = character {
|
||||
peer.broadcast_reliable(SpawnPlayer(
|
||||
player.id,
|
||||
player_id,
|
||||
character.dyn_bind().get_transform(),
|
||||
));
|
||||
}
|
||||
@ -251,10 +252,13 @@ impl Game {
|
||||
id
|
||||
};
|
||||
self.players.push(Player {
|
||||
id,
|
||||
connection_addr: addr,
|
||||
name,
|
||||
ping: 0,
|
||||
data: NetPlayer {
|
||||
id,
|
||||
name,
|
||||
ping: 0,
|
||||
team: 0,
|
||||
},
|
||||
ready: false,
|
||||
character: None,
|
||||
});
|
||||
@ -265,7 +269,7 @@ impl Game {
|
||||
pub fn set_players(&mut self, players: Vec<Player>) {
|
||||
self.players = players;
|
||||
for player in self.players.clone() {
|
||||
self.run_deferred(move |s| s.signals().on_new_player().emit(player.id));
|
||||
self.run_deferred(move |s| s.signals().on_new_player().emit(player.id()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -278,34 +282,34 @@ impl Game {
|
||||
}
|
||||
|
||||
pub fn find_player(&self, player_id: u16) -> Option<&Player> {
|
||||
self.players.iter().find(|p| p.id == player_id)
|
||||
self.players.iter().find(|p| p.id() == player_id)
|
||||
}
|
||||
|
||||
pub fn find_player_mut(&mut self, player_id: u16) -> Option<&mut Player> {
|
||||
self.players.iter_mut().find(|p| p.id == player_id)
|
||||
self.players.iter_mut().find(|p| p.id() == player_id)
|
||||
}
|
||||
|
||||
pub fn remove_player(&mut self, id: u16) {
|
||||
self.players.retain(|p| p.id != id);
|
||||
self.players.retain(|p| p.id() != id);
|
||||
self.run_deferred(move |s| s.signals().on_player_disconnected().emit(id));
|
||||
}
|
||||
|
||||
pub fn update_player_nick(&mut self, player_id: u16, nick: String) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == player_id) {
|
||||
player.name = nick;
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
||||
player.data.name = nick;
|
||||
}
|
||||
self.run_deferred(|s| s.signals().on_players_updated().emit());
|
||||
}
|
||||
|
||||
pub fn update_player_ping(&mut self, player_id: u16, ping: u128) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == player_id) {
|
||||
player.ping = ping;
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
||||
player.data.ping = ping;
|
||||
}
|
||||
self.run_deferred(|s| s.signals().on_players_updated().emit());
|
||||
}
|
||||
|
||||
pub fn update_player_ready(&mut self, player_id: u16, ready: bool) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == player_id) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
||||
player.ready = ready;
|
||||
}
|
||||
self.run_deferred(|s| s.signals().on_players_updated().emit());
|
||||
@ -319,7 +323,7 @@ impl Game {
|
||||
} else {
|
||||
self.run_deferred(|s| {
|
||||
for player in s.players.clone() {
|
||||
s.spawn_player_server(player.id);
|
||||
s.spawn_player_server(player.id());
|
||||
}
|
||||
s.spawn_ball(None, None, None);
|
||||
});
|
||||
@ -396,7 +400,7 @@ impl Game {
|
||||
&& let Some(character) = &mut player.character
|
||||
{
|
||||
character.dyn_bind_mut().swap_weapon(weapon_type);
|
||||
let player_id = player.id;
|
||||
let player_id = player.id();
|
||||
self.run_deferred(move |_| {
|
||||
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||
&& let PeerKind::Server(peer, _) = peer
|
||||
@ -464,15 +468,15 @@ impl Game {
|
||||
// Method called on the client-side whenever a player has spawned
|
||||
pub fn spawn_player_client(&mut self, id: u16, transform: NetTransform) {
|
||||
if let Some(map) = &mut self.current_map {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == id) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == id) {
|
||||
if let Some(character) = &mut player.character {
|
||||
// This is a respawn, delete old character
|
||||
character.queue_free();
|
||||
}
|
||||
|
||||
let character = map.bind_mut().spawn_player(
|
||||
player.id,
|
||||
player.id == self.self_id.unwrap_or(0),
|
||||
player.id(),
|
||||
player.id() == self.self_id.unwrap_or(0),
|
||||
Some(transform),
|
||||
);
|
||||
player.character = character;
|
||||
@ -495,8 +499,8 @@ impl Game {
|
||||
},
|
||||
) in sync_data
|
||||
{
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == player_id) {
|
||||
if player.id != self.self_id.unwrap_or(0) {
|
||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
||||
if player.id() != self.self_id.unwrap_or(0) {
|
||||
// Sync remote players always
|
||||
player.set_transform(transform);
|
||||
player.set_move_dir(movement_direction);
|
||||
@ -541,7 +545,7 @@ impl Game {
|
||||
) -> bool {
|
||||
let self_id = self.self_id.clone().unwrap_or(0);
|
||||
if let Some(player) = self.find_player_mut(player_id) {
|
||||
if player.id != self_id {
|
||||
if player.id() != self_id {
|
||||
player.try_shoot(to, transform, look_up, deal_damage)
|
||||
} else {
|
||||
false
|
||||
@ -590,10 +594,8 @@ impl Game {
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Player {
|
||||
pub id: u16,
|
||||
pub connection_addr: SocketAddr,
|
||||
pub name: String,
|
||||
pub ping: u128,
|
||||
pub data: NetPlayer,
|
||||
pub ready: bool,
|
||||
pub character: Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>>,
|
||||
}
|
||||
@ -688,6 +690,10 @@ impl Player {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn id(&self) -> u16 {
|
||||
self.data.id
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
@ -695,15 +701,14 @@ pub struct NetPlayer {
|
||||
pub id: u16,
|
||||
pub name: String,
|
||||
pub ping: u128,
|
||||
pub team: u8,
|
||||
}
|
||||
|
||||
impl From<NetPlayer> for Player {
|
||||
fn from(value: NetPlayer) -> Self {
|
||||
Player {
|
||||
id: value.id,
|
||||
connection_addr: SocketAddr::from(([0, 0, 0, 0], 0)),
|
||||
name: value.name,
|
||||
ping: value.ping,
|
||||
data: value,
|
||||
ready: false,
|
||||
character: None,
|
||||
}
|
||||
@ -712,10 +717,6 @@ impl From<NetPlayer> for Player {
|
||||
|
||||
impl From<Player> for NetPlayer {
|
||||
fn from(value: Player) -> Self {
|
||||
NetPlayer {
|
||||
id: value.id,
|
||||
name: value.name,
|
||||
ping: value.ping,
|
||||
}
|
||||
value.data
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,8 +90,8 @@ impl INode for NetworkManager {
|
||||
.cloned();
|
||||
if let Some(player) = player {
|
||||
game.bind_mut()
|
||||
.update_player_ping(player.id, connection.ping.as_millis());
|
||||
pings.insert(player.id, connection.ping.as_millis());
|
||||
.update_player_ping(player.id(), connection.ping.as_millis());
|
||||
pings.insert(player.id(), connection.ping.as_millis());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,7 +212,7 @@ impl NetworkManager {
|
||||
let player_id = game
|
||||
.bind()
|
||||
.find_player_by_addr(&connection.address)
|
||||
.map(|p| p.id);
|
||||
.map(|p| p.id());
|
||||
if let Some(player_id) = player_id {
|
||||
peer.broadcast_reliable(Package::PlayerLeft(
|
||||
game.bind().find_player(player_id).unwrap().clone().into(),
|
||||
@ -234,10 +234,10 @@ impl NetworkManager {
|
||||
game.bind().find_player_by_addr(&conn.address).cloned();
|
||||
if let Some(player) = player {
|
||||
peer.broadcast_reliable(Package::SetNick(
|
||||
player.id,
|
||||
player.id(),
|
||||
nick.clone(),
|
||||
));
|
||||
game.bind_mut().update_player_nick(player.id, nick);
|
||||
game.bind_mut().update_player_nick(player.id(), nick);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -246,8 +246,11 @@ impl NetworkManager {
|
||||
let player =
|
||||
game.bind().find_player_by_addr(&conn.address).cloned();
|
||||
if let Some(player) = player {
|
||||
game.bind_mut().update_player_ready(player.id, is_ready);
|
||||
peer.broadcast_reliable(Package::SetReady(player.id, is_ready));
|
||||
game.bind_mut().update_player_ready(player.id(), is_ready);
|
||||
peer.broadcast_reliable(Package::SetReady(
|
||||
player.id(),
|
||||
is_ready,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,7 +260,7 @@ impl NetworkManager {
|
||||
if let Some(transform) = player.get_transform() {
|
||||
peer.send_reliable(
|
||||
&conn.address,
|
||||
Package::SpawnPlayer(player.id, transform),
|
||||
Package::SpawnPlayer(player.id(), transform),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -277,8 +280,8 @@ impl NetworkManager {
|
||||
let player =
|
||||
game.bind().find_player_by_addr(&conn.address).cloned();
|
||||
if let Some(player) = player {
|
||||
game.bind_mut().handle_jump(player.id);
|
||||
peer.broadcast_reliable(Package::Jump(player.id));
|
||||
game.bind_mut().handle_jump(player.id());
|
||||
peer.broadcast_reliable(Package::Jump(player.id()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -288,14 +291,17 @@ impl NetworkManager {
|
||||
game.bind().find_player_by_addr(&conn.address).cloned();
|
||||
if let Some(player) = player {
|
||||
if game.bind_mut().handle_shoot(
|
||||
player.id,
|
||||
player.id(),
|
||||
to.into(),
|
||||
transform,
|
||||
look_up,
|
||||
true,
|
||||
) {
|
||||
peer.broadcast_reliable(Package::Shoot(
|
||||
player.id, to, transform, look_up,
|
||||
player.id(),
|
||||
to,
|
||||
transform,
|
||||
look_up,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,7 +143,7 @@ impl LobbyPanel {
|
||||
for player in &game.bind().players {
|
||||
if let Some(node) = prefab.instantiate() {
|
||||
let mut listing = node.cast::<PlayerListing>();
|
||||
listing.bind_mut().player_id = Some(player.id);
|
||||
listing.bind_mut().player_id = Some(player.id());
|
||||
listing.bind_mut().update_teams(game.bind().get_teams());
|
||||
listing.bind_mut().update();
|
||||
list.add_child(&listing);
|
||||
|
||||
@ -29,7 +29,10 @@ impl PlayerListing {
|
||||
&& let Some(player) = game.bind().find_player(*player_id)
|
||||
{
|
||||
if let Some(player_label) = &mut self.name_label {
|
||||
player_label.set_text(&format!("{} ({})", player.name, player.connection_addr));
|
||||
player_label.set_text(&format!(
|
||||
"{} ({})",
|
||||
player.data.name, player.connection_addr
|
||||
));
|
||||
}
|
||||
|
||||
if let Some(ready_label) = &mut self.ready_label {
|
||||
@ -41,7 +44,7 @@ impl PlayerListing {
|
||||
}
|
||||
|
||||
if let Some(ping_label) = &mut self.ping_label {
|
||||
ping_label.set_text(&format!("({}ms)", player.ping));
|
||||
ping_label.set_text(&format!("({}ms)", player.data.ping));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -53,7 +56,13 @@ impl PlayerListing {
|
||||
for team in teams.iter_shared() {
|
||||
dropdown.add_item(&team.bind().name);
|
||||
}
|
||||
dropdown.select(prev_selection);
|
||||
dropdown.select(prev_selection.min((teams.len() - 1) as i32));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn select_team(&mut self, team: u8) {
|
||||
if let Some(dropdown) = &mut self.team_dropdown {
|
||||
dropdown.select(team as i32);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user