Make SLP better

This commit is contained in:
Garen Tyler 2020-12-17 19:38:55 -07:00
parent 17e9e7dd61
commit a5e14d1ba1
9 changed files with 353 additions and 343 deletions

17
.vscode/tasks.json vendored
View File

@ -1,17 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "cargo",
"subcommand": "build",
"problemMatcher": [
"$rustc"
],
"group": {
"kind": "build",
"isDefault": true
},
"label": "Rust: cargo build - Composition"
}
]
}

573
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -19,3 +19,4 @@ mojang-api = "0.6.1"
log = "*" log = "*"
fern = { version = "0.6", features = ["colored"] } fern = { version = "0.6", features = ["colored"] }
backtrace = "0.3.50" backtrace = "0.3.50"
serde_json = "1.0.59"

View File

@ -1,7 +1,7 @@
# Composition # Composition
Composition is targeting 1.15.2, protocol version 578. Composition is targeting 1.8.9, protocol version 47.
The main goal is to get a working server, then optimize for speed. 1.16 support may come in the future, after 1.15 is completed. The main goal is to get a working server, then optimize for speed.
## Development Resources ## Development Resources

View File

@ -1,49 +1,3 @@
[2020-08-17 16:41:40][Composition][INFO] Starting server... [2020-12-17 19:37:46][Composition][INFO] Starting server...
[2020-08-17 16:41:40][Composition::net][INFO] Network server started! [2020-12-17 19:37:46][Composition::net][INFO] Network server started!
[2020-08-17 16:41:40][Composition][INFO] Done! Start took 1.023788ms [2020-12-17 19:37:46][Composition][INFO] Done! Start took 1.175717ms
[2020-08-17 16:41:50][Composition][INFO] Starting server...
[2020-08-17 16:41:50][Composition::net][INFO] Network server started!
[2020-08-17 16:41:50][Composition][INFO] Done! Start took 1.005714ms
[2020-08-17 16:42:32][Composition::net][INFO] Got client at 127.0.0.1:51769
[2020-08-17 17:11:43][Composition][INFO] Starting server...
[2020-08-17 17:11:43][Composition::net][INFO] Network server started!
[2020-08-17 17:11:43][Composition][INFO] Done! Start took 1.245737ms
[2020-08-17 17:14:54][Composition][INFO] Starting server...
[2020-08-17 17:14:54][Composition::net][INFO] Network server started!
[2020-08-17 17:14:54][Composition][INFO] Done! Start took 1.252385ms
[2020-08-17 17:15:41][Composition::net][INFO] Got client at 127.0.0.1:56994
[2020-08-17 21:14:58][Composition][INFO] Starting server...
[2020-08-17 21:14:58][Composition::net][INFO] Network server started!
[2020-08-17 21:14:58][Composition][INFO] Done! Start took 1.787424ms
[2020-08-17 21:15:32][Composition::net][INFO] Got client at 127.0.0.1:52811
[2020-08-17 21:17:01][Composition][INFO] Starting server...
[2020-08-17 21:17:01][Composition::net][INFO] Network server started!
[2020-08-17 21:17:01][Composition][INFO] Done! Start took 1.242146ms
[2020-08-17 21:17:04][Composition::net][INFO] Got client at 127.0.0.1:52841
[2020-08-17 21:18:13][Composition][INFO] Starting server...
[2020-08-17 21:18:13][Composition::net][INFO] Network server started!
[2020-08-17 21:18:13][Composition][INFO] Done! Start took 1.033613ms
[2020-08-17 21:18:15][Composition::net][INFO] Got client at 127.0.0.1:52847
[2020-08-17 21:18:25][Composition::net][INFO] Got client at 127.0.0.1:52850
[2020-08-17 21:18:52][Composition::net][INFO] Got client at 127.0.0.1:52855
[2020-08-17 21:23:47][Composition][INFO] Starting server...
[2020-08-17 21:23:47][Composition::net][INFO] Network server started!
[2020-08-17 21:23:47][Composition][INFO] Done! Start took 966.985µs
[2020-08-17 21:23:49][Composition::net][INFO] Got client at 127.0.0.1:52879
[2020-08-17 21:37:35][Composition][INFO] Starting server...
[2020-08-17 21:37:35][Composition::net][INFO] Network server started!
[2020-08-17 21:37:35][Composition][INFO] Done! Start took 1.448375ms
[2020-08-17 21:37:44][Composition::net][INFO] Got client at 127.0.0.1:53276
[2020-08-18 08:15:48][Composition][INFO] Starting server...
[2020-08-18 08:15:48][Composition::net][INFO] Network server started!
[2020-08-18 08:15:48][Composition][INFO] Done! Start took 1.853066ms
[2020-08-18 08:15:55][Composition::net][INFO] Got client at 127.0.0.1:56532
[2020-08-18 12:50:04][Composition][INFO] Starting server...
[2020-08-18 12:50:04][Composition::net][INFO] Network server started!
[2020-08-18 12:50:04][Composition][INFO] Done! Start took 1.983874ms
[2020-08-18 12:50:23][Composition::net][INFO] Got client at 127.0.0.1:62307
[2020-08-18 12:50:33][Composition::net][INFO] Got client at 127.0.0.1:62319
[2020-08-18 12:55:34][Composition][INFO] Starting server...
[2020-08-18 12:55:34][Composition::net][INFO] Network server started!
[2020-08-18 12:55:34][Composition][INFO] Done! Start took 1.130267ms
[2020-08-18 12:55:56][Composition::net][INFO] Got client at 127.0.0.1:62750

