Fix all self_id uses for headless server

This commit is contained in:
Sofia 2026-08-14 21:59:47 +03:00
parent b6278cbc5a
commit c910946151
9 changed files with 73 additions and 27 deletions

View File

@ -442,7 +442,8 @@ impl Game {
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
&& let PeerKind::Server(peer, _) = peer && let PeerKind::Server(peer, _) = peer
&& let Some(player) = self.find_player_mut(self.self_id.unwrap_or(0)) && let Some(self_id) = self.self_id
&& let Some(player) = self.find_player_mut(self_id)
{ {
player.data.ready = true; player.data.ready = true;
peer.broadcast_reliable(Package::SetReady(player.id(), true)); peer.broadcast_reliable(Package::SetReady(player.id(), true));
@ -901,7 +902,9 @@ impl Game {
} }
pub fn spawn_player_server(&mut self, id: u16) -> Option<DynGd<CharacterBody3D, dyn IPlayer>> { pub fn spawn_player_server(&mut self, id: u16) -> Option<DynGd<CharacterBody3D, dyn IPlayer>> {
if id == self.self_id.unwrap_or(0) { if let Some(self_id) = self.self_id
&& id == self_id
{
self.stop_playback(); self.stop_playback();
} }
@ -921,9 +924,13 @@ impl Game {
if let Some(mut map) = self.current_map.clone() { if let Some(mut map) = self.current_map.clone() {
let team = self.find_player(id).map(|p| p.data.team).unwrap_or(0); let team = self.find_player(id).map(|p| p.data.team).unwrap_or(0);
let mut character = let mut character = map.bind_mut().spawn_player(
map.bind_mut() id,
.spawn_player(id, team, id == self.self_id.unwrap_or(0), None, true); team,
self.self_id.map(|self_id| self_id == id).unwrap_or(false),
None,
true,
);
if let Some(character) = &character if let Some(character) = &character
&& let Some(player) = self.find_player_mut(id) && let Some(player) = self.find_player_mut(id)
@ -995,7 +1002,9 @@ impl Game {
// Method called on the client-side whenever a player has spawned // Method called on the client-side whenever a player has spawned
pub fn spawn_player_client(&mut self, id: u16, transform: NetTransform) { pub fn spawn_player_client(&mut self, id: u16, transform: NetTransform) {
if id == self.self_id.unwrap_or(0) { if let Some(self_id) = self.self_id
&& id == self_id
{
self.stop_playback(); self.stop_playback();
} }
@ -1014,10 +1023,13 @@ impl Game {
character.queue_free(); character.queue_free();
} }
let player_id = player.id();
let mut character = map.bind_mut().spawn_player( let mut character = map.bind_mut().spawn_player(
player.id(), player.id(),
player.data.team, player.data.team,
player.id() == self.self_id.unwrap_or(0), self.self_id
.map(|self_id| self_id == player_id)
.unwrap_or(false),
Some(transform), Some(transform),
true, true,
); );
@ -1071,7 +1083,8 @@ impl Game {
telegrenade.set_linear_velocity(telegrenade_sync.velocity.into()); telegrenade.set_linear_velocity(telegrenade_sync.velocity.into());
} }
if player.id() != self.self_id.unwrap_or(0) { let player_id = player.id();
if self.self_id.map(|id| id != player_id).unwrap_or(true) {
// Sync remote players always // Sync remote players always
player.set_transform(transform); player.set_transform(transform);
player.set_move_dir(movement_direction); player.set_move_dir(movement_direction);
@ -1103,7 +1116,11 @@ impl Game {
// Handle a jump, either from the server or from a client // Handle a jump, either from the server or from a client
pub fn handle_jump(&mut self, player_id: u16) { pub fn handle_jump(&mut self, player_id: u16) {
if player_id != self.self_id.unwrap_or(0) { if self
.self_id
.map(|self_id| self_id != player_id)
.unwrap_or(true)
{
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()
@ -1143,8 +1160,11 @@ impl Game {
look_up: f32, look_up: f32,
deal_damage: bool, deal_damage: bool,
) -> bool { ) -> bool {
let self_id = self.self_id.clone().unwrap_or(0); if self
if player_id != self_id { .self_id
.map(|self_id| self_id != player_id)
.unwrap_or(true)
{
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()
@ -1170,8 +1190,11 @@ impl Game {
look_up: f32, look_up: f32,
deal_damage: bool, deal_damage: bool,
) -> bool { ) -> bool {
let self_id = self.self_id.clone().unwrap_or(0); if self
if player_id != self_id { .self_id
.map(|self_id| self_id != player_id)
.unwrap_or(true)
{
if let Some(recorder) = &mut self.replay_recorder { if let Some(recorder) = &mut self.replay_recorder {
recorder recorder
.bind_mut() .bind_mut()

View File

@ -85,7 +85,8 @@ impl Goal {
if let Some(game) = Game::singleton() if let Some(game) = Game::singleton()
&& let Some(ball_holder) = game.bind().ball_holder && let Some(ball_holder) = game.bind().ball_holder
&& let Some(player) = game.bind().find_player(ball_holder) && let Some(player) = game.bind().find_player(ball_holder)
&& ball_holder == game.bind().self_id.unwrap_or(0) && let Some(self_id) = game.bind().self_id
&& ball_holder == self_id
&& player.data.team != self.team && player.data.team != self.team
{ {
icon.set_visible(true); icon.set_visible(true);

View File

@ -313,15 +313,17 @@ impl NetworkManager {
} }
PeerKind::Server(peer, ..) => { PeerKind::Server(peer, ..) => {
let player_id = if let Some(game) = Game::singleton() { let player_id = if let Some(game) = Game::singleton() {
game.bind().self_id.unwrap_or(0) game.bind().self_id
} else { } else {
0 None
}; };
if let Some(player_id) = player_id {
peer.broadcast_reliable(Package::SetNick(player_id, nick)); peer.broadcast_reliable(Package::SetNick(player_id, nick));
} }
} }
} }
} }
}
pub fn kick(&mut self, socket_addr: &SocketAddr) { pub fn kick(&mut self, socket_addr: &SocketAddr) {
if let Some(peer) = &mut self.peer { if let Some(peer) = &mut self.peer {

View File

@ -119,7 +119,12 @@ impl NetworkManager {
} }
Package::NewPlayer(player) => { Package::NewPlayer(player) => {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
if player.id != game.bind().self_id.unwrap_or(u16::MAX) { if game
.bind()
.self_id
.map(|id| player.id != id)
.unwrap_or(true)
{
game.bind_mut().new_player( game.bind_mut().new_player(
SocketAddr::from(([0, 0, 0, 0], 0)), SocketAddr::from(([0, 0, 0, 0], 0)),
Some(player.name), Some(player.name),
@ -130,7 +135,12 @@ impl NetworkManager {
} }
Package::PlayerLeft(player) => { Package::PlayerLeft(player) => {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
if player.id != game.bind().self_id.unwrap_or(u16::MAX) { if game
.bind()
.self_id
.map(|id| player.id != id)
.unwrap_or(true)
{
game.bind_mut().remove_player(player.id); game.bind_mut().remove_player(player.id);
} }
} }
@ -264,7 +274,12 @@ impl NetworkManager {
} }
Package::ThrowTelegrenade(player_id, to) => { Package::ThrowTelegrenade(player_id, to) => {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
if player_id != game.bind().self_id.unwrap_or(0) { if game
.bind()
.self_id
.map(|id| player_id != id)
.unwrap_or(true)
{
game.bind_mut().on_throw_telegrenade(player_id, to); game.bind_mut().on_throw_telegrenade(player_id, to);
} }
} }

View File

@ -426,7 +426,8 @@ impl ICharacterBody3D for RemotePlayer {
self.run_deferred(|s| { self.run_deferred(|s| {
if let Some(game) = Game::singleton() if let Some(game) = Game::singleton()
&& let Some(self_player) = game.bind().find_player(game.bind().self_id.unwrap_or(0)) && let Some(self_id) = game.bind().self_id
&& let Some(self_player) = game.bind().find_player(self_id)
&& let Some(remote_player) = game.bind().find_player(s.player_id.unwrap_or(0)) && let Some(remote_player) = game.bind().find_player(s.player_id.unwrap_or(0))
&& self_player.data.team == remote_player.data.team && self_player.data.team == remote_player.data.team
&& let Some(sprite) = &mut s.shield_sprite && let Some(sprite) = &mut s.shield_sprite

View File

@ -145,9 +145,11 @@ impl ChatBox {
PeerKind::Server(..) => { PeerKind::Server(..) => {
self.run_deferred(move |_| { self.run_deferred(move |_| {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
let self_id = game.bind().self_id; let self_id = game.bind().self_id.clone();
if let Some(self_id) = self_id {
game.bind_mut() game.bind_mut()
.on_chat_message(self_id.unwrap_or(0), message.to_string()); .on_chat_message(self_id, message.to_string());
}
} }
}); });
} }

View File

@ -346,7 +346,8 @@ impl LobbyPanel {
pub fn update_players(&mut self, replace: bool) { pub fn update_players(&mut self, replace: bool) {
if let Some(game) = &Game::singleton() if let Some(game) = &Game::singleton()
&& let Some(player) = game.bind().find_player(game.bind().self_id.unwrap_or(0)) && let Some(self_id) = game.bind().self_id
&& let Some(player) = game.bind().find_player(self_id)
&& let Some(name_label) = &mut self.name_field && let Some(name_label) = &mut self.name_field
{ {
if player.data.name != name_label.get_text().to_string() { if player.data.name != name_label.get_text().to_string() {

View File

@ -75,9 +75,10 @@ impl IGridContainer for LobbyPlayerListing {
PeerKind::Server(..) => { PeerKind::Server(..) => {
if let Some(player_id) = self.player_id if let Some(player_id) = self.player_id
&& let Some(game) = Game::singleton() && let Some(game) = Game::singleton()
&& let Some(self_id) = game.bind().self_id
{ {
// Hide kick button for self even if host // Hide kick button for self even if host
if player_id == game.bind().self_id.unwrap_or(0) { if player_id == self_id {
kick_btn.hide(); kick_btn.hide();
} }
} }

View File

@ -89,7 +89,7 @@ impl PlayerListing {
pub fn update(&mut self) { pub fn update(&mut self) {
if let Some(player_id) = self.player_id { if let Some(player_id) = self.player_id {
if let Some(game) = Game::singleton() { if let Some(game) = Game::singleton() {
let is_self = player_id == game.bind().self_id.unwrap_or(0); let is_self = game.bind().self_id.map(|s| s == player_id).unwrap_or(false);
if let Some(player) = game.bind().find_player(player_id) { if let Some(player) = game.bind().find_player(player_id) {
if let Some(name_label) = &mut self.name_label { if let Some(name_label) = &mut self.name_label {
name_label.set_text(&player.data.name); name_label.set_text(&player.data.name);