fix in lobby ship select #123
@ -1,3 +1,4 @@
|
|||||||
|
use async_std::sync::{Arc, RwLock};
|
||||||
use libpso::packet::ship::*;
|
use libpso::packet::ship::*;
|
||||||
use libpso::packet::login::RedirectClient;
|
use libpso::packet::login::RedirectClient;
|
||||||
use crate::common::serverstate::ClientId;
|
use crate::common::serverstate::ClientId;
|
||||||
@ -5,17 +6,27 @@ use crate::common::interserver::Ship;
|
|||||||
use crate::ship::ship::{SendShipPacket, ShipError};
|
use crate::ship::ship::{SendShipPacket, ShipError};
|
||||||
use crate::ship::packet::builder;
|
use crate::ship::packet::builder;
|
||||||
|
|
||||||
pub fn ship_list(id: ClientId, ship_list: &[Ship]) -> Vec<(ClientId, SendShipPacket)> {
|
pub async fn ship_list(id: ClientId, ship_list: &Arc<RwLock<Vec<Ship>>>) -> Vec<(ClientId, SendShipPacket)> {
|
||||||
vec![(id, SendShipPacket::ShipList(builder::ship::ship_list(ship_list)))]
|
let ship_list = ship_list
|
||||||
|
.read()
|
||||||
|
.await
|
||||||
|
.clone();
|
||||||
|
vec![(id, SendShipPacket::ShipList(builder::ship::ship_list(&ship_list)))]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn block_list(id: ClientId, shipname: &str, num_blocks: usize) -> Vec<(ClientId, SendShipPacket)> {
|
pub fn block_list(id: ClientId, shipname: &str, num_blocks: usize) -> Vec<(ClientId, SendShipPacket)> {
|
||||||
vec![(id, SendShipPacket::ShipBlockList(ShipBlockList::new(shipname, num_blocks)))]
|
vec![(id, SendShipPacket::ShipBlockList(ShipBlockList::new(shipname, num_blocks)))]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn selected_ship(id: ClientId, menuselect: MenuSelect, ship_list: &[Ship])
|
pub async fn selected_ship(id: ClientId, menuselect: MenuSelect, ship_list: &Arc<RwLock<Vec<Ship>>>)
|
||||||
-> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
|
-> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
|
||||||
let ship = ship_list.get(menuselect.item as usize).ok_or_else(|| ShipError::InvalidShip(menuselect.item as usize))?;
|
let (ip, port) = ship_list
|
||||||
let ip = u32::from_ne_bytes(ship.ip.octets());
|
.read()
|
||||||
Ok(vec![(id, SendShipPacket::RedirectClient(RedirectClient::new(ip, ship.port)))])
|
.await
|
||||||
|
.get(menuselect.item as usize)
|
||||||
|
.map(|ship| {
|
||||||
|
(u32::from_ne_bytes(ship.ip.octets()), ship.port)
|
||||||
|
})
|
||||||
|
.ok_or_else(|| ShipError::InvalidShip(menuselect.item as usize))?;
|
||||||
|
Ok(vec![(id, SendShipPacket::RedirectClient(RedirectClient::new(ip, port)))])
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ use std::net::Ipv4Addr;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use async_std::channel;
|
use async_std::channel;
|
||||||
use async_std::sync::{Arc, Mutex};
|
use async_std::sync::{Arc, Mutex, RwLock};
|
||||||
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
@ -449,7 +449,7 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerStateBuilder<EG> {
|
|||||||
event: self.event.unwrap_or(ShipEvent::None),
|
event: self.event.unwrap_or(ShipEvent::None),
|
||||||
|
|
||||||
auth_token: self.auth_token.unwrap_or_else(|| AuthToken("".into())),
|
auth_token: self.auth_token.unwrap_or_else(|| AuthToken("".into())),
|
||||||
ship_list: Vec::new(),
|
ship_list: Arc::new(RwLock::new(Vec::new())),
|
||||||
shipgate_sender: None,
|
shipgate_sender: None,
|
||||||
trades: Default::default(),
|
trades: Default::default(),
|
||||||
}
|
}
|
||||||
@ -492,7 +492,7 @@ pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
|||||||
port: u16,
|
port: u16,
|
||||||
|
|
||||||
auth_token: AuthToken,
|
auth_token: AuthToken,
|
||||||
ship_list: Vec<Ship>,
|
ship_list: Arc<RwLock<Vec<Ship>>>,
|
||||||
shipgate_sender: Option<channel::Sender<ShipMessage>>,
|
shipgate_sender: Option<channel::Sender<ShipMessage>>,
|
||||||
trades: TradeState,
|
trades: TradeState,
|
||||||
}
|
}
|
||||||
@ -666,7 +666,7 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> {
|
|||||||
match menuselect.menu {
|
match menuselect.menu {
|
||||||
SHIP_MENU_ID => {
|
SHIP_MENU_ID => {
|
||||||
let leave_lobby = handler::lobby::remove_from_lobby(id, &mut block.client_location).await.into_iter().into_iter().flatten();
|
let leave_lobby = handler::lobby::remove_from_lobby(id, &mut block.client_location).await.into_iter().into_iter().flatten();
|
||||||
let select_ship = handler::ship::selected_ship(id, menuselect, &self.ship_list)?;
|
let select_ship = handler::ship::selected_ship(id, menuselect, &self.ship_list).await?;
|
||||||
leave_lobby.chain(select_ship).collect()
|
leave_lobby.chain(select_ship).collect()
|
||||||
}
|
}
|
||||||
BLOCK_MENU_ID => {
|
BLOCK_MENU_ID => {
|
||||||
@ -784,7 +784,7 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> {
|
|||||||
handler::settings::save_options(id, save_options, &self.clients, &mut self.entity_gateway).await?
|
handler::settings::save_options(id, save_options, &self.clients, &mut self.entity_gateway).await?
|
||||||
},
|
},
|
||||||
RecvShipPacket::RequestShipList(_) => {
|
RecvShipPacket::RequestShipList(_) => {
|
||||||
handler::ship::ship_list(id, &self.ship_list)
|
handler::ship::ship_list(id, &self.ship_list).await
|
||||||
},
|
},
|
||||||
RecvShipPacket::RequestShipBlockList(_) => {
|
RecvShipPacket::RequestShipBlockList(_) => {
|
||||||
handler::ship::block_list(id, &self.name, self.blocks.0.len())
|
handler::ship::block_list(id, &self.name, self.blocks.0.len())
|
||||||
@ -865,8 +865,12 @@ impl<EG: EntityGateway + Clone> InterserverActor for ShipServerState<EG> {
|
|||||||
LoginMessage::SendMail{..} => {
|
LoginMessage::SendMail{..} => {
|
||||||
Ok(Vec::new())
|
Ok(Vec::new())
|
||||||
},
|
},
|
||||||
LoginMessage::ShipList{ships} => {
|
LoginMessage::ShipList{mut ships} => {
|
||||||
self.ship_list = ships;
|
let mut ship_list = self.ship_list
|
||||||
|
.write()
|
||||||
|
.await;
|
||||||
|
ship_list.clear();
|
||||||
|
ship_list.append(&mut ships);
|
||||||
Ok(Vec::new())
|
Ok(Vec::new())
|
||||||
},
|
},
|
||||||
LoginMessage::RequestUsers => {
|
LoginMessage::RequestUsers => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user