View File

@ -6,6 +6,7 @@ pub mod net;
pub mod server; pub mod server;
extern crate chrono; extern crate chrono;
extern crate fern; extern crate fern;
extern crate log;
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use net::NetworkServer; use net::NetworkServer;

View File

@ -5,6 +5,7 @@ use log::{debug, error, info, warn};
use packets::*; use packets::*;
use std::net::{TcpListener, TcpStream, ToSocketAddrs}; use std::net::{TcpListener, TcpStream, ToSocketAddrs};
use std::sync::mpsc::{self, Receiver, Sender, TryRecvError}; use std::sync::mpsc::{self, Receiver, Sender, TryRecvError};
use serde_json::json;
pub struct NetworkServer { pub struct NetworkServer {
pub clients: Vec<NetworkClient>, pub clients: Vec<NetworkClient>,
@ -88,42 +89,55 @@ impl NetworkClient {
logindisconnect.write(&mut self.stream).unwrap(); logindisconnect.write(&mut self.stream).unwrap();
self.state = NetworkClientState::Disconnected; self.state = NetworkClientState::Disconnected;
} }
println!("{:?}", handshake); debug!("Got handshake: {:?}", handshake);
} }
NetworkClientState::Status => { NetworkClientState::Status => {
let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap(); let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap();
let statusrequest = StatusRequest::read(&mut self.stream).unwrap(); let statusrequest = StatusRequest::read(&mut self.stream).unwrap();
println!("{:?}", statusrequest); debug!("Got status request: {:?}", statusrequest);
let mut statusresponse = StatusResponse::new(); let mut statusresponse = StatusResponse::new();
statusresponse.json_response = format!( statusresponse.json_response = json!({
"{{\n\t\"version\": {{\n\t\t\"name\": \"{server_version}\",\n\t\t\"protocol\": {server_protocol}\n\t}},\n\t\"players\": {{\n\t\t\"max\": {max_players},\n\t\t\"online\": {num_players},\n\t\t\"sample\": [\n\t\t\t{{\n\t\t\t\t\"name\": \"ElementG9\",\n\t\t\t\t\"id\": \"e3f58380-60bb-4714-91f2-151d525e64aa\"\n\t\t\t}}\n\t\t]\n\t}},\n\t\"description\": {{\n\t\t\"text\": \"{server_description}\"\n\t}},\n\t\"sample\": \"\"\n}}", "version": {
server_version = "1.8.9", "name": "1.8.9",
server_protocol = 47, "protocol": 47,
num_players = 5, },
max_players = 100, "players": {
server_description = "Hello world!" "max": 100,
).into(); "online": 5,
"sample": [
{
"name": "ElementG9",
"id": "e3f58380-60bb-4714-91f2-151d525e64aa"
}
]
},
"description": {
"text": "Hello world!"
},
"favicon": format!("data:image/png;base64,{}", radix64::STD.encode(include_bytes!("../server-icon.png")))
}).to_string().into();
statusresponse.write(&mut self.stream).unwrap(); statusresponse.write(&mut self.stream).unwrap();
println!("{:?}", statusresponse); debug!("Sending status response: StatusResponse");
let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap(); let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap();
let statusping = StatusPing::read(&mut self.stream).unwrap(); let statusping = StatusPing::read(&mut self.stream).unwrap();
println!("{:?}", statusping); debug!("Got status ping: {:?}", statusping);
let mut statuspong = StatusPong::new(); let mut statuspong = StatusPong::new();
statuspong.payload = statusping.payload; statuspong.payload = statusping.payload;
statuspong.write(&mut self.stream).unwrap(); statuspong.write(&mut self.stream).unwrap();
debug!("Sending status pong: {:?}", statuspong);
self.state = NetworkClientState::Disconnected; self.state = NetworkClientState::Disconnected;
} }
NetworkClientState::Login => { NetworkClientState::Login => {
let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap(); let (_packet_length, _packet_id) = read_packet_header(&mut self.stream).unwrap();
let loginstart = LoginStart::read(&mut self.stream).unwrap(); let loginstart = LoginStart::read(&mut self.stream).unwrap();
println!("{:?}", loginstart); debug!("{:?}", loginstart);
// Offline mode skips encryption and compression. // Offline mode skips encryption and compression.
let mut loginsuccess = LoginSuccess::new(); let mut loginsuccess = LoginSuccess::new();
// We're in offline mode, so this is a temporary uuid. // We're in offline mode, so this is a temporary uuid.
loginsuccess.uuid = "00000000-0000-3000-0000-000000000000".into(); loginsuccess.uuid = "00000000-0000-3000-0000-000000000000".into();
loginsuccess.username = loginstart.player_name; loginsuccess.username = loginstart.player_name;
loginsuccess.write(&mut self.stream).unwrap(); loginsuccess.write(&mut self.stream).unwrap();
println!("{:?}", loginsuccess); debug!("{:?}", loginsuccess);
self.state = NetworkClientState::Play; self.state = NetworkClientState::Play;
} }
NetworkClientState::Play => {} NetworkClientState::Play => {}

View File

@ -59,7 +59,7 @@ pub struct StatusRequest {}
impl Into<Vec<u8>> for StatusRequest { impl Into<Vec<u8>> for StatusRequest {
fn into(self) -> Vec<u8> { fn into(self) -> Vec<u8> {
let mut out = vec![]; let mut out = vec![];
let mut temp: Vec<u8> = MCVarInt::from(0x00).into(); // 0x00 Status Request. let temp: Vec<u8> = MCVarInt::from(0x00).into(); // 0x00 Status Request.
out.extend_from_slice(&Into::<Vec<u8>>::into(MCVarInt::from(temp.len() as i32))); out.extend_from_slice(&Into::<Vec<u8>>::into(MCVarInt::from(temp.len() as i32)));
out.extend_from_slice(&temp); out.extend_from_slice(&temp);
out out
@ -75,8 +75,8 @@ impl Packet for StatusRequest {
fn new() -> Self { fn new() -> Self {
StatusRequest {} StatusRequest {}
} }
fn read(t: &mut TcpStream) -> std::io::Result<Self> { fn read(_t: &mut TcpStream) -> std::io::Result<Self> {
let mut statusrequest = StatusRequest::new(); let statusrequest = StatusRequest::new();
Ok(statusrequest) Ok(statusrequest)
} }
fn write(&self, t: &mut TcpStream) -> std::io::Result<()> { fn write(&self, t: &mut TcpStream) -> std::io::Result<()> {

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB