Run rust fmt

This commit is contained in:
illegitimate-egg 2025-02-25 02:06:12 +00:00
parent 42c445272a
commit ec7bac08ed
3 changed files with 258 additions and 127 deletions

View File

@ -1,36 +1,37 @@
use colored::Colorize;
use flate2::write::GzEncoder;
use flate2::Compression;
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::prelude::*; use std::io::prelude::*;
use std::net::{SocketAddr, TcpListener, TcpStream}; 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 std::sync::{Arc, Mutex};
use flate2::Compression; use std::thread;
use flate2::write::GzEncoder; use std::thread::sleep;
use colored::Colorize; use std::time::SystemTime;
use std::time::{Duration, UNIX_EPOCH};
// #[macro_use] // #[macro_use]
// extern crate lazy_static; // extern crate lazy_static;
impl Default for Player { impl Default for Player {
fn default() -> Self { fn default() -> Self {
Player { Player {
id: SpecialPlayers::SelfPlayer as u8, id: SpecialPlayers::SelfPlayer as u8,
username: "".to_string(), username: "".to_string(),
verification_key: [0; 64], verification_key: [0; 64],
unused: 0x00, unused: 0x00,
position_x: 0, position_x: 0,
position_y: 0, position_y: 0,
position_z: 0, position_z: 0,
yaw: 0, yaw: 0,
pitch: 0, pitch: 0,
operator: false, operator: false,
outgoing_data: Vec::new() 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 id: u8,
pub username: String, pub username: String,
pub verification_key: [u8; 64], 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 yaw: u8,
pub pitch: u8, pub pitch: u8,
pub operator: bool, pub operator: bool,
pub outgoing_data: Vec<u8> pub outgoing_data: Vec<u8>,
} }
enum SpecialPlayers { enum SpecialPlayers {
SelfPlayer = 0xFF SelfPlayer = 0xFF,
} }
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
enum PlayerStatus { enum PlayerStatus {
Disconnected, Disconnected,
ConnectedSelf, ConnectedSelf,
Connected Connected,
} }
struct World { struct World {
pub size_x: i16, pub size_x: i16,
pub size_y: i16, pub size_y: i16,
pub size_z: i16, pub size_z: i16,
pub data: Vec<u8> pub data: Vec<u8>,
} }
fn build_world(size_x: i16, size_y: i16, size_z: i16) -> Vec<u8> { fn build_world(size_x: i16, size_y: i16, size_z: i16) -> Vec<u8> {
@ -95,7 +96,12 @@ const SIZE_Z: i16 = 64;
// }; // };
// } // }
fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Arc<Mutex<[Player; 255]>>, world_arc_clone: Arc<Mutex<World>>) { fn handle_client(
mut stream: TcpStream,
client_number: u8,
players_arc_clone: Arc<Mutex<[Player; 255]>>,
world_arc_clone: Arc<Mutex<World>>,
) {
thread::spawn(move || { thread::spawn(move || {
let mut player_statuses = [PlayerStatus::Disconnected; 255]; let mut player_statuses = [PlayerStatus::Disconnected; 255];
let mut immediate_join = [false; 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() { for i in 0..players.len() {
let current_player = &mut players[i]; let current_player = &mut players[i];
match current_player.id { match current_player.id {
255=> { 255 => {
continue; continue;
} }
_=> { _ => {
player_statuses[i] = PlayerStatus::Connected; player_statuses[i] = PlayerStatus::Connected;
immediate_join[i] = true; immediate_join[i] = true;
//println!("Player {} is immediate join!", i); //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); let _ = stream.read(&mut buffer);
match buffer[0] { match buffer[0] {
0x00=> { 0x00 => {
let mut payload_buffer = [0; 130]; // Byte + String + String + Byte let mut payload_buffer = [0; 130]; // Byte + String + String + Byte
let _ = stream.read(&mut payload_buffer); let _ = stream.read(&mut payload_buffer);
if payload_buffer[0] != 7 { if payload_buffer[0] != 7 {
// Shit pant // 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!"); println!("this client is wiggidy wack yo!");
break; break;
} }
@ -137,14 +145,14 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar
let mut username = String::new(); let mut username = String::new();
for i in 0..64 { for i in 0..64 {
username.push(payload_buffer[i+1] as char); username.push(payload_buffer[i + 1] as char);
} }
//println!("Username: {}", username); //println!("Username: {}", username);
let mut verif_key = [0; 64]; let mut verif_key = [0; 64];
for i in 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(); let mut verif_key_formatted = String::new();
@ -184,19 +192,22 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar
players[i].position_y, players[i].position_y,
players[i].position_z, players[i].position_z,
players[i].yaw, 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 mut payload_buffer = [0; 8]; // Short (2) + Short (2) + Short (2) + Byte (1) + Byte (1)
let _ = stream.read(&mut payload_buffer); let _ = stream.read(&mut payload_buffer);
let position_x = ((payload_buffer[0] as i16) << (8 as i16)) + payload_buffer[1] as i16; let position_x =
let position_y = ((payload_buffer[2] as i16) << (8 as i16)) + payload_buffer[3] as i16; ((payload_buffer[0] as i16) << (8 as i16)) + payload_buffer[1] as i16;
let position_z = ((payload_buffer[4] as i16) << (8 as i16)) + payload_buffer[5] 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 mode = payload_buffer[6];
let mut block_type = payload_buffer[7]; 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(); let mut world_dat = world_arc_clone.lock().unwrap();
// Sanity check (Stop losers from losing) // 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! // 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; break;
} }
@ -214,8 +230,12 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar
block_type = 0x00; // Air 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); let world_offset: u32 = position_x as u32
world_dat.data[world_offset as usize] = block_type; + (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<u8> = Vec::new(); let mut update_block_bytes: Vec<u8> = 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(); let mut players = players_arc_clone.lock().unwrap();
for i in 0..players.len() { for i in 0..players.len() {
if players[i].id != 255 && players[i].id != client_number { 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 + let mut payload_buffer = [0; 9]; // SByte + FShort (2B) + FShort + FShort +
// Byte + Byte // Byte + Byte
let _ = stream.read(&mut payload_buffer); let _ = stream.read(&mut payload_buffer);
if payload_buffer[0] != SpecialPlayers::SelfPlayer as u8 { 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 mut players = players_arc_clone.lock().unwrap();
let current_player = &mut players[client_number as usize]; 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_x =
current_player.position_y = ((payload_buffer[3] as i16) << (8 as i16)) + payload_buffer[4] as i16; ((payload_buffer[1] as i16) << (8 as i16)) + payload_buffer[2] as i16;
current_player.position_z = ((payload_buffer[5] as i16) << (8 as i16)) + payload_buffer[6] 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.yaw = payload_buffer[7];
current_player.pitch = payload_buffer[8]; current_player.pitch = payload_buffer[8];
} }
}, }
0x0D=>{ 0x0D => {
let mut payload_buffer = [0; 65]; // Byte + String let mut payload_buffer = [0; 65]; // Byte + String
let _ = stream.read(&mut payload_buffer); let _ = stream.read(&mut payload_buffer);
@ -263,70 +288,84 @@ fn handle_client(mut stream: TcpStream, client_number: u8, players_arc_clone: Ar
let mut message = ['a'; 64]; let mut message = ['a'; 64];
for i in 0..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(); let mut players = players_arc_clone.lock().unwrap();
for i in 0..players.len() { for i in 0..players.len() {
if players[i].id != 255 && players[i].id != client_number { if players[i].id != 255 && players[i].id != client_number {
let sender: u8 = players[client_number as usize].id; 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!("{}", 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 let is_kill = &mut stream.write(&ping()); // Ping that MF
if is_kill.is_err() { if is_kill.is_err() {
break; break;
}
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 { sleep(Duration::from_millis(1000 / 1000)); // 1000 TPS TODO: Delta time
if player_statuses[i] == PlayerStatus::Disconnected { {
let _ = stream.write(&spawn_player( 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].id,
&players[i].username,
players[i].position_x, players[i].position_x,
players[i].position_y, players[i].position_y,
players[i].position_z, players[i].position_z,
players[i].yaw, 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 mut players = players_arc_clone.lock().unwrap();
let current_player = &mut players[client_number as usize]; let current_player = &mut players[client_number as usize];
@ -383,9 +422,15 @@ fn client_disconnect(text: &str) -> Vec<u8> {
fn server_identification(is_op: bool) -> Vec<u8> { fn server_identification(is_op: bool) -> Vec<u8> {
let mut ret_val: Vec<u8> = vec![]; let mut ret_val: Vec<u8> = vec![];
ret_val.push(0x00); 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); 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); println!("Single stream write: {}ns", end - start);
let server_name = "Erm... what the sigma?"; let server_name = "Erm... what the sigma?";
@ -424,7 +469,15 @@ fn finalize_level(world_arc_clone: &Arc<Mutex<World>>) -> Vec<u8> {
return ret_val; 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<u8> { fn spawn_player(
player_id: u8,
name: &String,
pos_x: i16,
pos_y: i16,
pos_z: i16,
yaw: u8,
pitch: u8,
) -> Vec<u8> {
let mut ret_val: Vec<u8> = vec![]; let mut ret_val: Vec<u8> = vec![];
ret_val.push(0x07); ret_val.push(0x07);
@ -466,7 +519,14 @@ fn send_chat_message(source_id: u8, message: String) -> Vec<u8> {
// Ok(()) // Ok(())
//} //}
fn set_position_and_orientation(player_id: u8, pos_x: i16, pos_y: i16, pos_z: i16, yaw: u8, pitch: u8) -> Vec<u8> { fn set_position_and_orientation(
player_id: u8,
pos_x: i16,
pos_y: i16,
pos_z: i16,
yaw: u8,
pitch: u8,
) -> Vec<u8> {
let mut ret_val: Vec<u8> = vec![]; let mut ret_val: Vec<u8> = vec![];
ret_val.push(0x08); ret_val.push(0x08);
@ -499,7 +559,7 @@ fn send_level_data(world_arc_clone: &Arc<Mutex<World>>) -> Vec<u8> {
} }
let world_dat_gzipped = world_dat_compressor.finish().unwrap(); 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; let mut current_chunk = 0;
if number_of_chunks != 1 { if number_of_chunks != 1 {
@ -510,11 +570,11 @@ fn send_level_data(world_arc_clone: &Arc<Mutex<World>>) -> Vec<u8> {
let mut chunk_data_buffer = [0u8; 1024]; let mut chunk_data_buffer = [0u8; 1024];
for i in 0..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()); 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 { if percentage > 100 {
percentage = 100; percentage = 100;
@ -531,18 +591,23 @@ fn send_level_data(world_arc_clone: &Arc<Mutex<World>>) -> Vec<u8> {
if remaining_chunk_size > 0 { if remaining_chunk_size > 0 {
ret_val.push(0x03); 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]; let mut remaining_data_buffer = [0u8; 1024];
for i in 0..remaining_chunk_size { 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.append(&mut remaining_data_buffer.to_vec());
ret_val.push(100); 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; return ret_val;
} }
@ -565,7 +630,12 @@ fn save_world(world_arc_clone: Arc<Mutex<World>>) -> std::io::Result<()> {
fn load_world() -> World { fn load_world() -> World {
if fs::metadata("world.wrld").is_ok() { 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(); let world_data_raw = fs::read("world.wrld").unwrap();
if world_data_raw.len() < 6 { if world_data_raw.len() < 6 {
println!("INVALID WORLD!"); 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_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); 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 { if world_data_raw.len()
println!("Expected more bytes in world contents: {} (expected) != {} (actual)", world.size_x * world.size_y * world.size_z + 6, 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); std::process::exit(1);
} }
@ -584,11 +660,20 @@ fn load_world() -> World {
return world; return world;
} else { } 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<Mutex<World>>) { fn bomb_server_details(
stream: &mut TcpStream,
current_player: &Player,
world_arc_clone: &Arc<Mutex<World>>,
) {
let mut compound_data: Vec<u8> = vec![]; let mut compound_data: Vec<u8> = vec![];
println!("Server IDENT"); println!("Server IDENT");
compound_data.append(&mut server_identification(current_player.operator)); 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)); compound_data.append(&mut finalize_level(&world_arc_clone));
println!("Spawning player"); println!("Spawning player");
compound_data.append(&mut spawn_player(SpecialPlayers::SelfPlayer as u8, &current_player.username, 32, 17, 32, 0, 0)); compound_data.append(&mut spawn_player(
SpecialPlayers::SelfPlayer as u8,
&current_player.username,
32,
17,
32,
0,
0,
));
let _ = stream.write(&compound_data); let _ = stream.write(&compound_data);
} }
@ -617,16 +710,41 @@ fn _create_player_info_window(client_number: u8, players_arc_clone: Arc<Mutex<[P
let current_player = &mut players[client_number as usize]; let current_player = &mut players[client_number as usize];
if current_player.id == 255 && thread_alive == true { if current_player.id == 255 && thread_alive == true {
println!("[{}{}] {} has disconnected!", "THREAD: ".cyan(), client_number, current_player.username); println!(
"[{}{}] {} has disconnected!",
"THREAD: ".cyan(),
client_number,
current_player.username
);
break; break;
} else { } else {
thread_alive = true; thread_alive = true;
} }
println!("[{}{}] id: {}", "THREAD: ".cyan(), client_number, current_player.id); println!(
println!("[{}{}] pos_x: {}", "THREAD: ".cyan(), client_number, current_player.position_x >> 5); "[{}{}] id: {}",
println!("[{}{}] pos_y: {}", "THREAD: ".cyan(), client_number, current_player.position_y >> 5); "THREAD: ".cyan(),
println!("[{}{}] pos_z: {}", "THREAD: ".cyan(), client_number, current_player.position_z >> 5); 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)); sleep(Duration::from_millis(200));
} }
@ -644,13 +762,14 @@ fn main() -> std::io::Result<()> {
let listener = TcpListener::bind(addr)?; 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); let world_arc_clone_main_thread = Arc::clone(&world_arc);
ctrlc::set_handler(move || { ctrlc::set_handler(move || {
let _ = save_world(world_arc_clone_main_thread.clone()); // Fortnite save the world let _ = save_world(world_arc_clone_main_thread.clone()); // Fortnite save the world
std::process::exit(0); 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() { for stream in listener.incoming() {
let players_arc_clone = Arc::clone(&players_arc); let players_arc_clone = Arc::clone(&players_arc);

BIN
src/world.wrld.back Normal file

Binary file not shown.

12
wrld.hexpat Normal file
View File

@ -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;