mirror of
https://github.com/tribufu/rust-gamedig
synced 2026-06-01 09:42:41 +00:00
[Crate] Refactor: Buffer (#62)
* merge: local -> fresh pr * fix: utf16 bugs + clean up * docs: buffer * [feat/buffer] Replaced errors, partial valve protocol ported * fix: change buffer name + add endian switch * chore: update module * refactor: valve_master * refactor: mc bedrock * refactor: mc java * refactor: mc types * refactor: mc legacy 1.8 * refactor: mc legacy 1.4 * refactor: valve * refactor: valve types * refactor: quake * refactor: mc legacy 1.6 * refactor: gamespy 1 * fix: make switch endian move cursor * fix: reset cursor on switch * chore: add switch endian tests * chore: remove todo comment * chore: clean up buffer generic types * refactor: prop len when switching in mc bedrock * fix: tests and current pos fn * refactor: ffow * refactor: jc2mp * refactor: gs 3 * refactor: gs 2 * fix: mc bedrock prop on move + move data * fix: mc java lifetime error * fix: mc legacy 1.6 using pub not pub crate * fix: quake client lifetime * fix: quake 2 clippy warning * fix: valve lifetime issue * fix: buffer test * chore: format to keep ci happy * fix: buffer move_cursor * fix: quake client * feat: GameSpy 1 small optimization * fix: incomplete gamespy 3 fix * fix: gamespy 3 fix * fix: minecraft java * fix: minecraft bedrock * feat: update the CHANGELOG to mention the buffer rewrite and thank @cainthebest for it * fix: minecraft legacy 1.6 --------- Co-authored-by: CosminPerRam <cosmin.p@live.com>
This commit is contained in:
parent
a8342296d6
commit
66cc39eb26
20 changed files with 859 additions and 568 deletions
|
|
@ -1,7 +1,9 @@
|
|||
use crate::buffer::{Buffer, Utf8Decoder};
|
||||
use crate::protocols::types::{CommonResponse, TimeoutSettings};
|
||||
use crate::protocols::valve::{Engine, Environment, Server, ValveProtocol};
|
||||
use crate::protocols::GenericResponse;
|
||||
use crate::GDResult;
|
||||
use byteorder::LittleEndian;
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::net::{IpAddr, SocketAddr};
|
||||
|
|
@ -68,31 +70,33 @@ pub fn query_with_timeout(
|
|||
&SocketAddr::new(*address, port.unwrap_or(5478)),
|
||||
timeout_settings,
|
||||
)?;
|
||||
let mut buffer = client.get_request_data(
|
||||
let data = client.get_request_data(
|
||||
&Engine::GoldSrc(true),
|
||||
0,
|
||||
0x46,
|
||||
String::from("LSQ").into_bytes(),
|
||||
)?;
|
||||
|
||||
let protocol = buffer.get_u8()?;
|
||||
let name = buffer.get_string_utf8()?;
|
||||
let map = buffer.get_string_utf8()?;
|
||||
let active_mod = buffer.get_string_utf8()?;
|
||||
let game_mode = buffer.get_string_utf8()?;
|
||||
let description = buffer.get_string_utf8()?;
|
||||
let version = buffer.get_string_utf8()?;
|
||||
buffer.move_position_ahead(2);
|
||||
let players_online = buffer.get_u8()?;
|
||||
let players_maximum = buffer.get_u8()?;
|
||||
let server_type = Server::from_gldsrc(buffer.get_u8()?)?;
|
||||
let environment_type = Environment::from_gldsrc(buffer.get_u8()?)?;
|
||||
let has_password = buffer.get_u8()? == 1;
|
||||
let vac_secured = buffer.get_u8()? == 1;
|
||||
buffer.move_position_ahead(1); //average fps
|
||||
let round = buffer.get_u8()?;
|
||||
let rounds_maximum = buffer.get_u8()?;
|
||||
let time_left = buffer.get_u16()?;
|
||||
let mut buffer = Buffer::<LittleEndian>::new(&data);
|
||||
|
||||
let protocol = buffer.read::<u8>()?;
|
||||
let name = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
let map = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
let active_mod = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
let game_mode = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
let description = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
let version = buffer.read_string::<Utf8Decoder>(None)?;
|
||||
buffer.move_cursor(2)?;
|
||||
let players_online = buffer.read::<u8>()?;
|
||||
let players_maximum = buffer.read::<u8>()?;
|
||||
let server_type = Server::from_gldsrc(buffer.read::<u8>()?)?;
|
||||
let environment_type = Environment::from_gldsrc(buffer.read::<u8>()?)?;
|
||||
let has_password = buffer.read::<u8>()? == 1;
|
||||
let vac_secured = buffer.read::<u8>()? == 1;
|
||||
buffer.move_cursor(1)?; //average fps
|
||||
let round = buffer.read::<u8>()?;
|
||||
let rounds_maximum = buffer.read::<u8>()?;
|
||||
let time_left = buffer.read::<u16>()?;
|
||||
|
||||
Ok(Response {
|
||||
protocol,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
use crate::bufferer::{Bufferer, Endianess};
|
||||
use crate::buffer::{Buffer, Utf8Decoder};
|
||||
use crate::protocols::gamespy::common::has_password;
|
||||
use crate::protocols::gamespy::three::{data_to_map, GameSpy3};
|
||||
use crate::protocols::types::{CommonPlayer, CommonResponse, GenericPlayer, TimeoutSettings};
|
||||
use crate::protocols::GenericResponse;
|
||||
use crate::{GDError, GDResult};
|
||||
use byteorder::BigEndian;
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::net::{IpAddr, SocketAddr};
|
||||
|
|
@ -59,16 +60,16 @@ impl CommonResponse for Response {
|
|||
}
|
||||
|
||||
fn parse_players_and_teams(packet: Vec<u8>) -> GDResult<Vec<Player>> {
|
||||
let mut buf = Bufferer::new_with_data(Endianess::Big, &packet);
|
||||
let mut buf = Buffer::<BigEndian>::new(&packet);
|
||||
|
||||
let count = buf.get_u16()?;
|
||||
let count = buf.read::<u16>()?;
|
||||
let mut players = Vec::with_capacity(count as usize);
|
||||
|
||||
while !buf.is_remaining_empty() {
|
||||
while buf.remaining_length() != 0 {
|
||||
players.push(Player {
|
||||
name: buf.get_string_utf8()?,
|
||||
steam_id: buf.get_string_utf8()?,
|
||||
ping: buf.get_u16()?,
|
||||
name: buf.read_string::<Utf8Decoder>(None)?,
|
||||
steam_id: buf.read_string::<Utf8Decoder>(None)?,
|
||||
ping: buf.read::<u16>()?,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue