Skip to content

Commit

Permalink
1.7.10 (5) multiprotocol support (#64)
Browse files Browse the repository at this point in the history
Adds 1.7.10 protocol version 5 support, a major update with significant changes.
Expands https://github.com/iceiix/steven/issues/18 Enhance protocol support

* Add v1_7_10 protocol packet structures and IDs

* EncryptionRequest/Response i16 variant in login protocol

* 1.7.10 slot NBT data parsing

* Support both 1.7/1.8+ item::Stack in read_from, using if protocol_verson

* 1.7.10 chunk format support, ChunkDataBulk_17 and ChunkData_17 

* Extract dirty_chunks_by_bitmask from load_chunks17/18/19

* Implement keepalive i32 handler

* Send PlayerPositionLook_HeadY

* Send PlayerBlockPlacement_u8_Item_u8y

* Handle JoinGame_i8_NoDebug

* Handle SpawnPlayer_i32_HeldItem_String

* BlockChange_u8, MultiBlockChange_i16, UpdateBlockEntity_Data, EntityMove_i8_i32_NoGround, EntityLook_i32_NoGround, EntityLookAndMove_i8_i32_NoGround

* UpdateSign_u16, PlayerInfo_String, EntityDestroy_u8, EntityTeleport_i32_i32_NoGround

* Send feet_y = head_y - 1.62, fixes Illegal stance

https://wiki.vg/index.php?title=Protocol&oldid=6003#Player_Position

> Updates the players XYZ position on the server. If HeadY - FeetY is less than 0.1 or greater than 1.65, the stance is illegal and the client will be kicked with the message “Illegal Stance”.

> Absolute feet position, normally HeadY - 1.62. Used to modify the players bounding box when going up stairs, crouching, etc…

* Set on_ground = true in entity teleport, fixes bouncing

* Implement block change, fix metadata/id packing, bounce _u8 through on_block_change

* Implement on_multi_block_change_u16, used with explosions
  • Loading branch information
iceiix committed Dec 16, 2018
1 parent 44dc7ee commit d0336c4
Show file tree
Hide file tree
Showing 15 changed files with 994 additions and 95 deletions.
28 changes: 25 additions & 3 deletions src/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,32 @@ impl Serializable for Option<Stack> {
if id == -1 {
return Ok(None);
}
let count = buf.read_u8()? as isize;
let damage = buf.read_i16::<BigEndian>()? as isize;

let protocol_version = unsafe { protocol::CURRENT_PROTOCOL_VERSION };

let tag: Option<nbt::NamedTag> = if protocol_version >= 47 {
Serializable::read_from(buf)?
} else {
// 1.7 uses a different slot data format described on https://wiki.vg/index.php?title=Slot_Data&diff=6056&oldid=4753
let tag_size = buf.read_i16::<BigEndian>()?;
if tag_size != -1 {
for _ in 0..tag_size {
let _ = buf.read_u8()?;
}
// TODO: decompress zlib NBT for 1.7
None
} else {
None
}
};

Ok(Some(Stack {
id: id as isize,
count: buf.read_u8()? as isize,
damage: buf.read_i16::<BigEndian>()? as isize,
tag: Serializable::read_from(buf)?,
count,
damage,
tag,
}))
}
fn write_to<W: io::Write>(&self, buf: &mut W) -> Result<(), protocol::Error> {
Expand All @@ -56,6 +77,7 @@ impl Serializable for Option<Stack> {
buf.write_i16::<BigEndian>(val.id as i16)?;
buf.write_u8(val.count as u8)?;
buf.write_i16::<BigEndian>(val.damage as i16)?;
// TODO: compress zlib NBT if 1.7
val.tag.write_to(buf)?;
}
None => buf.write_i16::<BigEndian>(-1)?,
Expand Down
12 changes: 11 additions & 1 deletion src/protocol/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ use flate2::Compression;
use std::time::{Instant, Duration};
use crate::shared::Position;

pub const SUPPORTED_PROTOCOLS: [i32; 8] = [340, 316, 315, 210, 109, 107, 74, 47];
pub const SUPPORTED_PROTOCOLS: [i32; 9] = [340, 316, 315, 210, 109, 107, 74, 47, 5];

// TODO: switch to using thread_local storage?, see https://doc.rust-lang.org/std/macro.thread_local.html
pub static mut CURRENT_PROTOCOL_VERSION: i32 = SUPPORTED_PROTOCOLS[0];
Expand Down Expand Up @@ -553,6 +553,16 @@ impl <L: Lengthable> fmt::Debug for LenPrefixedBytes<L> {
}
}

impl Lengthable for u8 {
fn into(self) -> usize {
self as usize
}

fn from(u: usize) -> u8 {
u as u8
}
}

impl Lengthable for i16 {
fn into(self) -> usize {
self as usize
Expand Down

0 comments on commit d0336c4

Please sign in to comment.