mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 06:16:04 +00:00
Fix everything so azalea-buf works
This commit is contained in:
parent
1089aa7961
commit
37c6618c16
98 changed files with 424 additions and 276 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -96,6 +96,7 @@ dependencies = [
|
|||
"buf-macros",
|
||||
"byteorder",
|
||||
"tokio",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -150,8 +151,10 @@ dependencies = [
|
|||
name = "azalea-entity"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"azalea-buf",
|
||||
"azalea-chat",
|
||||
"azalea-core",
|
||||
"azalea-protocol",
|
||||
"azalea-nbt",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
|
@ -188,6 +191,7 @@ dependencies = [
|
|||
"azalea-chat",
|
||||
"azalea-core",
|
||||
"azalea-crypto",
|
||||
"azalea-entity",
|
||||
"azalea-nbt",
|
||||
"byteorder",
|
||||
"bytes",
|
||||
|
@ -209,10 +213,10 @@ name = "azalea-world"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"azalea-block",
|
||||
"azalea-buf",
|
||||
"azalea-core",
|
||||
"azalea-entity",
|
||||
"azalea-nbt",
|
||||
"azalea-protocol",
|
||||
"log",
|
||||
"nohash-hasher",
|
||||
]
|
||||
|
|
|
@ -9,3 +9,4 @@ version = "0.1.0"
|
|||
buf-macros = {path = "./buf-macros"}
|
||||
byteorder = "1.4.3"
|
||||
tokio = {version = "^1.19.2", features = ["io-util", "net", "macros"]}
|
||||
uuid = "1.1.2"
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
use buf_macros::McBuf;
|
||||
use std::ops::Deref;
|
||||
use crate::{McBufReadable, McBufWritable};
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
ops::Deref,
|
||||
};
|
||||
|
||||
/// A Vec<u8> that isn't prefixed by a VarInt with the size.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
|
@ -26,7 +29,7 @@ impl From<&str> for UnsizedByteArray {
|
|||
}
|
||||
|
||||
/// Represents Java's BitSet, a list of bits.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, McBuf)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct BitSet {
|
||||
data: Vec<u64>,
|
||||
}
|
||||
|
@ -37,3 +40,17 @@ impl BitSet {
|
|||
(self.data[index / 64] & (1u64 << (index % 64))) != 0
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufReadable for BitSet {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
Ok(Self {
|
||||
data: Vec::<u64>::read_into(buf)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for BitSet {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
self.data.write_into(buf)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,11 +5,13 @@
|
|||
|
||||
mod definitions;
|
||||
mod read;
|
||||
mod serializable_uuid;
|
||||
mod write;
|
||||
|
||||
pub use buf_macros::*;
|
||||
pub use definitions::*;
|
||||
pub use read::{read_varint_async, McBufReadable, McBufVarReadable, Readable};
|
||||
pub use serializable_uuid::*;
|
||||
pub use write::{McBufVarWritable, McBufWritable, Writable};
|
||||
|
||||
// const DEFAULT_NBT_QUOTA: u32 = 2097152;
|
||||
|
|
13
azalea-core/src/serializable_uuid.rs → azalea-buf/src/serializable_uuid.rs
Executable file → Normal file
13
azalea-core/src/serializable_uuid.rs → azalea-buf/src/serializable_uuid.rs
Executable file → Normal file
|
@ -1,3 +1,5 @@
|
|||
use crate::{McBufReadable, McBufWritable, Readable};
|
||||
use std::io::{Read, Write};
|
||||
use uuid::Uuid;
|
||||
|
||||
pub trait SerializableUuid {
|
||||
|
@ -33,10 +35,10 @@ impl SerializableUuid for Uuid {
|
|||
impl McBufReadable for Uuid {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
Ok(Uuid::from_int_array([
|
||||
Readable::read_int(self)? as u32,
|
||||
Readable::read_int(self)? as u32,
|
||||
Readable::read_int(self)? as u32,
|
||||
Readable::read_int(self)? as u32,
|
||||
Readable::read_int(buf)? as u32,
|
||||
Readable::read_int(buf)? as u32,
|
||||
Readable::read_int(buf)? as u32,
|
||||
Readable::read_int(buf)? as u32,
|
||||
]))
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +54,8 @@ impl McBufWritable for Uuid {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(tests)]
|
||||
// TODO: add a test for Uuid in McBuf
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
@ -189,7 +189,9 @@ impl McBufVarWritable for i64 {
|
|||
if value != 0 {
|
||||
buffer[0] |= 0b1000_0000;
|
||||
}
|
||||
buf.write(&mut buffer)?;
|
||||
// this only writes a single byte, so write_all isn't necessary
|
||||
// the let _ = is so clippy doesn't complain
|
||||
let _ = buf.write(&mut buffer)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use crate::{Account, Player};
|
||||
use azalea_core::{resource_location::ResourceLocation, ChunkPos, EntityPos};
|
||||
use azalea_core::{ChunkPos, EntityPos, ResourceLocation};
|
||||
use azalea_entity::Entity;
|
||||
use azalea_protocol::{
|
||||
connect::{GameConnection, HandshakeConnection},
|
||||
|
@ -439,14 +439,14 @@ impl Client {
|
|||
let mut state_lock = state.lock()?;
|
||||
let world = state_lock.world.as_mut().unwrap();
|
||||
|
||||
world.move_entity(
|
||||
p.entity_id,
|
||||
EntityPos {
|
||||
x: p.x,
|
||||
y: p.y,
|
||||
z: p.z,
|
||||
},
|
||||
)?;
|
||||
// world.move_entity(
|
||||
// p.entity_id,
|
||||
// EntityPos {
|
||||
// x: p.x,
|
||||
// y: p.y,
|
||||
// z: p.z,
|
||||
// },
|
||||
// )?;
|
||||
}
|
||||
GamePacket::ClientboundMoveEntityRotPacket(p) => {
|
||||
println!("Got move entity rot packet {:?}", p);
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use crate::EntityPos;
|
||||
pub use azalea_buf::McBuf;
|
||||
|
||||
/// Only works for up to 8 blocks
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
use std::fmt::{Debug, Error, Formatter};
|
||||
use std::{
|
||||
fmt::{Debug, Error, Formatter},
|
||||
io::{Read, Write},
|
||||
};
|
||||
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
|
||||
#[derive(Hash, Clone, Debug, PartialEq)]
|
||||
pub enum Difficulty {
|
||||
PEACEFUL,
|
||||
EASY,
|
||||
NORMAL,
|
||||
HARD,
|
||||
PEACEFUL = 0,
|
||||
EASY = 1,
|
||||
NORMAL = 2,
|
||||
HARD = 3,
|
||||
}
|
||||
|
||||
pub enum Err {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use azalea_buf::McBuf;
|
||||
|
||||
#[derive(Clone, Copy, Debug, McBuf)]
|
||||
pub enum Direction {
|
||||
Down = 0,
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
#[derive(Hash, Clone, Debug)]
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Hash, Copy, Clone, Debug)]
|
||||
pub enum GameType {
|
||||
SURVIVAL,
|
||||
CREATIVE,
|
||||
|
@ -17,8 +20,8 @@ impl GameType {
|
|||
}
|
||||
|
||||
/// Get the id of the game type, but return -1 if the game type is invalid.
|
||||
pub fn to_optional_id(game_type: &Option<GameType>) -> i8 {
|
||||
match game_type {
|
||||
pub fn to_optional_id<T: Into<Option<GameType>>>(game_type: T) -> i8 {
|
||||
match game_type.into() {
|
||||
Some(game_type) => game_type.to_id() as i8,
|
||||
None => -1,
|
||||
}
|
||||
|
@ -34,11 +37,12 @@ impl GameType {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn from_optional_id(id: i8) -> Result<Option<GameType>, String> {
|
||||
pub fn from_optional_id(id: i8) -> Result<OptionalGameType, String> {
|
||||
Ok(match id {
|
||||
-1 => None,
|
||||
id => Some(GameType::from_id(id as u8)?),
|
||||
})
|
||||
}
|
||||
.into())
|
||||
}
|
||||
|
||||
pub fn short_name(&self) -> &'static str {
|
||||
|
@ -74,13 +78,7 @@ impl GameType {
|
|||
|
||||
impl McBufReadable for GameType {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
GameType::from_id(buf.read_byte()?)
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufReadable for Option<GameType> {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
GameType::from_optional_id(buf.read_byte()? as i8)
|
||||
GameType::from_id(u8::read_into(buf)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,8 +88,30 @@ impl McBufWritable for GameType {
|
|||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for Option<GameType> {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
buf.write_byte(GameType::to_optional_id(self) as u8)
|
||||
/// Rust doesn't let us `impl McBufReadable for Option<GameType>` so we have to make a new type :(
|
||||
#[derive(Hash, Copy, Clone, Debug)]
|
||||
pub struct OptionalGameType(Option<GameType>);
|
||||
|
||||
impl From<Option<GameType>> for OptionalGameType {
|
||||
fn from(game_type: Option<GameType>) -> Self {
|
||||
OptionalGameType(game_type)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<OptionalGameType> for Option<GameType> {
|
||||
fn from(optional_game_type: OptionalGameType) -> Self {
|
||||
optional_game_type.0
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufReadable for OptionalGameType {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
GameType::from_optional_id(i8::read_into(buf)?)
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for OptionalGameType {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
GameType::to_optional_id(*self).write_into(buf)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,14 @@
|
|||
|
||||
#![feature(int_roundings)]
|
||||
|
||||
pub mod difficulty;
|
||||
pub mod game_type;
|
||||
pub mod resource_location;
|
||||
pub mod serializable_uuid;
|
||||
mod difficulty;
|
||||
pub use difficulty::*;
|
||||
|
||||
mod resource_location;
|
||||
pub use resource_location::*;
|
||||
|
||||
mod game_type;
|
||||
pub use game_type::*;
|
||||
|
||||
mod slot;
|
||||
pub use slot::{Slot, SlotData};
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
use crate::{BlockPos, Slot};
|
||||
use azalea_buf::{McBuf, McBufReadable, McBufVarReadable, McBufWritable};
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Debug, Clone, McBuf)]
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
use std::ops::Rem;
|
||||
|
||||
use crate::resource_location::ResourceLocation;
|
||||
use crate::ResourceLocation;
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
ops::Rem,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||
pub struct BlockPos {
|
||||
|
@ -202,11 +205,10 @@ impl McBufReadable for ChunkSectionPos {
|
|||
|
||||
impl McBufWritable for BlockPos {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
buf.write_long(
|
||||
(((self.x & 0x3FFFFFF) as i64) << 38)
|
||||
| (((self.z & 0x3FFFFFF) as i64) << 12)
|
||||
| ((self.y & 0xFFF) as i64),
|
||||
)
|
||||
let data = (((self.x & 0x3FFFFFF) as i64) << 38)
|
||||
| (((self.z & 0x3FFFFFF) as i64) << 12)
|
||||
| ((self.y & 0xFFF) as i64);
|
||||
data.write_into(buf)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
//! A resource, like minecraft:stone
|
||||
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Hash, Clone, PartialEq, Eq)]
|
||||
pub struct ResourceLocation {
|
||||
pub namespace: String,
|
||||
|
@ -44,18 +47,20 @@ impl std::fmt::Debug for ResourceLocation {
|
|||
|
||||
impl McBufReadable for ResourceLocation {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let location_string = self.read_utf()?;
|
||||
let location_string = String::read_into(buf)?;
|
||||
ResourceLocation::new(&location_string)
|
||||
}
|
||||
}
|
||||
impl McBufWritable for ResourceLocation {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
buf.write_utf(&self.to_string())
|
||||
self.to_string().write_into(buf)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::io::Cursor;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
|
@ -86,13 +91,14 @@ mod tests {
|
|||
#[test]
|
||||
fn mcbuf_resource_location() {
|
||||
let mut buf = Vec::new();
|
||||
buf.write_resource_location(&ResourceLocation::new("minecraft:dirt").unwrap())
|
||||
.unwrap();
|
||||
ResourceLocation::new("minecraft:dirt")
|
||||
.unwrap()
|
||||
.write_into(&mut buf)?;
|
||||
|
||||
let mut buf = Cursor::new(buf);
|
||||
|
||||
assert_eq!(
|
||||
buf.read_resource_location().unwrap(),
|
||||
ResourceLocation::read_into(&mut buf).unwrap(),
|
||||
ResourceLocation::new("minecraft:dirt").unwrap()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
// TODO: have an azalea-inventory or azalea-container crate and put this there
|
||||
|
||||
use azalea_buf::{McBuf, McBufReadable, McBufWritable};
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Slot {
|
||||
Present(SlotData),
|
||||
Empty,
|
||||
Present(SlotData),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
#[derive(Debug, Clone, McBuf)]
|
||||
pub struct SlotData {
|
||||
#[var]
|
||||
pub id: i32,
|
||||
pub count: u8,
|
||||
pub nbt: azalea_nbt::Tag,
|
||||
|
@ -15,26 +19,20 @@ pub struct SlotData {
|
|||
|
||||
impl McBufReadable for Slot {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let present = buf.read_boolean()?;
|
||||
let present = bool::read_into(buf)?;
|
||||
if !present {
|
||||
return Ok(Slot::Empty);
|
||||
}
|
||||
let id = buf.read_varint()?;
|
||||
let count = buf.read_byte()?;
|
||||
let nbt = buf.read_nbt()?;
|
||||
Ok(Slot::Present(SlotData { id, count, nbt }))
|
||||
let slot = SlotData::read_into(buf)?;
|
||||
Ok(Slot::Present(slot))
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for Slot {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
match self {
|
||||
Slot::Empty => buf.write_byte(0)?,
|
||||
Slot::Present(i) => {
|
||||
buf.write_varint(i.id)?;
|
||||
buf.write_byte(i.count)?;
|
||||
buf.write_nbt(&i.nbt)?;
|
||||
}
|
||||
Slot::Empty => 0u8.write_into(buf)?,
|
||||
Slot::Present(i) => i.write_into(buf)?,
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
|
@ -6,10 +6,8 @@ version = "0.1.0"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
azalea-buf = {path = "../azalea-buf"}
|
||||
azalea-chat = {path = "../azalea-chat"}
|
||||
azalea-core = {path = "../azalea-core"}
|
||||
azalea-protocol = {path = "../azalea-protocol", optional = true}
|
||||
azalea-nbt = {path = "../azalea-nbt"}
|
||||
uuid = "^1.1.2"
|
||||
|
||||
[features]
|
||||
default = ["protocol"]
|
||||
protocol = ["dep:azalea-protocol"]
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
pub type EntityMetadata = Vec<EntityDataItem>;
|
||||
use azalea_buf::McBufVarReadable;
|
||||
use azalea_buf::{McBuf, McBufReadable, McBufWritable};
|
||||
use azalea_chat::component::Component;
|
||||
use azalea_core::{BlockPos, Direction, Particle, Slot};
|
||||
use std::io::{Read, Write};
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct EntityMetadata(Vec<EntityDataItem>);
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct EntityDataItem {
|
||||
|
@ -8,7 +16,7 @@ pub struct EntityDataItem {
|
|||
pub value: EntityDataValue,
|
||||
}
|
||||
|
||||
impl McBufReadable for Vec<EntityDataItem> {
|
||||
impl McBufReadable for EntityMetadata {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let mut metadata = Vec::new();
|
||||
loop {
|
||||
|
@ -19,17 +27,17 @@ impl McBufReadable for Vec<EntityDataItem> {
|
|||
let value = EntityDataValue::read_into(buf)?;
|
||||
metadata.push(EntityDataItem { index, value });
|
||||
}
|
||||
Ok(metadata)
|
||||
Ok(EntityMetadata(metadata))
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for Vec<EntityDataItem> {
|
||||
impl McBufWritable for EntityMetadata {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
for item in self {
|
||||
buf.write_byte(item.index)?;
|
||||
for item in &self.0 {
|
||||
item.index.write_into(buf)?;
|
||||
item.value.write_into(buf)?;
|
||||
}
|
||||
buf.write_byte(0xff)?;
|
||||
0xffu8.write_into(buf)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -63,20 +71,20 @@ pub enum EntityDataValue {
|
|||
|
||||
impl McBufReadable for EntityDataValue {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let type_ = buf.read_varint()?;
|
||||
Ok(match type_ {
|
||||
0 => EntityDataValue::Byte(buf.read_byte()?),
|
||||
1 => EntityDataValue::Int(buf.read_varint()?),
|
||||
2 => EntityDataValue::Float(buf.read_float()?),
|
||||
3 => EntityDataValue::String(buf.read_utf()?),
|
||||
let data_type = i32::var_read_into(buf)?;
|
||||
Ok(match data_type {
|
||||
0 => EntityDataValue::Byte(u8::read_into(buf)?),
|
||||
1 => EntityDataValue::Int(i32::read_into(buf)?),
|
||||
2 => EntityDataValue::Float(f32::read_into(buf)?),
|
||||
3 => EntityDataValue::String(String::read_into(buf)?),
|
||||
4 => EntityDataValue::Component(Component::read_into(buf)?),
|
||||
5 => EntityDataValue::OptionalComponent(Option::<Component>::read_into(buf)?),
|
||||
6 => EntityDataValue::ItemStack(Slot::read_into(buf)?),
|
||||
7 => EntityDataValue::Boolean(buf.read_boolean()?),
|
||||
7 => EntityDataValue::Boolean(bool::read_into(buf)?),
|
||||
8 => EntityDataValue::Rotations {
|
||||
x: buf.read_float()?,
|
||||
y: buf.read_float()?,
|
||||
z: buf.read_float()?,
|
||||
x: f32::read_into(buf)?,
|
||||
y: f32::read_into(buf)?,
|
||||
z: f32::read_into(buf)?,
|
||||
},
|
||||
9 => EntityDataValue::BlockPos(BlockPos::read_into(buf)?),
|
||||
10 => EntityDataValue::OptionalBlockPos(Option::<BlockPos>::read_into(buf)?),
|
||||
|
@ -94,7 +102,7 @@ impl McBufReadable for EntityDataValue {
|
|||
15 => EntityDataValue::Particle(Particle::read_into(buf)?),
|
||||
16 => EntityDataValue::VillagerData(VillagerData::read_into(buf)?),
|
||||
17 => EntityDataValue::OptionalUnsignedInt({
|
||||
let val = buf.read_varint()?;
|
||||
let val = u32::var_read_into(buf)?;
|
||||
if val == 0 {
|
||||
None
|
||||
} else {
|
||||
|
@ -102,7 +110,7 @@ impl McBufReadable for EntityDataValue {
|
|||
}
|
||||
}),
|
||||
18 => EntityDataValue::Pose(Pose::read_into(buf)?),
|
||||
_ => return Err(format!("Unknown entity data type: {}", type_)),
|
||||
_ => return Err(format!("Unknown entity data type: {}", data_type)),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ use azalea_protocol::packets::game::{
|
|||
clientbound_add_entity_packet::ClientboundAddEntityPacket,
|
||||
clientbound_add_player_packet::ClientboundAddPlayerPacket,
|
||||
};
|
||||
pub use data::*;
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
|
@ -13,10 +14,14 @@ pub struct Entity {
|
|||
/// The incrementing numerical id of the entity.
|
||||
pub id: u32,
|
||||
pub uuid: Uuid,
|
||||
pos: EntityPos,
|
||||
pub pos: EntityPos,
|
||||
}
|
||||
|
||||
impl Entity {
|
||||
pub fn new(id: u32, uuid: Uuid, pos: EntityPos) -> Self {
|
||||
Self { id, uuid, pos }
|
||||
}
|
||||
|
||||
pub fn pos(&self) -> &EntityPos {
|
||||
&self.pos
|
||||
}
|
||||
|
@ -28,36 +33,6 @@ impl Entity {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "protocol")]
|
||||
impl From<&ClientboundAddEntityPacket> for Entity {
|
||||
fn from(p: &ClientboundAddEntityPacket) -> Self {
|
||||
Self {
|
||||
id: p.id,
|
||||
uuid: p.uuid,
|
||||
pos: EntityPos {
|
||||
x: p.x,
|
||||
y: p.y,
|
||||
z: p.z,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "protocol")]
|
||||
impl From<&ClientboundAddPlayerPacket> for Entity {
|
||||
fn from(p: &ClientboundAddPlayerPacket) -> Self {
|
||||
Self {
|
||||
id: p.id,
|
||||
uuid: p.uuid,
|
||||
pos: EntityPos {
|
||||
x: p.x,
|
||||
y: p.y,
|
||||
z: p.z,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #[cfg(test)]
|
||||
// mod tests {
|
||||
// #[test]
|
||||
|
|
|
@ -14,6 +14,7 @@ azalea-buf = {path = "../azalea-buf"}
|
|||
azalea-chat = {path = "../azalea-chat"}
|
||||
azalea-core = {path = "../azalea-core", optional = true}
|
||||
azalea-crypto = {path = "../azalea-crypto"}
|
||||
azalea-entity = {path = "../azalea-entity"}
|
||||
azalea-nbt = {path = "../azalea-nbt"}
|
||||
byteorder = "^1.4.3"
|
||||
bytes = "^1.1.0"
|
||||
|
|
|
@ -25,13 +25,13 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke
|
|||
}
|
||||
|
||||
pub fn write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
|
||||
crate::mc_buf::McBufWritable::write_into(self, buf)
|
||||
azalea_buf::McBufWritable::write_into(self, buf)
|
||||
}
|
||||
|
||||
pub fn read(
|
||||
buf: &mut impl std::io::Read,
|
||||
) -> Result<#state, String> {
|
||||
use crate::mc_buf::McBufReadable;
|
||||
use azalea_buf::McBufReadable;
|
||||
Ok(Self::read_into(buf)?.get())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ use std::str::FromStr;
|
|||
|
||||
#[cfg(feature = "connecting")]
|
||||
pub mod connect;
|
||||
pub mod mc_buf;
|
||||
#[cfg(feature = "packets")]
|
||||
pub mod packets;
|
||||
pub mod read;
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::EntityPos;
|
||||
use azalea_entity::Entity;
|
||||
use packet_macros::GamePacket;
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
@ -22,3 +25,17 @@ pub struct ClientboundAddEntityPacket {
|
|||
pub y_vel: i16,
|
||||
pub z_vel: i16,
|
||||
}
|
||||
|
||||
impl From<&ClientboundAddEntityPacket> for Entity {
|
||||
fn from(p: &ClientboundAddEntityPacket) -> Self {
|
||||
Self::new(
|
||||
p.id,
|
||||
p.uuid,
|
||||
EntityPos {
|
||||
x: p.x,
|
||||
y: p.y,
|
||||
z: p.z,
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::EntityPos;
|
||||
use azalea_entity::Entity;
|
||||
use packet_macros::GamePacket;
|
||||
use uuid::Uuid;
|
||||
|
||||
/// This packet is sent by the server when a player comes into visible range, not when a player joins.
|
||||
|
@ -13,3 +16,17 @@ pub struct ClientboundAddPlayerPacket {
|
|||
pub x_rot: i8,
|
||||
pub y_rot: i8,
|
||||
}
|
||||
|
||||
impl From<&ClientboundAddPlayerPacket> for Entity {
|
||||
fn from(p: &ClientboundAddPlayerPacket) -> Self {
|
||||
Self::new(
|
||||
p.id,
|
||||
p.uuid,
|
||||
EntityPos {
|
||||
x: p.x,
|
||||
y: p.y,
|
||||
z: p.z,
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundAnimatePacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundBlockChangedAckPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_core::BlockPos;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundBlockUpdatePacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_core::difficulty::Difficulty;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::Difficulty;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundChangeDifficultyPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundChatPreviewPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_core::Slot;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundContainerSetContentPacket {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::UnsizedByteArray;
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::UnsizedByteArray;
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundCustomPayloadPacket {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
use super::GamePacket;
|
||||
use crate::mc_buf::McBufVarReadable;
|
||||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::McBufVarReadable;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
use std::{
|
||||
hash::Hash,
|
||||
io::{Read, Write},
|
||||
|
@ -182,10 +183,10 @@ impl McBufReadable for BrigadierParser {
|
|||
41 => Ok(BrigadierParser::Dimension),
|
||||
42 => Ok(BrigadierParser::Time),
|
||||
43 => Ok(BrigadierParser::ResourceOrTag {
|
||||
registry_key: buf.read_resource_location()?,
|
||||
registry_key: ResourceLocation::read_into(buf)?,
|
||||
}),
|
||||
44 => Ok(BrigadierParser::Resource {
|
||||
registry_key: buf.read_resource_location()?,
|
||||
registry_key: ResourceLocation::read_into(buf)?,
|
||||
}),
|
||||
45 => Ok(BrigadierParser::TemplateMirror),
|
||||
46 => Ok(BrigadierParser::TemplateRotation),
|
||||
|
@ -218,7 +219,7 @@ impl McBufReadable for BrigadierNodeStub {
|
|||
let _name = buf.read_utf()?;
|
||||
let _parser = BrigadierParser::read_into(buf)?;
|
||||
let _suggestions_type = if has_suggestions_type {
|
||||
Some(buf.read_resource_location()?)
|
||||
Some(ResourceLocation::read_into(buf)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundDisconnectPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
// we can't identify the status in azalea-protocol since they vary depending on the entity
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundEntityVelocityPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundGameEventPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundInitializeBorderPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundKeepAlivePacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
use super::clientbound_light_update_packet::ClientboundLightUpdatePacketData;
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_core::BlockPos;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundLevelEventPacket {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use crate::mc_buf::McBufVarReadable;
|
||||
use crate::mc_buf::{McBufReadable, McBufWritable, ParticleData};
|
||||
use azalea_buf::{McBufReadable, McBufVarReadable, McBufWritable};
|
||||
use azalea_core::ParticleData;
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::mc_buf::BitSet;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::BitSet;
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundLightUpdatePacket {
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
use azalea_core::{game_type::GameType, resource_location::ResourceLocation, GlobalPos};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::{GameType, GlobalPos, OptionalGameType, ResourceLocation};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundLoginPacket {
|
||||
pub player_id: u32,
|
||||
pub hardcore: bool,
|
||||
pub game_type: GameType,
|
||||
pub previous_game_type: Option<GameType>,
|
||||
pub previous_game_type: OptionalGameType,
|
||||
pub levels: Vec<ResourceLocation>,
|
||||
pub registry_holder: azalea_nbt::Tag,
|
||||
pub dimension_type: ResourceLocation,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_core::EntityPos;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_core::{EntityPos, PositionDelta};
|
||||
use packet_macros::GamePacket;
|
||||
use azalea_buf::McBuf;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundMoveEntityPosPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use super::clientbound_move_entity_pos_packet::PositionDelta;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::PositionDelta;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
/// This packet is sent by the server when an entity moves less then 8 blocks.
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundMoveEntityRotPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable};
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use azalea_crypto::SaltSignaturePair;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundPlayerChatPacket {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
use uuid::Uuid;
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable};
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundRemoveEntitiesPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundRotateHeadPacket {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
|
||||
use azalea_core::{ChunkSectionBlockPos, ChunkSectionPos};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundServerDataPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
/// Sent to change the player's slot selection.
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetChunkCacheCenterPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_core::BlockPos;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetDefaultSpawnPositionPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetDisplayChatPreviewPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::mc_buf::EntityMetadata;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_entity::EntityMetadata;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetEntityDataPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetEntityLinkPacket {
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_core::Slot;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
use crate::mc_buf::{McBufReadable, McBufWritable};
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetEquipmentPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetExperiencePacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetHealthPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSetTimePacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSoundPacket {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundSystemChatPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundTeleportEntityPacket {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use crate::packets::{McBufReadable, McBufWritable};
|
||||
use azalea_buf::{McBuf, McBufReadable, McBufWritable};
|
||||
use azalea_chat::component::Component;
|
||||
use azalea_core::{resource_location::ResourceLocation, Slot};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_core::{ResourceLocation, Slot};
|
||||
use packet_macros::GamePacket;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
io::{Read, Write},
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
use std::io::{Read, Write};
|
||||
use uuid::Uuid;
|
||||
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
use std::io::{Read, Write};
|
||||
|
||||
use azalea_core::{resource_location::ResourceLocation, Slot};
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_core::{ResourceLocation, Slot};
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundUpdateRecipesPacket {
|
||||
|
@ -129,8 +130,8 @@ impl McBufWritable for Recipe {
|
|||
|
||||
impl McBufReadable for Recipe {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let recipe_type = buf.read_resource_location()?;
|
||||
let identifier = buf.read_resource_location()?;
|
||||
let recipe_type = ResourceLocation::read_into(buf)?;
|
||||
let identifier = ResourceLocation::read_into(buf)?;
|
||||
|
||||
// rust doesn't let us match ResourceLocation so we have to do a big
|
||||
// if-else chain :(
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
use std::ops::Deref;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
io::{Read, Write},
|
||||
|
@ -8,7 +10,7 @@ use std::{
|
|||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundUpdateTagsPacket {
|
||||
pub tags: HashMap<ResourceLocation, Vec<Tags>>,
|
||||
pub tags: TagMap,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -17,12 +19,15 @@ pub struct Tags {
|
|||
pub elements: Vec<i32>,
|
||||
}
|
||||
|
||||
impl McBufReadable for HashMap<ResourceLocation, Vec<Tags>> {
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct TagMap(HashMap<ResourceLocation, Vec<Tags>>);
|
||||
|
||||
impl McBufReadable for TagMap {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let length = buf.read_varint()? as usize;
|
||||
let mut data = HashMap::with_capacity(length);
|
||||
for _ in 0..length {
|
||||
let tag_type = buf.read_resource_location()?;
|
||||
let tag_type = ResourceLocation::read_into(buf)?;
|
||||
let tags_count = buf.read_varint()? as usize;
|
||||
let mut tags_vec = Vec::with_capacity(tags_count);
|
||||
for _ in 0..tags_count {
|
||||
|
@ -31,14 +36,14 @@ impl McBufReadable for HashMap<ResourceLocation, Vec<Tags>> {
|
|||
}
|
||||
data.insert(tag_type, tags_vec);
|
||||
}
|
||||
Ok(data)
|
||||
Ok(TagMap(data))
|
||||
}
|
||||
}
|
||||
|
||||
impl McBufWritable for HashMap<ResourceLocation, Vec<Tags>> {
|
||||
impl McBufWritable for TagMap {
|
||||
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
|
||||
buf.write_varint(self.len() as i32)?;
|
||||
for (k, v) in self {
|
||||
for (k, v) in &self.0 {
|
||||
k.write_into(buf)?;
|
||||
v.write_into(buf)?;
|
||||
}
|
||||
|
@ -47,7 +52,7 @@ impl McBufWritable for HashMap<ResourceLocation, Vec<Tags>> {
|
|||
}
|
||||
impl McBufReadable for Tags {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
let name = buf.read_resource_location()?;
|
||||
let name = ResourceLocation::read_into(buf)?;
|
||||
let elements = buf.read_int_id_list()?;
|
||||
Ok(Tags { name, elements })
|
||||
}
|
||||
|
@ -60,3 +65,11 @@ impl McBufWritable for Tags {
|
|||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Deref for TagMap {
|
||||
type Target = HashMap<ResourceLocation, Vec<Tags>>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ClientboundUpdateViewDistancePacket {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundChatCommandPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundChatPreviewPacket {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::mc_buf::UnsizedByteArray;
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use azalea_buf::UnsizedByteArray;
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundCustomPayloadPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundKeepAlivePacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundMovePlayerPacketPos {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundMovePlayerPacketPosRot {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundMovePlayerPacketRot {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{GamePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::GamePacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, GamePacket)]
|
||||
pub struct ServerboundMovePlayerPacketStatusOnly {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::packets::ConnectionProtocol;
|
||||
use packet_macros::{HandshakePacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::HandshakePacket;
|
||||
use std::hash::Hash;
|
||||
|
||||
#[derive(Hash, Clone, Debug, McBuf, HandshakePacket)]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use crate::mc_buf::UnsizedByteArray;
|
||||
use azalea_core::resource_location::ResourceLocation;
|
||||
use packet_macros::{LoginPacket, McBuf};
|
||||
use azalea_buf::{McBuf, UnsizedByteArray};
|
||||
use azalea_core::ResourceLocation;
|
||||
use packet_macros::LoginPacket;
|
||||
use std::hash::Hash;
|
||||
|
||||
#[derive(Hash, Clone, Debug, McBuf, LoginPacket)]
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
use std::io::{Read, Write};
|
||||
|
||||
use super::LoginPacket;
|
||||
use crate::mc_buf::McBufReadable;
|
||||
use crate::mc_buf::{Readable, Writable};
|
||||
use azalea_auth::game_profile::GameProfile;
|
||||
use azalea_core::serializable_uuid::SerializableUuid;
|
||||
use azalea_buf::{McBufReadable, Readable, SerializableUuid, Writable};
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use azalea_buf::McBuf;
|
||||
use packet_macros::LoginPacket;
|
||||
use packet_macros::McBuf;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, LoginPacket)]
|
||||
pub struct ClientboundHelloPacket {
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::{
|
|||
io::{Read, Write},
|
||||
};
|
||||
|
||||
use crate::mc_buf::{Readable, Writable};
|
||||
use azalea_buf::{Readable, Writable};
|
||||
|
||||
use super::LoginPacket;
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_chat::component::Component;
|
||||
use packet_macros::{LoginPacket, McBuf};
|
||||
use packet_macros::LoginPacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, LoginPacket)]
|
||||
pub struct ClientboundLoginDisconnectPacket {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{LoginPacket, McBuf};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::LoginPacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, LoginPacket)]
|
||||
pub struct ServerboundHelloPacket {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
use azalea_buf::McBuf;
|
||||
use azalea_crypto::SaltSignaturePair;
|
||||
use packet_macros::{LoginPacket, McBuf};
|
||||
use packet_macros::LoginPacket;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
use crate::mc_buf::{McBufReadable, McBufWritable};
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
|
||||
#[derive(Clone, Debug, McBuf, LoginPacket)]
|
||||
pub struct ServerboundKeyPacket {
|
||||
|
|
|
@ -3,14 +3,11 @@ pub mod handshake;
|
|||
pub mod login;
|
||||
pub mod status;
|
||||
|
||||
use std::io::{Read, Write};
|
||||
|
||||
use crate::{
|
||||
connect::PacketFlow,
|
||||
mc_buf::{McBufReadable, McBufWritable, Readable, Writable},
|
||||
};
|
||||
use crate::connect::PacketFlow;
|
||||
use azalea_buf::{McBufReadable, McBufWritable, Readable, Writable};
|
||||
use num_derive::FromPrimitive;
|
||||
use num_traits::FromPrimitive;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
pub const PROTOCOL_VERSION: u32 = 759;
|
||||
|
||||
|
@ -43,7 +40,7 @@ where
|
|||
fn write(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
|
||||
}
|
||||
|
||||
impl crate::mc_buf::McBufReadable for ConnectionProtocol {
|
||||
impl azalea_buf::McBufReadable for ConnectionProtocol {
|
||||
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
|
||||
ConnectionProtocol::from_i32(buf.read_varint()?)
|
||||
.ok_or_else(|| "Invalid intention".to_string())
|
||||
|
|
|
@ -4,7 +4,7 @@ use azalea_chat::component::Component;
|
|||
use serde::Deserialize;
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::mc_buf::Readable;
|
||||
use azalea_buf::Readable;
|
||||
|
||||
use super::StatusPacket;
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use packet_macros::{McBuf, StatusPacket};
|
||||
use azalea_buf::McBuf;
|
||||
use packet_macros::StatusPacket;
|
||||
|
||||
#[derive(Clone, Debug, McBuf, StatusPacket)]
|
||||
pub struct ServerboundStatusRequestPacket {}
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
use crate::{
|
||||
connect::PacketFlow,
|
||||
mc_buf::{read_varint_async, Readable},
|
||||
packets::ProtocolPacket,
|
||||
};
|
||||
use crate::{connect::PacketFlow, packets::ProtocolPacket};
|
||||
use azalea_buf::{read_varint_async, Readable};
|
||||
use azalea_crypto::Aes128CfbDec;
|
||||
use flate2::read::ZlibDecoder;
|
||||
use std::{
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::{mc_buf::Writable, packets::ProtocolPacket, read::MAXIMUM_UNCOMPRESSED_LENGTH};
|
||||
use crate::{packets::ProtocolPacket, read::MAXIMUM_UNCOMPRESSED_LENGTH};
|
||||
use async_compression::tokio::bufread::ZlibEncoder;
|
||||
use azalea_buf::Writable;
|
||||
use azalea_crypto::Aes128CfbEnc;
|
||||
use std::fmt::Debug;
|
||||
use tokio::io::{AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
||||
|
|
|
@ -7,10 +7,10 @@ version = "0.1.0"
|
|||
|
||||
[dependencies]
|
||||
azalea-block = {path = "../azalea-block"}
|
||||
azalea-buf = {path = "../azalea-buf"}
|
||||
azalea-core = {path = "../azalea-core"}
|
||||
azalea-entity = {path = "../azalea-entity"}
|
||||
azalea-nbt = {path = "../azalea-nbt"}
|
||||
azalea-protocol = {path = "../azalea-protocol"}
|
||||
log = "0.4.17"
|
||||
nohash-hasher = "0.2.0"
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@ use crate::palette::PalettedContainer;
|
|||
use crate::palette::PalettedContainerType;
|
||||
use crate::World;
|
||||
use azalea_block::BlockState;
|
||||
use azalea_buf::{McBufReadable, McBufWritable};
|
||||
use azalea_core::{BlockPos, ChunkBlockPos, ChunkPos, ChunkSectionBlockPos};
|
||||
use azalea_protocol::mc_buf::{McBufReadable, McBufWritable};
|
||||
use std::fmt::Debug;
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
|
|
|
@ -72,21 +72,21 @@ impl World {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub fn move_entity_with_delta(&mut self, entity_id: u32, delta: PositionDelta) -> Result<(), String> {
|
||||
let entity = self
|
||||
.entity_storage
|
||||
.get_mut_by_id(entity_id)
|
||||
.ok_or_else(|| "Moving entity that doesn't exist".to_string())?;
|
||||
let old_chunk = ChunkPos::from(entity.pos());
|
||||
let new_chunk = ChunkPos::from(&new_pos);
|
||||
// this is fine because we update the chunk below
|
||||
entity.unsafe_move(new_pos);
|
||||
if old_chunk != new_chunk {
|
||||
self.entity_storage
|
||||
.update_entity_chunk(entity_id, &old_chunk, &new_chunk);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
// pub fn move_entity_with_delta(&mut self, entity_id: u32, delta: PositionDelta) -> Result<(), String> {
|
||||
// let entity = self
|
||||
// .entity_storage
|
||||
// .get_mut_by_id(entity_id)
|
||||
// .ok_or_else(|| "Moving entity that doesn't exist".to_string())?;
|
||||
// let old_chunk = ChunkPos::from(entity.pos());
|
||||
// let new_chunk = ChunkPos::from(&new_pos);
|
||||
// // this is fine because we update the chunk below
|
||||
// entity.unsafe_move(new_pos);
|
||||
// if old_chunk != new_chunk {
|
||||
// self.entity_storage
|
||||
// .update_entity_chunk(entity_id, &old_chunk, &new_chunk);
|
||||
// }
|
||||
// Ok(())
|
||||
// }
|
||||
|
||||
pub fn add_entity(&mut self, entity: Entity) {
|
||||
self.entity_storage.insert(entity);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use azalea_protocol::mc_buf::{McBufReadable, McBufVarReadable, McBufWritable, Readable, Writable};
|
||||
use azalea_buf::{McBufReadable, McBufVarReadable, McBufWritable, Readable, Writable};
|
||||
use std::io::{Read, Write};
|
||||
|
||||
use crate::BitStorage;
|
||||
|
|
Loading…
Add table
Reference in a new issue