54 lines
2.5 KiB
Rust
54 lines
2.5 KiB
Rust
|
mod client;
|
||
|
mod interserver;
|
||
|
|
||
|
use std::time::Duration;
|
||
|
use std::pin::Pin;
|
||
|
use futures::future::{Future, join_all, FutureExt};
|
||
|
use log::{trace, info, warn};
|
||
|
use async_std::sync::{Arc, Mutex};
|
||
|
use async_std::io::prelude::{ReadExt, WriteExt};
|
||
|
use std::collections::HashMap;
|
||
|
use serde::{Serialize, Deserialize};
|
||
|
use serde::de::DeserializeOwned;
|
||
|
|
||
|
use crate::common::serverstate::{RecvServerPacket, SendServerPacket, ServerState, OnConnect};
|
||
|
use crate::common::interserver::{ServerId, InterserverActor, LoginMessage, ShipMessage};
|
||
|
use crate::common::mainloop::client::client_accept_mainloop;
|
||
|
use crate::common::mainloop::interserver::{ship_connect_mainloop, login_listen_mainloop};
|
||
|
pub use crate::common::mainloop::client::NetworkError;
|
||
|
|
||
|
use crate::patch::patch::PatchServerState;
|
||
|
use crate::login::login::LoginServerState;
|
||
|
use crate::login::character::CharacterServerState;
|
||
|
use crate::ship::ship::ShipServerState;
|
||
|
use crate::entity::gateway::entitygateway::EntityGateway;
|
||
|
|
||
|
|
||
|
|
||
|
pub fn patch_mainloop(patch_state: PatchServerState, patch_port: u16) -> Pin<Box<dyn Future<Output = ()>>> {
|
||
|
let patch_state = Arc::new(Mutex::new(patch_state));
|
||
|
let client_mainloop = client_accept_mainloop(patch_state, patch_port);
|
||
|
Box::pin(client_mainloop)
|
||
|
}
|
||
|
|
||
|
pub fn login_mainloop<EG: EntityGateway + 'static>(login_state: LoginServerState<EG>, login_port: u16, comm_port: u16) -> Pin<Box<dyn Future<Output = ()>>> {
|
||
|
let login_state = Arc::new(Mutex::new(login_state));
|
||
|
let client_mainloop = client_accept_mainloop(login_state.clone(), login_port);
|
||
|
let ship_communication_mainloop = login_listen_mainloop(login_state.clone(), comm_port);
|
||
|
Box::pin(join_all(vec![client_mainloop, ship_communication_mainloop]).map(|_| ()))
|
||
|
}
|
||
|
|
||
|
pub fn character_mainloop<EG: EntityGateway + 'static>(character_state: CharacterServerState<EG>, character_port: u16) -> Pin<Box<dyn Future<Output = ()>>> {
|
||
|
let character_state = Arc::new(Mutex::new(character_state));
|
||
|
let client_mainloop = client_accept_mainloop(character_state, character_port);
|
||
|
Box::pin(client_mainloop)
|
||
|
}
|
||
|
|
||
|
|
||
|
pub fn ship_mainloop<EG: EntityGateway + 'static>(ship_state: ShipServerState<EG>, ship_port: u16, comm_ip: std::net::Ipv4Addr, comm_port: u16) -> Pin<Box<dyn Future<Output = ()>>> {
|
||
|
let ship_state = Arc::new(Mutex::new(ship_state));
|
||
|
let client_mainloop = client_accept_mainloop(ship_state.clone(), ship_port);
|
||
|
let login_communication_mainloop = ship_connect_mainloop(ship_state.clone(), comm_ip, comm_port);
|
||
|
Box::pin(join_all(vec![client_mainloop, login_communication_mainloop]).map(|_| ()))
|
||
|
}
|