2016-03-16 14:25:35 -04:00
|
|
|
// Copyright 2016 Matthew Collins
|
2015-09-17 11:21:56 -04:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
2015-09-12 15:31:26 -04:00
|
|
|
|
2018-11-04 14:48:03 -05:00
|
|
|
use crate::nbt;
|
|
|
|
use crate::protocol::{self, Serializable};
|
2015-09-12 15:31:26 -04:00
|
|
|
use std::io;
|
2015-09-17 11:04:25 -04:00
|
|
|
use byteorder::{BigEndian, WriteBytesExt, ReadBytesExt};
|
2015-09-12 15:31:26 -04:00
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct Stack {
|
|
|
|
id: isize,
|
|
|
|
count: isize,
|
|
|
|
damage: isize,
|
|
|
|
tag: Option<nbt::NamedTag>,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Default for Stack {
|
|
|
|
fn default() -> Stack {
|
|
|
|
Stack {
|
|
|
|
id: -1,
|
|
|
|
count: 0,
|
|
|
|
damage: 0,
|
|
|
|
tag: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Serializable for Option<Stack> {
|
2016-04-08 13:46:07 -04:00
|
|
|
fn read_from<R: io::Read>(buf: &mut R) -> Result<Option<Stack>, protocol::Error> {
|
2018-11-04 14:34:53 -05:00
|
|
|
let id = buf.read_i16::<BigEndian>()?;
|
2015-09-12 15:31:26 -04:00
|
|
|
if id == -1 {
|
|
|
|
return Ok(None);
|
|
|
|
}
|
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
2018-12-15 22:56:54 -05:00
|
|
|
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
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-10-07 14:36:59 -04:00
|
|
|
Ok(Some(Stack {
|
2015-09-12 15:31:26 -04:00
|
|
|
id: id as isize,
|
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
2018-12-15 22:56:54 -05:00
|
|
|
count,
|
|
|
|
damage,
|
|
|
|
tag,
|
2015-09-12 15:31:26 -04:00
|
|
|
}))
|
|
|
|
}
|
2016-04-08 13:46:07 -04:00
|
|
|
fn write_to<W: io::Write>(&self, buf: &mut W) -> Result<(), protocol::Error> {
|
2015-09-12 15:31:26 -04:00
|
|
|
match *self {
|
|
|
|
Some(ref val) => {
|
2018-11-04 14:34:53 -05:00
|
|
|
buf.write_i16::<BigEndian>(val.id as i16)?;
|
|
|
|
buf.write_u8(val.count as u8)?;
|
|
|
|
buf.write_i16::<BigEndian>(val.damage as i16)?;
|
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
2018-12-15 22:56:54 -05:00
|
|
|
// TODO: compress zlib NBT if 1.7
|
2018-11-04 14:34:53 -05:00
|
|
|
val.tag.write_to(buf)?;
|
2015-10-07 14:36:59 -04:00
|
|
|
}
|
2018-11-04 14:34:53 -05:00
|
|
|
None => buf.write_i16::<BigEndian>(-1)?,
|
2015-09-12 15:31:26 -04:00
|
|
|
}
|
|
|
|
Result::Ok(())
|
|
|
|
}
|
|
|
|
}
|