Player spawning works
This commit is contained in:
parent
a0cebf6d44
commit
6fa9ee968e
@ -247,6 +247,66 @@ pub mod other {
|
|||||||
Err(io_error("Cannot read MCChat from stream"))
|
Err(io_error("Cannot read MCChat from stream"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Actually make the MCPosition work.
|
||||||
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
|
pub struct MCPosition {
|
||||||
|
x: MCLong,
|
||||||
|
y: MCLong,
|
||||||
|
z: MCLong,
|
||||||
|
}
|
||||||
|
impl Display for MCPosition {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"({}, {}, {})",
|
||||||
|
self.x,
|
||||||
|
self.y,
|
||||||
|
self.z,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl TryFrom<Vec<u8>> for MCPosition {
|
||||||
|
type Error = &'static str;
|
||||||
|
fn try_from(_bytes: Vec<u8>) -> Result<Self, Self::Error> {
|
||||||
|
Err("Cannot read MCPosition from bytes")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Into<Vec<u8>> for MCPosition {
|
||||||
|
fn into(self) -> Vec<u8> {
|
||||||
|
// Just output
|
||||||
|
// {"text": "<data>"}
|
||||||
|
let mut out = vec![];
|
||||||
|
let mut temp = vec![];
|
||||||
|
temp.extend_from_slice(
|
||||||
|
&(
|
||||||
|
(
|
||||||
|
((Into::<i64>::into(self.x) & 0x3FFFFFF) << 38)
|
||||||
|
| ((Into::<i64>::into(self.y) & 0xFFF) << 26)
|
||||||
|
| (Into::<i64>::into(self.z) & 0x3FFFFFF)
|
||||||
|
) as u64
|
||||||
|
).to_be_bytes()
|
||||||
|
);
|
||||||
|
// temp.extend_from_slice(&"{\"text\": \"".to_owned().into_bytes());
|
||||||
|
// temp.extend_from_slice(&self.text.value.into_bytes());
|
||||||
|
// temp.extend_from_slice(&"\"}".to_owned().into_bytes());
|
||||||
|
out.extend_from_slice(&Into::<Vec<u8>>::into(MCVarInt::from(temp.len() as i32)));
|
||||||
|
out.extend_from_slice(&temp);
|
||||||
|
out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl MCPosition {
|
||||||
|
pub fn new() -> MCPosition {
|
||||||
|
MCPosition {
|
||||||
|
x: 0.into(),
|
||||||
|
y: 0.into(),
|
||||||
|
z: 0.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub async fn read(_t: &mut TcpStream) -> tokio::io::Result<Self> {
|
||||||
|
Err(io_error("Cannot read MCPosition from stream"))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// All the numbers, from `i8` and `u8` to `i64` and `u64`, plus `VarInt`s.
|
/// All the numbers, from `i8` and `u8` to `i64` and `u64`, plus `VarInt`s.
|
||||||
|
@ -225,7 +225,7 @@ impl NetworkClient {
|
|||||||
// TODO: S->C Player Position and Look
|
// TODO: S->C Player Position and Look
|
||||||
let playerpositionandlook = PlayerPositionAndLook::new();
|
let playerpositionandlook = PlayerPositionAndLook::new();
|
||||||
// TODO: Retrieve player position from storage.
|
// TODO: Retrieve player position from storage.
|
||||||
// playerpositionandlook.write(&mut self.stream).await.unwrap();
|
playerpositionandlook.write(&mut self.stream).await.unwrap();
|
||||||
debug!("{:?}", playerpositionandlook);
|
debug!("{:?}", playerpositionandlook);
|
||||||
// TODO: S->C Player Info (Add Player action) (1.16?)
|
// TODO: S->C Player Info (Add Player action) (1.16?)
|
||||||
// TODO: S->C Player Info (Update latency action) (1.16?)
|
// TODO: S->C Player Info (Update latency action) (1.16?)
|
||||||
@ -234,6 +234,9 @@ impl NetworkClient {
|
|||||||
// TODO: S->C Chunk Data
|
// TODO: S->C Chunk Data
|
||||||
// TODO: S->C World Border
|
// TODO: S->C World Border
|
||||||
// TODO: S->C Spawn Position
|
// TODO: S->C Spawn Position
|
||||||
|
let spawnposition = SpawnPosition::new();
|
||||||
|
spawnposition.write(&mut self.stream).await.unwrap();
|
||||||
|
debug!("{:?}", spawnposition);
|
||||||
// TODO: S->C Player Position and Look
|
// TODO: S->C Player Position and Look
|
||||||
// TODO: C->S Teleport Confirm
|
// TODO: C->S Teleport Confirm
|
||||||
// TODO: C->S Player Position and Look
|
// TODO: C->S Player Position and Look
|
||||||
|
@ -391,3 +391,44 @@ impl PlayerPositionAndLook {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Actually send the position.
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct SpawnPosition {
|
||||||
|
position: MCPosition,
|
||||||
|
}
|
||||||
|
impl Into<Vec<u8>> for SpawnPosition {
|
||||||
|
fn into(self) -> Vec<u8> {
|
||||||
|
let mut out = vec![];
|
||||||
|
let mut temp: Vec<u8> = MCVarInt::from(0x05).into(); // 0x05 Spawn Position.
|
||||||
|
// temp.extend_from_slice(&Into::<Vec<u8>>::into(self.position));
|
||||||
|
temp.extend_from_slice(&0u64.to_be_bytes());
|
||||||
|
out.extend_from_slice(&Into::<Vec<u8>>::into(MCVarInt::from(temp.len() as i32)));
|
||||||
|
out.extend_from_slice(&temp);
|
||||||
|
out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl TryFrom<Vec<u8>> for SpawnPosition {
|
||||||
|
type Error = &'static str;
|
||||||
|
fn try_from(_bytes: Vec<u8>) -> Result<Self, Self::Error> {
|
||||||
|
Err("unimplemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl SpawnPosition {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
SpawnPosition {
|
||||||
|
position: MCPosition::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub async fn read(t: &mut TcpStream) -> tokio::io::Result<Self> {
|
||||||
|
let mut spawnposition = SpawnPosition::new();
|
||||||
|
spawnposition.position = MCPosition::read(t).await?;
|
||||||
|
Ok(spawnposition)
|
||||||
|
}
|
||||||
|
pub async fn write(&self, t: &mut TcpStream) -> tokio::io::Result<()> {
|
||||||
|
for b in Into::<Vec<u8>>::into(self.clone()) {
|
||||||
|
write_byte(t, b).await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user