mirror of
https://github.com/GIKExe/rust_mc_serv.git
synced 2025-06-24 10:22:57 +03:00
read packet with id list
This commit is contained in:
parent
da74907bcc
commit
62e7e5bf28
@ -197,13 +197,14 @@ impl ClientContext {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Please avoid using of this bullshit
|
||||||
pub fn read_any_packet(self: &Arc<Self>) -> Result<Packet, ServerError> {
|
pub fn read_any_packet(self: &Arc<Self>) -> Result<Packet, ServerError> {
|
||||||
if self.read_loop.load(Ordering::SeqCst) {
|
if self.read_loop.load(Ordering::SeqCst) {
|
||||||
loop {
|
loop {
|
||||||
if let Some(packet) = self.packet_buffer.lock().unwrap().pop_front() {
|
if let Some(packet) = self.packet_buffer.lock().unwrap().pop_front() {
|
||||||
return Ok(packet);
|
return Ok(packet);
|
||||||
}
|
}
|
||||||
thread::sleep(Duration::from_millis(10));
|
thread::sleep(Duration::from_millis(4));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let state = self.state();
|
let state = self.state();
|
||||||
@ -237,19 +238,19 @@ impl ClientContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_packet(self: &Arc<Self>, id: u8) -> Result<Packet, ServerError> {
|
pub fn read_packet(self: &Arc<Self>, ids: &[u8]) -> Result<Packet, ServerError> {
|
||||||
if self.read_loop.load(Ordering::SeqCst) {
|
if self.read_loop.load(Ordering::SeqCst) {
|
||||||
loop {
|
loop {
|
||||||
{
|
{
|
||||||
let mut locked = self.packet_buffer.lock().unwrap();
|
let mut locked = self.packet_buffer.lock().unwrap();
|
||||||
for (i, packet) in locked.clone().iter().enumerate() {
|
for (i, packet) in locked.clone().iter().enumerate() {
|
||||||
if packet.id() == id {
|
if ids.contains(&packet.id()) {
|
||||||
locked.remove(i);
|
locked.remove(i);
|
||||||
return Ok(packet.clone());
|
return Ok(packet.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
thread::sleep(Duration::from_millis(10));
|
thread::sleep(Duration::from_millis(4));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let packet = match self.read_any_packet() {
|
let packet = match self.read_any_packet() {
|
||||||
@ -260,7 +261,7 @@ impl ClientContext {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if packet.id() != id {
|
if ids.contains(&packet.id()) {
|
||||||
Err(ServerError::UnexpectedPacket(packet.id()))
|
Err(ServerError::UnexpectedPacket(packet.id()))
|
||||||
} else {
|
} else {
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
@ -268,7 +269,7 @@ impl ClientContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_back(self: &Arc<Self>, packet: Packet){
|
pub fn push_packet_back(self: &Arc<Self>, packet: Packet){
|
||||||
self.packet_buffer.lock().unwrap().push_back(packet)
|
self.packet_buffer.lock().unwrap().push_back(packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ impl ProtocolHelper {
|
|||||||
self.client
|
self.client
|
||||||
.write_packet(&Packet::empty(clientbound::configuration::FINISH))?;
|
.write_packet(&Packet::empty(clientbound::configuration::FINISH))?;
|
||||||
self.client
|
self.client
|
||||||
.read_packet(serverbound::configuration::ACKNOWLEDGE_FINISH)?;
|
.read_packet(&[serverbound::configuration::ACKNOWLEDGE_FINISH])?;
|
||||||
self.client.set_state(ConnectionState::Play)?;
|
self.client.set_state(ConnectionState::Play)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ impl ProtocolHelper {
|
|||||||
self.client
|
self.client
|
||||||
.write_packet(&Packet::empty(clientbound::play::START_CONFIGURATION))?;
|
.write_packet(&Packet::empty(clientbound::play::START_CONFIGURATION))?;
|
||||||
self.client
|
self.client
|
||||||
.read_packet(serverbound::play::ACKNOWLEDGE_CONFIGURATION)?;
|
.read_packet(&[serverbound::play::ACKNOWLEDGE_CONFIGURATION])?;
|
||||||
self.client.set_state(ConnectionState::Configuration)?;
|
self.client.set_state(ConnectionState::Configuration)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -100,14 +100,14 @@ impl ProtocolHelper {
|
|||||||
let time = SystemTime::now();
|
let time = SystemTime::now();
|
||||||
self.client
|
self.client
|
||||||
.write_packet(&Packet::empty(clientbound::play::PING))?;
|
.write_packet(&Packet::empty(clientbound::play::PING))?;
|
||||||
self.client.read_packet(serverbound::play::PONG)?;
|
self.client.read_packet(&[serverbound::play::PONG])?;
|
||||||
Ok(SystemTime::now().duration_since(time).unwrap())
|
Ok(SystemTime::now().duration_since(time).unwrap())
|
||||||
}
|
}
|
||||||
ConnectionState::Configuration => {
|
ConnectionState::Configuration => {
|
||||||
let time = SystemTime::now();
|
let time = SystemTime::now();
|
||||||
self.client
|
self.client
|
||||||
.write_packet(&Packet::empty(clientbound::configuration::PING))?;
|
.write_packet(&Packet::empty(clientbound::configuration::PING))?;
|
||||||
self.client.read_packet(serverbound::configuration::PONG)?;
|
self.client.read_packet(&[serverbound::configuration::PONG])?;
|
||||||
Ok(SystemTime::now().duration_since(time).unwrap())
|
Ok(SystemTime::now().duration_since(time).unwrap())
|
||||||
}
|
}
|
||||||
_ => Err(ServerError::UnexpectedState),
|
_ => Err(ServerError::UnexpectedState),
|
||||||
@ -149,7 +149,7 @@ impl ProtocolHelper {
|
|||||||
|
|
||||||
let mut packet = self
|
let mut packet = self
|
||||||
.client
|
.client
|
||||||
.read_packet(serverbound::configuration::COOKIE_RESPONSE)?;
|
.read_packet(&[serverbound::configuration::COOKIE_RESPONSE])?;
|
||||||
packet.read_string()?;
|
packet.read_string()?;
|
||||||
let data = if packet.read_boolean()? {
|
let data = if packet.read_boolean()? {
|
||||||
let n = packet.read_usize_varint()?;
|
let n = packet.read_usize_varint()?;
|
||||||
@ -167,7 +167,7 @@ impl ProtocolHelper {
|
|||||||
|
|
||||||
let mut packet = self
|
let mut packet = self
|
||||||
.client
|
.client
|
||||||
.read_packet(serverbound::play::COOKIE_RESPONSE)?;
|
.read_packet(&[serverbound::play::COOKIE_RESPONSE])?;
|
||||||
packet.read_string()?;
|
packet.read_string()?;
|
||||||
let data = if packet.read_boolean()? {
|
let data = if packet.read_boolean()? {
|
||||||
let n = packet.read_usize_varint()?;
|
let n = packet.read_usize_varint()?;
|
||||||
@ -199,7 +199,7 @@ impl ProtocolHelper {
|
|||||||
|
|
||||||
let mut packet = self
|
let mut packet = self
|
||||||
.client
|
.client
|
||||||
.read_packet(serverbound::login::PLUGIN_RESPONSE)?;
|
.read_packet(&[serverbound::login::PLUGIN_RESPONSE])?;
|
||||||
let identifier = packet.read_varint()?;
|
let identifier = packet.read_varint()?;
|
||||||
let data = if packet.read_boolean()? {
|
let data = if packet.read_boolean()? {
|
||||||
let mut data = Vec::new();
|
let mut data = Vec::new();
|
||||||
|
@ -21,7 +21,7 @@ pub fn handle_connection(
|
|||||||
// Получение пакетов производится через client.conn(),
|
// Получение пакетов производится через client.conn(),
|
||||||
// ВАЖНО: не помещать сам client.conn() в переменные,
|
// ВАЖНО: не помещать сам client.conn() в переменные,
|
||||||
// он должен сразу убиваться иначе соединение гдето задедлочится
|
// он должен сразу убиваться иначе соединение гдето задедлочится
|
||||||
let mut packet = client.read_packet(serverbound::handshake::HANDSHAKE)?;
|
let mut packet = client.read_packet(&[serverbound::handshake::HANDSHAKE])?;
|
||||||
|
|
||||||
let protocol_version = packet.read_varint()?; // Получаем версия протокола, может быть отрицательным если наш клиент дэбил
|
let protocol_version = packet.read_varint()?; // Получаем версия протокола, может быть отрицательным если наш клиент дэбил
|
||||||
let server_address = packet.read_string()?; // Получаем домен/адрес сервера к которому пытается подключиться клиент, например "play.example.com", а не айпи
|
let server_address = packet.read_string()?; // Получаем домен/адрес сервера к которому пытается подключиться клиент, например "play.example.com", а не айпи
|
||||||
@ -86,7 +86,7 @@ pub fn handle_connection(
|
|||||||
client.set_state(ConnectionState::Login)?; // Мы находимся в режиме Login
|
client.set_state(ConnectionState::Login)?; // Мы находимся в режиме Login
|
||||||
|
|
||||||
// Читаем пакет Login Start
|
// Читаем пакет Login Start
|
||||||
let mut packet = client.read_packet(serverbound::login::START)?;
|
let mut packet = client.read_packet(&[serverbound::login::START])?;
|
||||||
|
|
||||||
let name = packet.read_string()?;
|
let name = packet.read_string()?;
|
||||||
let uuid = packet.read_uuid()?;
|
let uuid = packet.read_uuid()?;
|
||||||
@ -115,14 +115,14 @@ pub fn handle_connection(
|
|||||||
p.write_varint(0)
|
p.write_varint(0)
|
||||||
})?)?;
|
})?)?;
|
||||||
|
|
||||||
client.read_packet(serverbound::login::ACKNOWLEDGED)?; // Пакет Login Acknowledged
|
client.read_packet(&[serverbound::login::ACKNOWLEDGED])?; // Пакет Login Acknowledged
|
||||||
|
|
||||||
client.set_state(ConnectionState::Configuration)?; // Мы перешли в режим Configuration
|
client.set_state(ConnectionState::Configuration)?; // Мы перешли в режим Configuration
|
||||||
|
|
||||||
// Получение бренда клиента из Serverbound Plugin Message
|
// Получение бренда клиента из Serverbound Plugin Message
|
||||||
// Identifier канала откуда берется бренд: minecraft:brand
|
// Identifier канала откуда берется бренд: minecraft:brand
|
||||||
let brand = loop {
|
let brand = loop {
|
||||||
let mut packet = client.read_packet(serverbound::configuration::PLUGIN_MESSAGE)?; // Пакет Serverbound Plugin Message
|
let mut packet = client.read_packet(&[serverbound::configuration::PLUGIN_MESSAGE])?; // Пакет Serverbound Plugin Message
|
||||||
|
|
||||||
let identifier = packet.read_string()?;
|
let identifier = packet.read_string()?;
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ pub fn handle_connection(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut packet = client.read_packet(serverbound::configuration::CLIENT_INFORMATION)?; // Пакет Client Information
|
let mut packet = client.read_packet(&[serverbound::configuration::CLIENT_INFORMATION])?; // Пакет Client Information
|
||||||
|
|
||||||
let locale = packet.read_string()?; // for example: en_us
|
let locale = packet.read_string()?; // for example: en_us
|
||||||
let view_distance = packet.read_signed_byte()?; // client-side render distance in chunks
|
let view_distance = packet.read_signed_byte()?; // client-side render distance in chunks
|
||||||
@ -172,7 +172,7 @@ pub fn handle_connection(
|
|||||||
handle_configuration_state(client.clone())?;
|
handle_configuration_state(client.clone())?;
|
||||||
|
|
||||||
client.write_packet(&Packet::empty(clientbound::configuration::FINISH))?;
|
client.write_packet(&Packet::empty(clientbound::configuration::FINISH))?;
|
||||||
client.read_packet(serverbound::configuration::ACKNOWLEDGE_FINISH)?;
|
client.read_packet(&[serverbound::configuration::ACKNOWLEDGE_FINISH])?;
|
||||||
|
|
||||||
client.set_state(ConnectionState::Play)?; // Мы перешли в режим Play
|
client.set_state(ConnectionState::Play)?; // Мы перешли в режим Play
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ pub fn handle_configuration_state(
|
|||||||
packet.write_string("1.21.5")?;
|
packet.write_string("1.21.5")?;
|
||||||
client.write_packet(&packet)?;
|
client.write_packet(&packet)?;
|
||||||
|
|
||||||
client.read_packet(serverbound::configuration::KNOWN_PACKS)?;
|
client.read_packet(&[serverbound::configuration::KNOWN_PACKS])?;
|
||||||
|
|
||||||
send_registry_data(client.clone())?;
|
send_registry_data(client.clone())?;
|
||||||
send_update_tags(client.clone())
|
send_update_tags(client.clone())
|
||||||
@ -209,7 +209,7 @@ pub fn send_keep_alive(client: Arc<ClientContext>) -> Result<(), ServerError> {
|
|||||||
packet.write_long(timestamp)?;
|
packet.write_long(timestamp)?;
|
||||||
client.write_packet(&packet)?;
|
client.write_packet(&packet)?;
|
||||||
|
|
||||||
let mut packet = client.read_packet(serverbound::play::KEEP_ALIVE)?;
|
let mut packet = client.read_packet(&[serverbound::play::KEEP_ALIVE])?;
|
||||||
let timestamp2 = packet.read_long()?;
|
let timestamp2 = packet.read_long()?;
|
||||||
if timestamp2 != timestamp {
|
if timestamp2 != timestamp {
|
||||||
// Послать клиента нахуй
|
// Послать клиента нахуй
|
||||||
@ -283,7 +283,7 @@ pub fn handle_play_state(
|
|||||||
client.set_rotation((yaw, pitch));
|
client.set_rotation((yaw, pitch));
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
client.push_back(packet);
|
client.push_packet_back(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user