From ec7bac08edadb1cc35ddb6cd76b1309cd6ef481e Mon Sep 17 00:00:00 2001 From: illegitimate-egg Date: Tue, 25 Feb 2025 02:06:12 +0000 Subject: [PATCH] Run rust fmt --- src/main.rs | 373 +++++++++++++++++++++++++++++--------------- src/world.wrld.back | Bin 0 -> 131078 bytes wrld.hexpat | 12 ++ 3 files changed, 258 insertions(+), 127 deletions(-) create mode 100644 src/world.wrld.back create mode 100644 wrld.hexpat diff --git a/src/main.rs b/src/main.rs index 99f2ef1..0853993 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,36 +1,37 @@ +use colored::Colorize; +use flate2::write::GzEncoder; +use flate2::Compression; use std::fs::{self, File}; use std::io::prelude::*; use std::net::{SocketAddr, TcpListener, TcpStream}; -use std::thread::sleep; -use std::time::{Duration, UNIX_EPOCH}; -use std::time::SystemTime; -use std::thread; use std::sync::{Arc, Mutex}; -use flate2::Compression; -use flate2::write::GzEncoder; -use colored::Colorize; +use std::thread; +use std::thread::sleep; +use std::time::SystemTime; +use std::time::{Duration, UNIX_EPOCH}; // #[macro_use] // extern crate lazy_static; impl Default for Player { - fn default() -> Self { - Player { - id: SpecialPlayers::SelfPlayer as u8, - username: "".to_string(), - verification_key: [0; 64], - unused: 0x00, - position_x: 0, - position_y: 0, - position_z: 0, - yaw: 0, - pitch: 0, - operator: false, - outgoing_data: Vec::new() + fn default() -> Self { + Player { + id: SpecialPlayers::SelfPlayer as u8, + username: "".to_string(), + verification_key: [0; 64], + unused: 0x00, + position_x: 0, + position_y: 0, + position_z: 0, + yaw: 0, + pitch: 0, + operator: false, + outgoing_data: Vec::new(), } } } -struct Player { // Struct `Player` is never constructed `#[warn(fuck_you)]` on by default +struct Player { + // Struct `Player` is never constructed `#[warn(fuck_you)]` on by default pub id: u8, pub username: String, pub verification_key: [u8; 64], @@ -41,25 +42,25 @@ struct Player { // Struct `Player` is never constructed `#[warn(fuck_you)]` on b pub yaw: u8, pub pitch: u8, pub operator: bool, - pub outgoing_data: Vec + pub outgoing_data: Vec, } enum SpecialPlayers { - SelfPlayer = 0xFF + SelfPlayer = 0xFF, } #[derive(Copy, Clone, PartialEq)] enum PlayerStatus { Disconnected, ConnectedSelf, - Connected + Connected, } struct World { pub size_x: i16, pub size_y: i16, pub size_z: i16, - pub data: Vec + pub data: Vec, } fn build_world(size_x: i16, size_y: i16, size_z: i16) -> Vec { @@ -88,14 +89,19 @@ const SIZE_Z: i16 = 64; // lazy_static!{ // static ref WORLD: World = World { -// size_x: SIZE_X, -// size_y: SIZE_Y, -// size_z: SIZE_Z, +// size_x: SIZE_X, +// size_y: SIZE_Y, +// size_z: SIZE_Z, // data: build_world(SIZE_X, SIZE_Y, SIZE_Z) // }; // } -fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Arc>, world_arc_clone: Arc>) { +fn handle_client( + mut stream: TcpStream, + client_number: u8, + players_arc_clone: Arc>, + world_arc_clone: Arc>, +) { thread::spawn(move || { let mut player_statuses = [PlayerStatus::Disconnected; 255]; let mut immediate_join = [false; 255]; @@ -104,10 +110,10 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar for i in 0..players.len() { let current_player = &mut players[i]; match current_player.id { - 255=> { + 255 => { continue; } - _=> { + _ => { player_statuses[i] = PlayerStatus::Connected; immediate_join[i] = true; //println!("Player {} is immediate join!", i); @@ -122,13 +128,15 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar let _ = stream.read(&mut buffer); match buffer[0] { - 0x00=> { + 0x00 => { let mut payload_buffer = [0; 130]; // Byte + String + String + Byte let _ = stream.read(&mut payload_buffer); if payload_buffer[0] != 7 { // Shit pant - let _ = &mut stream.write(&client_disconnect("Something went wrong (CODE: PACKET_SKIPPED)")); + let _ = &mut stream.write(&client_disconnect( + "Something went wrong (CODE: PACKET_SKIPPED)", + )); println!("this client is wiggidy wack yo!"); break; } @@ -137,14 +145,14 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar let mut username = String::new(); for i in 0..64 { - username.push(payload_buffer[i+1] as char); + username.push(payload_buffer[i + 1] as char); } //println!("Username: {}", username); let mut verif_key = [0; 64]; for i in 0..64 { - verif_key[i] = payload_buffer[i+65]; + verif_key[i] = payload_buffer[i + 65]; } let mut verif_key_formatted = String::new(); @@ -160,7 +168,7 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar { let mut players = players_arc_clone.lock().unwrap(); let current_player = &mut players[client_number as usize]; - + current_player.id = client_number; current_player.username = username.trim().to_string(); current_player.verification_key = verif_key; @@ -184,19 +192,22 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar players[i].position_y, players[i].position_z, players[i].yaw, - players[i].pitch + players[i].pitch, )); } } } - }, - 0x05=>{ + } + 0x05 => { let mut payload_buffer = [0; 8]; // Short (2) + Short (2) + Short (2) + Byte (1) + Byte (1) let _ = stream.read(&mut payload_buffer); - let position_x = ((payload_buffer[0] as i16) << (8 as i16)) + payload_buffer[1] as i16; - let position_y = ((payload_buffer[2] as i16) << (8 as i16)) + payload_buffer[3] as i16; - let position_z = ((payload_buffer[4] as i16) << (8 as i16)) + payload_buffer[5] as i16; + let position_x = + ((payload_buffer[0] as i16) << (8 as i16)) + payload_buffer[1] as i16; + let position_y = + ((payload_buffer[2] as i16) << (8 as i16)) + payload_buffer[3] as i16; + let position_z = + ((payload_buffer[4] as i16) << (8 as i16)) + payload_buffer[5] as i16; let mode = payload_buffer[6]; let mut block_type = payload_buffer[7]; @@ -204,9 +215,14 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar let mut world_dat = world_arc_clone.lock().unwrap(); // Sanity check (Stop losers from losing) - if position_x > world_dat.size_x || position_y > world_dat.size_y || position_z > world_dat.size_z { + if position_x > world_dat.size_x + || position_y > world_dat.size_y + || position_z > world_dat.size_z + { // Fuck you! - let _ = &mut stream.write(&client_disconnect("Block position was not within world bounds, naughty boy")); + let _ = &mut stream.write(&client_disconnect( + "Block position was not within world bounds, naughty boy", + )); break; } @@ -214,8 +230,12 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar block_type = 0x00; // Air } - let world_offset: u32 = position_x as u32 + (position_z as u32 * world_dat.size_x as u32) + (position_y as u32 * world_dat.size_x as u32 * world_dat.size_z as u32); - world_dat.data[world_offset as usize] = block_type; + let world_offset: u32 = position_x as u32 + + (position_z as u32 * world_dat.size_x as u32) + + (position_y as u32 + * world_dat.size_x as u32 + * world_dat.size_z as u32); + world_dat.data[world_offset as usize] = block_type; } let mut update_block_bytes: Vec = Vec::new(); @@ -228,13 +248,15 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar let mut players = players_arc_clone.lock().unwrap(); for i in 0..players.len() { if players[i].id != 255 && players[i].id != client_number { - players[i].outgoing_data.extend_from_slice(&update_block_bytes); + players[i] + .outgoing_data + .extend_from_slice(&update_block_bytes); } } - }, - 0x08=>{ + } + 0x08 => { let mut payload_buffer = [0; 9]; // SByte + FShort (2B) + FShort + FShort + - // Byte + Byte + // Byte + Byte let _ = stream.read(&mut payload_buffer); if payload_buffer[0] != SpecialPlayers::SelfPlayer as u8 { @@ -244,15 +266,18 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar { let mut players = players_arc_clone.lock().unwrap(); let current_player = &mut players[client_number as usize]; - current_player.position_x = ((payload_buffer[1] as i16) << (8 as i16)) + payload_buffer[2] as i16; - current_player.position_y = ((payload_buffer[3] as i16) << (8 as i16)) + payload_buffer[4] as i16; - current_player.position_z = ((payload_buffer[5] as i16) << (8 as i16)) + payload_buffer[6] as i16; + current_player.position_x = + ((payload_buffer[1] as i16) << (8 as i16)) + payload_buffer[2] as i16; + current_player.position_y = + ((payload_buffer[3] as i16) << (8 as i16)) + payload_buffer[4] as i16; + current_player.position_z = + ((payload_buffer[5] as i16) << (8 as i16)) + payload_buffer[6] as i16; current_player.yaw = payload_buffer[7]; current_player.pitch = payload_buffer[8]; } - }, - 0x0D=>{ + } + 0x0D => { let mut payload_buffer = [0; 65]; // Byte + String let _ = stream.read(&mut payload_buffer); @@ -263,77 +288,91 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar let mut message = ['a'; 64]; for i in 0..64 { - message[i] = payload_buffer[i+1] as char; + message[i] = payload_buffer[i + 1] as char; } let mut players = players_arc_clone.lock().unwrap(); for i in 0..players.len() { if players[i].id != 255 && players[i].id != client_number { let sender: u8 = players[client_number as usize].id; - players[i].outgoing_data.extend_from_slice(&send_chat_message(sender, String::from_iter(message))); + players[i] + .outgoing_data + .extend_from_slice(&send_chat_message( + sender, + String::from_iter(message), + )); } } - let _ = &mut stream.write(&send_chat_message(SpecialPlayers::SelfPlayer as u8, String::from_iter(message))); + let _ = &mut stream.write(&send_chat_message( + SpecialPlayers::SelfPlayer as u8, + String::from_iter(message), + )); println!("{}", String::from_iter(message)); - }, - _=>println!("Packet {} not implemented!", buffer[0]), + } + _ => println!("Packet {} not implemented!", buffer[0]), } - let is_kill = &mut stream.write(&ping()); // Ping that MF - - if is_kill.is_err() { - break; - } + let is_kill = &mut stream.write(&ping()); // Ping that MF - sleep(Duration::from_millis(1000/1000)); // 1000 TPS TODO: Delta time - { - let mut players = players_arc_clone.lock().unwrap(); - if players[client_number as usize].outgoing_data.len() > 0 { - let _ = stream.write(&players[client_number as usize].outgoing_data); - players[client_number as usize].outgoing_data.clear(); + if is_kill.is_err() { + break; } - for i in 0..players.len() { - if players[i].id != 255 { - if player_statuses[i] == PlayerStatus::Disconnected { - let _ = stream.write(&spawn_player( + + sleep(Duration::from_millis(1000 / 1000)); // 1000 TPS TODO: Delta time + { + let mut players = players_arc_clone.lock().unwrap(); + if players[client_number as usize].outgoing_data.len() > 0 { + let _ = stream.write(&players[client_number as usize].outgoing_data); + players[client_number as usize].outgoing_data.clear(); + } + for i in 0..players.len() { + if players[i].id != 255 { + if player_statuses[i] == PlayerStatus::Disconnected { + let _ = stream.write(&spawn_player( + players[i].id, + &players[i].username, + players[i].position_x, + players[i].position_y, + players[i].position_z, + players[i].yaw, + players[i].pitch, + )); + player_statuses[i] = PlayerStatus::Connected; + let _ = stream.write(&send_chat_message( + players[i].id, + format!("{} has joined the game!", &players[i].username), + )); + } + } else { + if player_statuses[i] == PlayerStatus::Connected { + let _ = stream.write(&despawn_player(i.try_into().unwrap())); + let _ = stream.write(&send_chat_message( + i.try_into().unwrap(), + format!("{} has left the game!", &players[i].username), + )); + player_statuses[i] = PlayerStatus::Disconnected; + } + } + if player_statuses[i] == PlayerStatus::Connected { + let _ = stream.write(&set_position_and_orientation( players[i].id, - &players[i].username, players[i].position_x, players[i].position_y, players[i].position_z, players[i].yaw, - players[i].pitch + players[i].pitch, )); - player_statuses[i] = PlayerStatus::Connected; - let _ = stream.write(&send_chat_message(players[i].id, format!("{} has joined the game!", &players[i].username))); } - } else { - if player_statuses[i] == PlayerStatus::Connected { - let _ = stream.write(&despawn_player(i.try_into().unwrap())); - let _ = stream.write(&send_chat_message(i.try_into().unwrap(), format!("{} has left the game!", &players[i].username))); - player_statuses[i] = PlayerStatus::Disconnected; - } - } - if player_statuses[i] == PlayerStatus::Connected { - let _ = stream.write(&set_position_and_orientation( - players[i].id, - players[i].position_x, - players[i].position_y, - players[i].position_z, - players[i].yaw, - players[i].pitch - )); } } } - } - { + { let mut players = players_arc_clone.lock().unwrap(); let current_player = &mut players[client_number as usize]; current_player.id = SpecialPlayers::SelfPlayer as u8; } - println!("Thread {} is kill!", client_number); + println!("Thread {} is kill!", client_number); }); } @@ -383,11 +422,17 @@ fn client_disconnect(text: &str) -> Vec { fn server_identification(is_op: bool) -> Vec { let mut ret_val: Vec = vec![]; ret_val.push(0x00); - let start = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos(); + let start = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos(); ret_val.push(0x07); - let end = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos(); + let end = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos(); println!("Single stream write: {}ns", end - start); - + let server_name = "Erm... what the sigma?"; ret_val.append(&mut to_mc_string(server_name).to_vec()); @@ -424,11 +469,19 @@ fn finalize_level(world_arc_clone: &Arc>) -> Vec { return ret_val; } -fn spawn_player(player_id: u8, name: &String, pos_x: i16, pos_y: i16, pos_z: i16, yaw: u8, pitch: u8) -> Vec { +fn spawn_player( + player_id: u8, + name: &String, + pos_x: i16, + pos_y: i16, + pos_z: i16, + yaw: u8, + pitch: u8, +) -> Vec { let mut ret_val: Vec = vec![]; ret_val.push(0x07); - ret_val.push(player_id); + ret_val.push(player_id); ret_val.append(&mut to_mc_string(name).to_vec()); ret_val.append(&mut stream_write_short(pos_x << 5).to_vec()); // FShort ret_val.append(&mut stream_write_short(pos_y << 5).to_vec()); @@ -462,15 +515,22 @@ fn send_chat_message(source_id: u8, message: String) -> Vec { // stream.write(&[player_id])?; // stream.write(&[yaw])?; // stream.write(&[pitch])?; -// +// // Ok(()) //} -fn set_position_and_orientation(player_id: u8, pos_x: i16, pos_y: i16, pos_z: i16, yaw: u8, pitch: u8) -> Vec { +fn set_position_and_orientation( + player_id: u8, + pos_x: i16, + pos_y: i16, + pos_z: i16, + yaw: u8, + pitch: u8, +) -> Vec { let mut ret_val: Vec = vec![]; ret_val.push(0x08); - ret_val.push(player_id); + ret_val.push(player_id); ret_val.append(&mut stream_write_short(pos_x).to_vec()); ret_val.append(&mut stream_write_short(pos_y).to_vec()); ret_val.append(&mut stream_write_short(pos_z).to_vec()); @@ -499,7 +559,7 @@ fn send_level_data(world_arc_clone: &Arc>) -> Vec { } let world_dat_gzipped = world_dat_compressor.finish().unwrap(); - let number_of_chunks = ((world_dat_gzipped.len() as f32)/1024.0_f32).ceil() as usize; + let number_of_chunks = ((world_dat_gzipped.len() as f32) / 1024.0_f32).ceil() as usize; let mut current_chunk = 0; if number_of_chunks != 1 { @@ -510,11 +570,11 @@ fn send_level_data(world_arc_clone: &Arc>) -> Vec { let mut chunk_data_buffer = [0u8; 1024]; for i in 0..1024 { - chunk_data_buffer[i] = world_dat_gzipped[current_chunk*1024+i]; + chunk_data_buffer[i] = world_dat_gzipped[current_chunk * 1024 + i]; } ret_val.append(&mut chunk_data_buffer.to_vec()); - let mut percentage = current_chunk/number_of_chunks*100; + let mut percentage = current_chunk / number_of_chunks * 100; if percentage > 100 { percentage = 100; @@ -530,19 +590,24 @@ fn send_level_data(world_arc_clone: &Arc>) -> Vec { if remaining_chunk_size > 0 { ret_val.push(0x03); - - ret_val.append(&mut stream_write_short(remaining_chunk_size.try_into().unwrap())); + + ret_val.append(&mut stream_write_short( + remaining_chunk_size.try_into().unwrap(), + )); let mut remaining_data_buffer = [0u8; 1024]; for i in 0..remaining_chunk_size { - remaining_data_buffer[i] = world_dat_gzipped[current_chunk*1024+i]; + remaining_data_buffer[i] = world_dat_gzipped[current_chunk * 1024 + i]; } ret_val.append(&mut remaining_data_buffer.to_vec()); ret_val.push(100); } - println!("World transmission size: {}KiB", ret_val.len() as f32 / 1024.0); + println!( + "World transmission size: {}KiB", + ret_val.len() as f32 / 1024.0 + ); return ret_val; } @@ -565,7 +630,12 @@ fn save_world(world_arc_clone: Arc>) -> std::io::Result<()> { fn load_world() -> World { if fs::metadata("world.wrld").is_ok() { - let mut world: World = World {size_x: 0, size_y: 0, size_z: 0, data: Vec::new()}; + let mut world: World = World { + size_x: 0, + size_y: 0, + size_z: 0, + data: Vec::new(), + }; let world_data_raw = fs::read("world.wrld").unwrap(); if world_data_raw.len() < 6 { println!("INVALID WORLD!"); @@ -575,8 +645,14 @@ fn load_world() -> World { world.size_y = ((world_data_raw[2] as i16) << 8) + (world_data_raw[3] as i16); world.size_z = ((world_data_raw[4] as i16) << 8) + (world_data_raw[5] as i16); - if world_data_raw.len() != (world.size_x as i32 * world.size_y as i32 * world.size_z as i32 + 6 as i32) as usize { - println!("Expected more bytes in world contents: {} (expected) != {} (actual)", world.size_x * world.size_y * world.size_z + 6, world_data_raw.len()); + if world_data_raw.len() + != (world.size_x as i32 * world.size_y as i32 * world.size_z as i32 + 6 as i32) as usize + { + println!( + "Expected more bytes in world contents: {} (expected) != {} (actual)", + world.size_x * world.size_y * world.size_z + 6, + world_data_raw.len() + ); std::process::exit(1); } @@ -584,11 +660,20 @@ fn load_world() -> World { return world; } else { - return World {size_x: SIZE_X, size_y: SIZE_Y, size_z: SIZE_Z, data: build_world(SIZE_X, SIZE_Y, SIZE_Z)}; + return World { + size_x: SIZE_X, + size_y: SIZE_Y, + size_z: SIZE_Z, + data: build_world(SIZE_X, SIZE_Y, SIZE_Z), + }; } } -fn bomb_server_details(stream: &mut TcpStream, current_player: &Player, world_arc_clone: &Arc>) { +fn bomb_server_details( + stream: &mut TcpStream, + current_player: &Player, + world_arc_clone: &Arc>, +) { let mut compound_data: Vec = vec![]; println!("Server IDENT"); compound_data.append(&mut server_identification(current_player.operator)); @@ -603,7 +688,15 @@ fn bomb_server_details(stream: &mut TcpStream, current_player: &Player, world_ar compound_data.append(&mut finalize_level(&world_arc_clone)); println!("Spawning player"); - compound_data.append(&mut spawn_player(SpecialPlayers::SelfPlayer as u8, ¤t_player.username, 32, 17, 32, 0, 0)); + compound_data.append(&mut spawn_player( + SpecialPlayers::SelfPlayer as u8, + ¤t_player.username, + 32, + 17, + 32, + 0, + 0, + )); let _ = stream.write(&compound_data); } @@ -617,16 +710,41 @@ fn _create_player_info_window(client_number: u8, players_arc_clone: Arc> 5); - println!("[{}{}] pos_y: {}", "THREAD: ".cyan(), client_number, current_player.position_y >> 5); - println!("[{}{}] pos_z: {}", "THREAD: ".cyan(), client_number, current_player.position_z >> 5); + println!( + "[{}{}] id: {}", + "THREAD: ".cyan(), + client_number, + current_player.id + ); + println!( + "[{}{}] pos_x: {}", + "THREAD: ".cyan(), + client_number, + current_player.position_x >> 5 + ); + println!( + "[{}{}] pos_y: {}", + "THREAD: ".cyan(), + client_number, + current_player.position_y >> 5 + ); + println!( + "[{}{}] pos_z: {}", + "THREAD: ".cyan(), + client_number, + current_player.position_z >> 5 + ); } sleep(Duration::from_millis(200)); } @@ -643,14 +761,15 @@ fn main() -> std::io::Result<()> { let addr = SocketAddr::from(([0, 0, 0, 0], 25565)); let listener = TcpListener::bind(addr)?; - - let mut thread_number : u8 = 0; + + let mut thread_number: u8 = 0; let world_arc_clone_main_thread = Arc::clone(&world_arc); ctrlc::set_handler(move || { let _ = save_world(world_arc_clone_main_thread.clone()); // Fortnite save the world std::process::exit(0); - }).expect("Error handling control C, save on exit will not work"); + }) + .expect("Error handling control C, save on exit will not work"); for stream in listener.incoming() { let players_arc_clone = Arc::clone(&players_arc); diff --git a/src/world.wrld.back b/src/world.wrld.back new file mode 100644 index 0000000000000000000000000000000000000000..2d6c30dd13e64c98d6350c6f23ed80b966bc44bb GIT binary patch literal 131078 zcmeI*&5qhg6b4X>z_J%0qEVzQvgl+JtbT>O|5J^BaHnkwO_gth@o+39ZrpsXs$*Bg z#o$zbsvp&#FBSp>2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlykRhzk7NOEZAK%XYKbZnsVI`F`UaY_`n~O7czXA3M-@rL6tS9hBt5?f=z#|LLCX zzc=a!0t5&UAn?Efm4yHS0uLatKlfo+7k6pbFU7eb5X>KTuV25uz3mRe{tDNJT^IP| ze6N{fnr{Ely{VBilxz7WTj%7f#=rYBdh(&oX65%)D}SiQW6jT>oBcIvzADI{lRrm0 z*mwOO_i6Nm4-dx455LG7|M2|D0NTx&`P2ZS{V(u44`AH?lKeQ?@2(`@C&oviC_j#N zyUU+H=iyIQ`SW)Y^pF4n0t5&UAV7e?LkkQw(y%V>Y_NWBYR_-q+8T83a%_TcZ|&dn zmOlB(`GWc(-F|&M9`owQbiUo1H>TaOssEcl<0U&koHxVzyqoO&xY_qdUH$(4sQ8DH z`uXb4^Zc&HGyRkKaQ}mTUEd?)j~@SMK7anC{kyG`b2|A<8wn5~K!5-N0t5)GNnm)5 zJFJWQ9~|5xh&$#KiCpPJf#r~aStb+aK*|AzBj{XTn6_Mbh-d;e%M^7F&| z^XD=1>i_g{v6TP;0t5&UAVA>B1%?`9SQm4|>;G;K#qAD({>t_A`t|VJ|6boD-)m-> zrrXc{{C{;N-wZsj{!1Uf?CZzF7>D&4JUf5o00r}lUq65H{&(kIYcO{S`c?V!C)vY- z`J2q!NPqwV0t5&UAVAd?tcCG-|Z3@|1I+SQ@c!R;^YxJ)v5OTqmpw> zujQNjuVtB>>b_PQw{@!X^Zg09R6dDX?YsWx_^0#vf7=7* z3*Ns-9lLP-yzuwm!~GBXm7PC{Be1YvRWyGt`(HMHFY~q#AV7cs0RjXF5FoG`f%A9b z=iikuTt5Wsm-W|g&AHOnurrr%{k(Af8t%XPKllI7NSS&yO#hk6wR{-ajvzUwi+9mNUVRy=uhod5v>1PBlyK!5-N0#76mum6Je>)NlMFWmq5@q40^-B1Y- zAV7cs0RjXF5FkKcwm`W4T)2Mjul=|0Va!~D{SW)i?6w#I0t5&UAV7cs0RjXF5V)s6 zy#5V-{=oO&?|HbjMSuVS0t5&UAV7cs0RjYO2}IvNh~{T?T8IDv0t5&Ucw~Wp0XI8) AKmY&$ literal 0 HcmV?d00001 diff --git a/wrld.hexpat b/wrld.hexpat new file mode 100644 index 0000000..022de80 --- /dev/null +++ b/wrld.hexpat @@ -0,0 +1,12 @@ +#pragma endian big + +struct Header { + u16 size_x ; + u16 size_y; + u16 size_z; + u8 blocks[size_x*size_y*size_z]; +}; + + + +Header Data @ 0x00; \ No newline at end of file