aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dimension.rs8
-rw-r--r--src/main.rs37
-rw-r--r--src/viewer/mod.rs28
3 files changed, 60 insertions, 13 deletions
diff --git a/src/dimension.rs b/src/dimension.rs
index 39a7fff..6c3bea8 100644
--- a/src/dimension.rs
+++ b/src/dimension.rs
@@ -1,6 +1,6 @@
use chashmap::{CHashMap, ReadGuard, WriteGuard};
use fastanvil::{Block, Chunk, CurrentJavaChunk, Region, RegionFileLoader, RegionLoader};
-use log::{info, debug};
+use log::{debug, info};
use std::{fs::File, path::Path};
pub struct Dimension {
@@ -8,6 +8,7 @@ pub struct Dimension {
regions: CHashMap<(isize, isize), Option<Region<File>>>,
chunks: CHashMap<(isize, isize), Option<CurrentJavaChunk>>,
}
+
impl Dimension {
pub fn new(path: &str) -> Self {
let loader = fastanvil::RegionFileLoader::new(Path::new(path).to_path_buf());
@@ -17,6 +18,7 @@ impl Dimension {
chunks: Default::default(),
}
}
+
pub fn region(
&self,
rx: isize,
@@ -34,6 +36,7 @@ impl Dimension {
self.region(rx, rz)
}
}
+
pub fn chunk(
&self,
cx: isize,
@@ -55,10 +58,11 @@ impl Dimension {
self.chunk(cx, cz)
}
}
+
pub fn block(&self, x: isize, y: isize, z: isize) -> Option<Block> {
self.chunk(x / 16, z / 16)
.as_ref()?
- .block(x.rem_euclid(16) as usize, y, z.rem_euclid(16) as usize)
+ .block((x % 16).abs() as usize, y, (z % 16).abs() as usize)
.map(|e| e.to_owned())
}
}
diff --git a/src/main.rs b/src/main.rs
index 9757748..ce1906e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,9 +1,28 @@
pub mod dimension;
pub mod render;
+pub mod viewer;
-use crate::dimension::Dimension;
-use log::info;
-use render::Renderer;
+use clap::{Parser, Subcommand};
+use std::{net::SocketAddr, path::PathBuf};
+use viewer::serve_http;
+
+#[derive(Parser)]
+struct Args {
+ /// Dimension directory containing .mca files
+ #[clap(long, short, default_value = "./world/region")]
+ dimension: PathBuf,
+
+ #[clap(subcommand)]
+ action: Action,
+}
+#[derive(Subcommand)]
+enum Action {
+ /// Run a http server providing an interactive map viewer.
+ Serve {
+ #[arg(long, short, default_value = "127.0.0.1:8080")]
+ bind: SocketAddr,
+ },
+}
fn main() {
env_logger::builder()
@@ -11,13 +30,9 @@ fn main() {
.parse_env("LOG")
.init();
- let dim = Dimension::new("/home/muffin/containers/games/home/user/server/world/region/");
- let renderer = Renderer::new(dim);
- for sx in 0..2 {
- for sy in 0..2 {
- let view = renderer.render_segment(sx, sy);
- info!("saving png");
- view.save(format!("/tmp/seg.{sx}.{sy}.png")).unwrap();
- }
+ let args = Args::parse();
+
+ match args.action {
+ Action::Serve { bind } => serve_http(bind),
}
}
diff --git a/src/viewer/mod.rs b/src/viewer/mod.rs
new file mode 100644
index 0000000..6ea540b
--- /dev/null
+++ b/src/viewer/mod.rs
@@ -0,0 +1,28 @@
+use std::net::SocketAddr;
+
+use warp::Filter;
+
+pub fn serve_http(bind: SocketAddr) {
+ tokio::runtime::Builder::new_multi_thread()
+ .enable_all()
+ .build()
+ .unwrap()
+ .block_on(async move {
+ let tiles = warp::path!("tiles" / isize / isize / isize)
+ .map(|z, x, y| format!("blub {:?}", (x, y, z)));
+
+ // let dim =
+ // Dimension::new("/home/muffin/containers/games/home/user/server/world/region/");
+ // let renderer = Renderer::new(dim);
+ // for sx in 0..2 {
+ // for sy in 0..2 {
+ // let view = renderer.render_segment(sx, sy);
+ // info!("saving png");
+ // view.save(format!("/tmp/seg.{sx}.{sy}.png")).unwrap();
+ // }
+ // }
+ let router = tiles;
+
+ warp::serve(router).run(bind).await;
+ })
+}