1.7.10 (5) multiprotocol support (#64)
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
This commit is contained in:
parent
e28946b691
commit
37e6d962ec
|
@ -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> {
|
||||
|
@ -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)?,
|
||||
|
|
Loading…
Reference in New Issue