[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:
Cain 2023-07-18 09:46:53 +01:00 committed by GitHub
parent a8342296d6
commit 66cc39eb26
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 859 additions and 568 deletions

View file

@ -1,9 +1,15 @@
use crate::bufferer::{Bufferer, Endianess};
use crate::socket::{Socket, UdpSocket};
use crate::valve_master_server::{Region, SearchFilters};
use crate::{GDError, GDResult};
use crate::{
buffer::Buffer,
socket::{Socket, UdpSocket},
valve_master_server::{Region, SearchFilters},
GDError,
GDResult,
};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use byteorder::BigEndian;
/// The default master ip, which is the one for Source.
pub fn default_master_address() -> SocketAddr {
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(208, 64, 201, 194)), 27011) // hl2master.steampowered.com
@ -63,21 +69,22 @@ impl ValveMasterServer {
self.socket.send(&payload)?;
let received_data = self.socket.receive(Some(1400))?;
let mut buf = Bufferer::new_with_data(Endianess::Big, &received_data);
let mut buf = Buffer::<BigEndian>::new(&received_data);
if buf.get_u32()? != 4294967295 || buf.get_u16()? != 26122 {
if buf.read::<u32>()? != 4294967295 || buf.read::<u16>()? != 26122 {
return Err(GDError::PacketBad);
}
let mut ips: Vec<(IpAddr, u16)> = Vec::new();
while !buf.is_remaining_empty() {
while !buf.remaining_length() == 0 {
let ip = IpAddr::V4(Ipv4Addr::new(
buf.get_u8()?,
buf.get_u8()?,
buf.get_u8()?,
buf.get_u8()?,
buf.read::<u8>()?,
buf.read::<u8>()?,
buf.read::<u8>()?,
buf.read::<u8>()?,
));
let port = buf.get_u16()?;
let port = buf.read::<u16>()?;
ips.push((ip, port));
}