mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Server GUI 2
This commit is contained in:
parent
ca9c75a499
commit
d49dd5b55d
20
server-gui/Cargo.toml
Normal file
20
server-gui/Cargo.toml
Normal file
@ -0,0 +1,20 @@
|
||||
[package]
|
||||
name = "server-gui"
|
||||
version = "0.7.0"
|
||||
authors = ["Joshua Barretto <joshua.s.barretto@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
[features]
|
||||
worldgen = ["server/worldgen"]
|
||||
default = ["worldgen"]
|
||||
|
||||
[dependencies]
|
||||
server = { package = "veloren-server", path = "../server", default-features = false }
|
||||
common = { package = "veloren-common", path = "../common" }
|
||||
world = { package = "veloren-world", path = "../world" }
|
||||
|
||||
tracing = { version = "0.1", default-features = false }
|
||||
tracing-subscriber = { version = "0.2.3", default-features = false, features = ["env-filter", "fmt", "chrono", "ansi", "smallvec"] }
|
||||
vek = { version = "0.12.0", features = ["platform_intrinsics", "serde"] }
|
||||
|
||||
iced = { git = "https://github.com/hecrj/iced.git", features = ["image", "debug", "tokio"] }
|
169
server-gui/src/main.rs
Normal file
169
server-gui/src/main.rs
Normal file
@ -0,0 +1,169 @@
|
||||
#![deny(unsafe_code)]
|
||||
|
||||
use common::clock::Clock;
|
||||
use iced::{
|
||||
executor, image, scrollable, Align, Application, Command, Element, Image, Length, Scrollable,
|
||||
Settings, Subscription,
|
||||
};
|
||||
use server::{Event, Input, Server, ServerSettings};
|
||||
use std::{
|
||||
sync::{Arc, Mutex},
|
||||
thread::{self, JoinHandle},
|
||||
time::Duration,
|
||||
};
|
||||
use tracing::{info, Level};
|
||||
use tracing_subscriber::{filter::LevelFilter, EnvFilter, FmtSubscriber};
|
||||
|
||||
struct Gui {
|
||||
server: Arc<Mutex<Server>>,
|
||||
server_worker: JoinHandle<()>,
|
||||
scroll: scrollable::State,
|
||||
map_image: image::Handle,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum Message {}
|
||||
|
||||
impl Application for Gui {
|
||||
type Executor = executor::Default;
|
||||
type Flags = ();
|
||||
type Message = Message;
|
||||
|
||||
fn new(_flags: Self::Flags) -> (Self, Command<Self::Message>) {
|
||||
// Create server
|
||||
let server =
|
||||
Server::new(ServerSettings::load()).expect("Failed to create server instance!");
|
||||
|
||||
// Create image of map
|
||||
let map_image = {
|
||||
let sz = server.map().dimensions_lg.map(|e| 1 << e);
|
||||
let max_height = server.map().max_height;
|
||||
let bytes = server.map().rgba
|
||||
.iter()
|
||||
//.map(|px| (0..4).map(move |i| (((*px & ((1 << 15) - 1)) >> 2) as f32 * 255.0 / max_height) as u8))
|
||||
.map(|px| {
|
||||
let rgba = px.to_le_bytes();
|
||||
let b = [rgba[2], rgba[1], rgba[0], 0xFF];
|
||||
(0..4).map(move |i| b[i])
|
||||
})
|
||||
.flatten()
|
||||
.collect::<Vec<_>>();
|
||||
image::Handle::from_pixels(sz.x, sz.y, bytes)
|
||||
};
|
||||
|
||||
let server = Arc::new(Mutex::new(server));
|
||||
|
||||
// Start server worker
|
||||
let server_worker = {
|
||||
let server = server.clone();
|
||||
thread::spawn(|| server_worker(server))
|
||||
};
|
||||
|
||||
(
|
||||
Gui {
|
||||
server,
|
||||
server_worker,
|
||||
scroll: scrollable::State::default(),
|
||||
map_image,
|
||||
},
|
||||
Command::none(),
|
||||
)
|
||||
}
|
||||
|
||||
fn title(&self) -> String { "Veloren Server".to_string() }
|
||||
|
||||
fn update(&mut self, msg: Self::Message) -> Command<Self::Message> {
|
||||
match msg {}
|
||||
|
||||
//Command::none()
|
||||
}
|
||||
|
||||
fn subscription(&self) -> Subscription<Self::Message> { Subscription::none() }
|
||||
|
||||
fn view(&mut self) -> Element<Self::Message> {
|
||||
Scrollable::new(&mut self.scroll)
|
||||
.align_items(Align::Center)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.push(
|
||||
Image::new(self.map_image.clone())
|
||||
.width(Length::Units(4096))
|
||||
.height(Length::Units(4096)),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
fn server_worker(server: Arc<Mutex<Server>>) {
|
||||
const TPS: u64 = 30;
|
||||
const RUST_LOG_ENV: &str = "RUST_LOG";
|
||||
|
||||
info!("Starting server...");
|
||||
|
||||
// Set up an fps clock
|
||||
let mut clock = Clock::start();
|
||||
|
||||
info!("Server is ready to accept connections.");
|
||||
let game_addr = server.lock().unwrap().settings().gameserver_address.port();
|
||||
info!(?game_addr, "starting server at port");
|
||||
let metrics_addr = server.lock().unwrap().settings().metrics_address.port();
|
||||
info!(?metrics_addr, "starting metrics at port");
|
||||
|
||||
loop {
|
||||
let events = {
|
||||
let mut server = server.lock().unwrap();
|
||||
|
||||
let events = server
|
||||
.tick(Input::default(), clock.get_last_delta())
|
||||
.expect("Failed to tick server");
|
||||
|
||||
// Clean up the server after a tick.
|
||||
server.cleanup();
|
||||
|
||||
events
|
||||
};
|
||||
|
||||
for event in events {
|
||||
match event {
|
||||
Event::ClientConnected { entity: _ } => info!("Client connected!"),
|
||||
Event::ClientDisconnected { entity: _ } => info!("Client disconnected!"),
|
||||
Event::Chat { entity: _, msg } => info!("[Client] {}", msg),
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for the next tick.
|
||||
clock.tick(Duration::from_millis(1000 / TPS));
|
||||
}
|
||||
}
|
||||
|
||||
const TPS: u64 = 30;
|
||||
const RUST_LOG_ENV: &str = "RUST_LOG";
|
||||
|
||||
fn main() {
|
||||
// Init logging
|
||||
let filter = match std::env::var_os(RUST_LOG_ENV).map(|s| s.into_string()) {
|
||||
Some(Ok(env)) => {
|
||||
let mut filter = EnvFilter::new("veloren_world::sim=info")
|
||||
.add_directive("veloren_world::civ=info".parse().unwrap())
|
||||
.add_directive(LevelFilter::INFO.into());
|
||||
for s in env.split(',').into_iter() {
|
||||
match s.parse() {
|
||||
Ok(d) => filter = filter.add_directive(d),
|
||||
Err(err) => println!("WARN ignoring log directive: `{}`: {}", s, err),
|
||||
};
|
||||
}
|
||||
filter
|
||||
},
|
||||
_ => EnvFilter::from_env(RUST_LOG_ENV)
|
||||
.add_directive("veloren_world::sim=info".parse().unwrap())
|
||||
.add_directive("veloren_world::civ=info".parse().unwrap())
|
||||
.add_directive(LevelFilter::INFO.into()),
|
||||
};
|
||||
|
||||
FmtSubscriber::builder()
|
||||
.with_max_level(Level::ERROR)
|
||||
.with_env_filter(filter)
|
||||
.init();
|
||||
|
||||
Gui::run(Settings::default())
|
||||
}
|
Loading…
Reference in New Issue
Block a user