fix some typos
This commit is contained in:
parent
874b116cac
commit
2ee2cc06dd
@ -29,6 +29,8 @@ There are several ways you can contribute to Pumpkin:
|
|||||||
|
|
||||||
The Documentation of Pumpkin can be found at <https://snowiiii.github.io/Pumpkin/>
|
The Documentation of Pumpkin can be found at <https://snowiiii.github.io/Pumpkin/>
|
||||||
|
|
||||||
|
**Tip: [typos](https://github.com/crate-ci/typos) is a great Project to detect and automatically fix typos
|
||||||
|
|
||||||
### Coding Guidelines
|
### Coding Guidelines
|
||||||
|
|
||||||
- **Working with Tokio and Rayon:**
|
- **Working with Tokio and Rayon:**
|
||||||
|
|||||||
@ -21,7 +21,7 @@ impl Default for CompressionConfig {
|
|||||||
|
|
||||||
#[derive(Deserialize, Serialize, Clone)]
|
#[derive(Deserialize, Serialize, Clone)]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
/// We have this in a Seperate struct so we can use it outside of the Config
|
/// We have this in a Separate struct so we can use it outside of the Config
|
||||||
pub struct CompressionInfo {
|
pub struct CompressionInfo {
|
||||||
/// The compression threshold used when compression is enabled
|
/// The compression threshold used when compression is enabled
|
||||||
pub threshold: u32,
|
pub threshold: u32,
|
||||||
|
|||||||
@ -254,7 +254,7 @@ mod tests {
|
|||||||
-1992287231i32,
|
-1992287231i32,
|
||||||
),
|
),
|
||||||
("求同存异", 847053876),
|
("求同存异", 847053876),
|
||||||
// This might look wierd because hebrew is text is right to left
|
// This might look weird because hebrew is text is right to left
|
||||||
("אבְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ:", 1372570871),
|
("אבְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ:", 1372570871),
|
||||||
("संस्कृत-", 1748614838),
|
("संस्कृत-", 1748614838),
|
||||||
("minecraft:offset", -920384768i32),
|
("minecraft:offset", -920384768i32),
|
||||||
|
|||||||
@ -2,7 +2,7 @@ use std::borrow::Cow;
|
|||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::Text;
|
use super::TextComponent;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
||||||
#[serde(tag = "action", content = "contents", rename_all = "snake_case")]
|
#[serde(tag = "action", content = "contents", rename_all = "snake_case")]
|
||||||
@ -28,6 +28,6 @@ pub enum HoverEvent<'a> {
|
|||||||
kind: Option<Cow<'a, str>>,
|
kind: Option<Cow<'a, str>>,
|
||||||
/// Optional custom name for the entity
|
/// Optional custom name for the entity
|
||||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
name: Option<Text<'a>>,
|
name: Option<Box<TextComponent<'a>>>,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,11 +14,7 @@ pub mod color;
|
|||||||
pub mod hover;
|
pub mod hover;
|
||||||
pub mod style;
|
pub mod style;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
/// Represents a Text component
|
||||||
#[serde(transparent)]
|
|
||||||
pub struct Text<'a>(pub Box<TextComponent<'a>>);
|
|
||||||
|
|
||||||
// Represents a Text component
|
|
||||||
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct TextComponent<'a> {
|
pub struct TextComponent<'a> {
|
||||||
@ -29,6 +25,7 @@ pub struct TextComponent<'a> {
|
|||||||
/// Also has `ClickEvent
|
/// Also has `ClickEvent
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub style: Style<'a>,
|
pub style: Style<'a>,
|
||||||
|
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||||
/// Extra text components
|
/// Extra text components
|
||||||
pub extra: Vec<TextComponent<'a>>,
|
pub extra: Vec<TextComponent<'a>>,
|
||||||
}
|
}
|
||||||
@ -228,7 +225,7 @@ pub enum TextContent<'a> {
|
|||||||
Translate {
|
Translate {
|
||||||
translate: Cow<'a, str>,
|
translate: Cow<'a, str>,
|
||||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||||
with: Vec<Text<'a>>,
|
with: Vec<TextComponent<'a>>,
|
||||||
},
|
},
|
||||||
/// Displays the name of one or more entities found by a selector.
|
/// Displays the name of one or more entities found by a selector.
|
||||||
EntityNames {
|
EntityNames {
|
||||||
|
|||||||
@ -55,7 +55,7 @@ impl ser::Error for SerializerError {
|
|||||||
// Enums are written as a varint of the index
|
// Enums are written as a varint of the index
|
||||||
// Structs are ignored
|
// Structs are ignored
|
||||||
// Iterables' values are written in order, but NO information (e.g. size) about the
|
// Iterables' values are written in order, but NO information (e.g. size) about the
|
||||||
// iterable itself is written (list sizes should be a seperate field)
|
// iterable itself is written (list sizes should be a separate field)
|
||||||
impl ser::Serializer for &mut Serializer {
|
impl ser::Serializer for &mut Serializer {
|
||||||
type Ok = ();
|
type Ok = ();
|
||||||
type Error = SerializerError;
|
type Error = SerializerError;
|
||||||
@ -137,7 +137,7 @@ impl ser::Serializer for &mut Serializer {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
|
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
|
||||||
// here is where all arrays/list getting written, usally we prefix the length of every length with an var int. The problem is
|
// here is where all arrays/list getting written, usually we prefix the length of every length with an var int. The problem is
|
||||||
// that byte arrays also getting thrown in here, and we don't want to prefix them
|
// that byte arrays also getting thrown in here, and we don't want to prefix them
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -69,10 +69,10 @@ impl ProtoNode<'_> {
|
|||||||
name: _,
|
name: _,
|
||||||
is_executable,
|
is_executable,
|
||||||
parser: _,
|
parser: _,
|
||||||
override_suggestion_type: override_suggestion_tpye,
|
override_suggestion_type,
|
||||||
} => {
|
} => {
|
||||||
let mut n = 2;
|
let mut n = 2;
|
||||||
if override_suggestion_tpye.is_some() {
|
if override_suggestion_type.is_some() {
|
||||||
n |= Self::FLAG_HAS_SUGGESTION_TYPE
|
n |= Self::FLAG_HAS_SUGGESTION_TYPE
|
||||||
}
|
}
|
||||||
if is_executable {
|
if is_executable {
|
||||||
|
|||||||
@ -4,7 +4,7 @@ use pumpkin_macros::client_packet;
|
|||||||
use crate::{ClientPacket, PositionFlag, VarInt};
|
use crate::{ClientPacket, PositionFlag, VarInt};
|
||||||
|
|
||||||
#[client_packet("play:teleport_entity")]
|
#[client_packet("play:teleport_entity")]
|
||||||
pub struct CTeleportEntitiy<'a> {
|
pub struct CTeleportEntity<'a> {
|
||||||
entity_id: VarInt,
|
entity_id: VarInt,
|
||||||
position: Vector3<f64>,
|
position: Vector3<f64>,
|
||||||
delta: Vector3<f64>,
|
delta: Vector3<f64>,
|
||||||
@ -14,7 +14,7 @@ pub struct CTeleportEntitiy<'a> {
|
|||||||
on_ground: bool,
|
on_ground: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> CTeleportEntitiy<'a> {
|
impl<'a> CTeleportEntity<'a> {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
entity_id: VarInt,
|
entity_id: VarInt,
|
||||||
position: Vector3<f64>,
|
position: Vector3<f64>,
|
||||||
@ -36,7 +36,7 @@ impl<'a> CTeleportEntitiy<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ClientPacket for CTeleportEntitiy<'_> {
|
impl ClientPacket for CTeleportEntity<'_> {
|
||||||
fn write(&self, bytebuf: &mut crate::bytebuf::ByteBuffer) {
|
fn write(&self, bytebuf: &mut crate::bytebuf::ByteBuffer) {
|
||||||
bytebuf.put_var_int(&self.entity_id);
|
bytebuf.put_var_int(&self.entity_id);
|
||||||
bytebuf.put_f64(self.position.x);
|
bytebuf.put_f64(self.position.x);
|
||||||
|
|||||||
@ -22,7 +22,7 @@ pub const CURRENT_MC_PROTOCOL: u32 = 769;
|
|||||||
|
|
||||||
pub const MAX_PACKET_SIZE: i32 = 2097152;
|
pub const MAX_PACKET_SIZE: i32 = 2097152;
|
||||||
|
|
||||||
/// usally uses a namespace like "minecraft:thing"
|
/// usually uses a namespace like "minecraft:thing"
|
||||||
pub type Identifier = String;
|
pub type Identifier = String;
|
||||||
pub type VarIntType = i32;
|
pub type VarIntType = i32;
|
||||||
pub type VarLongType = i64;
|
pub type VarLongType = i64;
|
||||||
|
|||||||
@ -9,7 +9,7 @@ type Cipher = cfb8::Decryptor<aes::Aes128>;
|
|||||||
|
|
||||||
// Decoder: Client -> Server
|
// Decoder: Client -> Server
|
||||||
// Supports ZLib decoding/decompression
|
// Supports ZLib decoding/decompression
|
||||||
// Supports Aes128 Encyption
|
// Supports Aes128 Encryption
|
||||||
pub struct PacketDecoder {
|
pub struct PacketDecoder {
|
||||||
buf: BytesMut,
|
buf: BytesMut,
|
||||||
decompress_buf: BytesMut,
|
decompress_buf: BytesMut,
|
||||||
@ -135,7 +135,7 @@ impl PacketDecoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets ZLib Deompression
|
/// Sets ZLib Decompression
|
||||||
pub fn set_compression(&mut self, compression: bool) {
|
pub fn set_compression(&mut self, compression: bool) {
|
||||||
self.compression = compression;
|
self.compression = compression;
|
||||||
}
|
}
|
||||||
@ -183,10 +183,6 @@ impl PacketDecoder {
|
|||||||
pub enum PacketDecodeError {
|
pub enum PacketDecodeError {
|
||||||
#[error("failed to decode packet ID")]
|
#[error("failed to decode packet ID")]
|
||||||
DecodeID,
|
DecodeID,
|
||||||
#[error("failed to write into decoder: {0}")]
|
|
||||||
FailedWrite(String),
|
|
||||||
#[error("failed to flush decoder")]
|
|
||||||
FailedFinish,
|
|
||||||
#[error("packet exceeds maximum length")]
|
#[error("packet exceeds maximum length")]
|
||||||
TooLong,
|
TooLong,
|
||||||
#[error("packet length is out of bounds")]
|
#[error("packet length is out of bounds")]
|
||||||
|
|||||||
@ -11,7 +11,7 @@ type Cipher = cfb8::Encryptor<aes::Aes128>;
|
|||||||
|
|
||||||
// Encoder: Server -> Client
|
// Encoder: Server -> Client
|
||||||
// Supports ZLib endecoding/compression
|
// Supports ZLib endecoding/compression
|
||||||
// Supports Aes128 Encyption
|
// Supports Aes128 Encryption
|
||||||
pub struct PacketEncoder {
|
pub struct PacketEncoder {
|
||||||
buf: BytesMut,
|
buf: BytesMut,
|
||||||
compress_buf: Vec<u8>,
|
compress_buf: Vec<u8>,
|
||||||
@ -65,7 +65,7 @@ impl PacketEncoder {
|
|||||||
let compressed_size = self
|
let compressed_size = self
|
||||||
.compressor
|
.compressor
|
||||||
.zlib_compress(data_to_compress, &mut self.compress_buf)
|
.zlib_compress(data_to_compress, &mut self.compress_buf)
|
||||||
.map_err(|_| PacketEncodeError::CompressionFailed)?;
|
.map_err(|e| PacketEncodeError::CompressionFailed(e.to_string()))?;
|
||||||
|
|
||||||
// Resize compress_buf to actual compressed size
|
// Resize compress_buf to actual compressed size
|
||||||
self.compress_buf.resize(compressed_size, 0);
|
self.compress_buf.resize(compressed_size, 0);
|
||||||
@ -169,21 +169,10 @@ impl PacketEncoder {
|
|||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum PacketEncodeError {
|
pub enum PacketEncodeError {
|
||||||
#[error("failed to encode packet data")]
|
|
||||||
EncodeData,
|
|
||||||
#[error("failed to write encoded packet")]
|
|
||||||
EncodeFailedWrite,
|
|
||||||
#[error("packet exceeds maximum length")]
|
#[error("packet exceeds maximum length")]
|
||||||
TooLong,
|
TooLong,
|
||||||
#[error("compression failed")]
|
#[error("compression failed {0}")]
|
||||||
CompressionFailed,
|
CompressionFailed(String),
|
||||||
}
|
|
||||||
|
|
||||||
impl PacketEncodeError {
|
|
||||||
pub fn kickable(&self) -> bool {
|
|
||||||
// We no longer have a connection, so dont try to kick the player, just close
|
|
||||||
!matches!(self, Self::EncodeData | Self::EncodeFailedWrite)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@ -24,7 +24,7 @@ impl RawQueryPacket {
|
|||||||
|
|
||||||
match reader.read_u16().await.map_err(|_| ())? {
|
match reader.read_u16().await.map_err(|_| ())? {
|
||||||
// Magic should always equal 65277
|
// Magic should always equal 65277
|
||||||
// Since it denotes the protocl being used
|
// Since it denotes the protocol being used
|
||||||
// Should not attempt to decode packets with other magic values
|
// Should not attempt to decode packets with other magic values
|
||||||
65277 => Ok(Self {
|
65277 => Ok(Self {
|
||||||
packet_type: PacketType::from_u8(reader.read_u8().await.map_err(|_| ())?)
|
packet_type: PacketType::from_u8(reader.read_u8().await.map_err(|_| ())?)
|
||||||
@ -52,7 +52,7 @@ impl SHandshake {
|
|||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Debug)]
|
||||||
pub struct SStatusRequest {
|
pub struct SStatusRequest {
|
||||||
pub session_id: i32,
|
pub session_id: i32,
|
||||||
pub challange_token: i32,
|
pub challenge_token: i32,
|
||||||
// Full status request and basic status request are pretty much similar
|
// Full status request and basic status request are pretty much similar
|
||||||
// So might as just use the same struct
|
// So might as just use the same struct
|
||||||
pub is_full_request: bool,
|
pub is_full_request: bool,
|
||||||
@ -62,7 +62,7 @@ impl SStatusRequest {
|
|||||||
pub async fn decode(packet: &mut RawQueryPacket) -> Result<Self, ()> {
|
pub async fn decode(packet: &mut RawQueryPacket) -> Result<Self, ()> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
session_id: packet.reader.read_i32().await.map_err(|_| ())?,
|
session_id: packet.reader.read_i32().await.map_err(|_| ())?,
|
||||||
challange_token: packet.reader.read_i32().await.map_err(|_| ())?,
|
challenge_token: packet.reader.read_i32().await.map_err(|_| ())?,
|
||||||
is_full_request: {
|
is_full_request: {
|
||||||
let mut buf = [0; 4];
|
let mut buf = [0; 4];
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ impl SStatusRequest {
|
|||||||
Ok(0) => false,
|
Ok(0) => false,
|
||||||
Ok(4) => true,
|
Ok(4) => true,
|
||||||
_ => {
|
_ => {
|
||||||
// Just ingnore malformed packets or errors
|
// Just ignore malformed packets or errors
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ pub struct CHandshake {
|
|||||||
// For simplicity use a number type
|
// For simplicity use a number type
|
||||||
// Should be encoded as string here
|
// Should be encoded as string here
|
||||||
// Will be converted in encoding
|
// Will be converted in encoding
|
||||||
pub challange_token: i32,
|
pub challenge_token: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CHandshake {
|
impl CHandshake {
|
||||||
@ -99,10 +99,10 @@ impl CHandshake {
|
|||||||
buf.write_u8(9).await.unwrap();
|
buf.write_u8(9).await.unwrap();
|
||||||
// Session ID
|
// Session ID
|
||||||
buf.write_i32(self.session_id).await.unwrap();
|
buf.write_i32(self.session_id).await.unwrap();
|
||||||
// Challange token
|
// Challenge token
|
||||||
// Use CString to add null terminator and ensure no null bytes in the middle of data
|
// Use CString to add null terminator and ensure no null bytes in the middle of data
|
||||||
// Unwrap here since there should be no errors with nulls in the middle of data
|
// Unwrap here since there should be no errors with nulls in the middle of data
|
||||||
let token = CString::new(self.challange_token.to_string()).unwrap();
|
let token = CString::new(self.challenge_token.to_string()).unwrap();
|
||||||
buf.extend_from_slice(token.as_bytes_with_nul());
|
buf.extend_from_slice(token.as_bytes_with_nul());
|
||||||
|
|
||||||
buf
|
buf
|
||||||
@ -249,7 +249,7 @@ async fn test_handshake_response() {
|
|||||||
|
|
||||||
let packet = CHandshake {
|
let packet = CHandshake {
|
||||||
session_id: 1,
|
session_id: 1,
|
||||||
challange_token: 9513307,
|
challenge_token: 9513307,
|
||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(bytes, packet.encode().await)
|
assert_eq!(bytes, packet.encode().await)
|
||||||
@ -265,7 +265,7 @@ async fn test_basic_stat_request() {
|
|||||||
|
|
||||||
let actual_packet = SStatusRequest {
|
let actual_packet = SStatusRequest {
|
||||||
session_id: 1,
|
session_id: 1,
|
||||||
challange_token: 9513307,
|
challenge_token: 9513307,
|
||||||
is_full_request: false,
|
is_full_request: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -304,7 +304,7 @@ async fn test_full_stat_request() {
|
|||||||
|
|
||||||
let actual_packet = SStatusRequest {
|
let actual_packet = SStatusRequest {
|
||||||
session_id: 1,
|
session_id: 1,
|
||||||
challange_token: 9513307,
|
challenge_token: 9513307,
|
||||||
is_full_request: true,
|
is_full_request: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -146,11 +146,10 @@ impl Registry {
|
|||||||
.wolf_variant
|
.wolf_variant
|
||||||
.iter()
|
.iter()
|
||||||
.map(|s| {
|
.map(|s| {
|
||||||
// I present to you, A ugly hack which is done because Mojang developers decited to put is_<biome> instead of just <biome> on 3 wolf varients while all others have just the biome, this causes the client to not find the biome and disconnect
|
let variant = s.1.clone();
|
||||||
let varient = s.1.clone();
|
|
||||||
RegistryEntry {
|
RegistryEntry {
|
||||||
entry_id: s.0,
|
entry_id: s.0,
|
||||||
data: pumpkin_nbt::serializer::to_bytes_unnamed(&varient).unwrap(),
|
data: pumpkin_nbt::serializer::to_bytes_unnamed(&variant).unwrap(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|||||||
@ -273,22 +273,22 @@ impl ChunkData {
|
|||||||
Some(d) => d,
|
Some(d) => d,
|
||||||
};
|
};
|
||||||
|
|
||||||
// How many bits each block has in one of the pallete u64s
|
// How many bits each block has in one of the palette u64s
|
||||||
let block_bit_size = {
|
let block_bit_size = {
|
||||||
let size = 64 - (palette.len() as i64 - 1).leading_zeros();
|
let size = 64 - (palette.len() as i64 - 1).leading_zeros();
|
||||||
max(4, size)
|
max(4, size)
|
||||||
};
|
};
|
||||||
// How many blocks there are in one of the palletes u64s
|
// How many blocks there are in one of the palettes u64s
|
||||||
let blocks_in_pallete = 64 / block_bit_size;
|
let blocks_in_palette = 64 / block_bit_size;
|
||||||
|
|
||||||
let mask = (1 << block_bit_size) - 1;
|
let mask = (1 << block_bit_size) - 1;
|
||||||
'block_loop: for block in block_data.iter() {
|
'block_loop: for block in block_data.iter() {
|
||||||
for i in 0..blocks_in_pallete {
|
for i in 0..blocks_in_palette {
|
||||||
let index = (block >> (i * block_bit_size)) & mask;
|
let index = (block >> (i * block_bit_size)) & mask;
|
||||||
let block = &palette[index as usize];
|
let block = &palette[index as usize];
|
||||||
|
|
||||||
// TODO allow indexing blocks directly so we can just use block_index and save some time?
|
// TODO allow indexing blocks directly so we can just use block_index and save some time?
|
||||||
// this is fine because we initalized the heightmap of `blocks`
|
// this is fine because we initialized the heightmap of `blocks`
|
||||||
// from the cached value in the world file
|
// from the cached value in the world file
|
||||||
blocks.set_block_no_heightmap_update(
|
blocks.set_block_no_heightmap_update(
|
||||||
ChunkRelativeBlockCoordinates {
|
ChunkRelativeBlockCoordinates {
|
||||||
@ -301,7 +301,7 @@ impl ChunkData {
|
|||||||
|
|
||||||
block_index += 1;
|
block_index += 1;
|
||||||
|
|
||||||
// if `SUBCHUNK_VOLUME `is not divisible by `blocks_in_pallete` the block_data
|
// if `SUBCHUNK_VOLUME `is not divisible by `blocks_in_palette` the block_data
|
||||||
// can sometimes spill into other subchunks. We avoid that by aborting early
|
// can sometimes spill into other subchunks. We avoid that by aborting early
|
||||||
if (block_index % SUBCHUNK_VOLUME) == 0 {
|
if (block_index % SUBCHUNK_VOLUME) == 0 {
|
||||||
break 'block_loop;
|
break 'block_loop;
|
||||||
|
|||||||
@ -271,7 +271,7 @@ impl BaseRouter {
|
|||||||
.clone()
|
.clone()
|
||||||
.min(ConstantFunction::new(5f64).mul(CAVES_ENTRANCES_OVERWORLD.clone()));
|
.min(ConstantFunction::new(5f64).mul(CAVES_ENTRANCES_OVERWORLD.clone()));
|
||||||
|
|
||||||
let mapped_cave_entraces_overworld = RangeFunction::<
|
let mapped_cave_entrances_overworld = RangeFunction::<
|
||||||
NoEnvironment,
|
NoEnvironment,
|
||||||
SharedComponentReference,
|
SharedComponentReference,
|
||||||
SharedComponentReference,
|
SharedComponentReference,
|
||||||
@ -286,7 +286,7 @@ impl BaseRouter {
|
|||||||
|
|
||||||
let blended_cave_entrances_overworld = apply_blend_density(apply_surface_slides(
|
let blended_cave_entrances_overworld = apply_blend_density(apply_surface_slides(
|
||||||
amplified,
|
amplified,
|
||||||
mapped_cave_entraces_overworld.into(),
|
mapped_cave_entrances_overworld.into(),
|
||||||
))
|
))
|
||||||
.min(CAVES_NOODLE_OVERWORLD.clone());
|
.min(CAVES_NOODLE_OVERWORLD.clone());
|
||||||
|
|
||||||
|
|||||||
@ -120,7 +120,7 @@ impl ProtoChunk {
|
|||||||
let horizontal_cell_block_count = self.sampler.horizontal_cell_block_count();
|
let horizontal_cell_block_count = self.sampler.horizontal_cell_block_count();
|
||||||
let vertical_cell_block_count = self.sampler.vertical_cell_block_count();
|
let vertical_cell_block_count = self.sampler.vertical_cell_block_count();
|
||||||
|
|
||||||
let horizonal_cells = CHUNK_DIM / horizontal_cell_block_count;
|
let horizontal_cells = CHUNK_DIM / horizontal_cell_block_count;
|
||||||
|
|
||||||
let min_y = self.sampler.min_y();
|
let min_y = self.sampler.min_y();
|
||||||
let minimum_cell_y = min_y / vertical_cell_block_count as i8;
|
let minimum_cell_y = min_y / vertical_cell_block_count as i8;
|
||||||
@ -133,10 +133,10 @@ impl ProtoChunk {
|
|||||||
// - All unsafe functions are encapsulated and no mutable references are leaked
|
// - All unsafe functions are encapsulated and no mutable references are leaked
|
||||||
unsafe {
|
unsafe {
|
||||||
self.sampler.sample_start_density();
|
self.sampler.sample_start_density();
|
||||||
for cell_x in 0..horizonal_cells {
|
for cell_x in 0..horizontal_cells {
|
||||||
self.sampler.sample_end_density(cell_x);
|
self.sampler.sample_end_density(cell_x);
|
||||||
|
|
||||||
for cell_z in 0..horizonal_cells {
|
for cell_z in 0..horizontal_cells {
|
||||||
for cell_y in (0..cell_height).rev() {
|
for cell_y in (0..cell_height).rev() {
|
||||||
self.sampler.on_sampled_cell_corners(cell_y, cell_z);
|
self.sampler.on_sampled_cell_corners(cell_y, cell_z);
|
||||||
for local_y in (0..vertical_cell_block_count).rev() {
|
for local_y in (0..vertical_cell_block_count).rev() {
|
||||||
|
|||||||
@ -314,15 +314,9 @@ impl Player {
|
|||||||
let find_condition = |(slot_number, slot): (usize, &mut Option<ItemStack>)| {
|
let find_condition = |(slot_number, slot): (usize, &mut Option<ItemStack>)| {
|
||||||
// TODO: Check for max item count here
|
// TODO: Check for max item count here
|
||||||
match slot {
|
match slot {
|
||||||
Some(item) => {
|
Some(item) => (item.item_id == item_in_pressed_slot.item_id
|
||||||
if item.item_id == item_in_pressed_slot.item_id
|
&& item.item_count != 64)
|
||||||
&& item.item_count != 64
|
.then_some(slot_number),
|
||||||
{
|
|
||||||
Some(slot_number)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => Some(slot_number),
|
None => Some(slot_number),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -496,11 +490,7 @@ impl Player {
|
|||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
let entity_id = player.entity_id();
|
let entity_id = player.entity_id();
|
||||||
if player_ids.contains(&entity_id) {
|
player_ids.contains(&entity_id).then(|| player.clone())
|
||||||
Some(player.clone())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect_vec();
|
.collect_vec();
|
||||||
@ -560,13 +550,11 @@ impl Player {
|
|||||||
let slots = inventory.slots_with_hotbar_first();
|
let slots = inventory.slots_with_hotbar_first();
|
||||||
|
|
||||||
let matching_slots = slots.filter_map(|slot| {
|
let matching_slots = slots.filter_map(|slot| {
|
||||||
if let Some(item_slot) = slot.as_ref() {
|
if let Some(item_slot) = slot.as_mut() {
|
||||||
if item_slot.item_id == item.id && item_slot.item_count < max_stack {
|
(item_slot.item_id == item.id && item_slot.item_count < max_stack).then(|| {
|
||||||
let item_count = item_slot.item_count;
|
let item_count = item_slot.item_count;
|
||||||
Some((slot, item_count))
|
(item_slot, item_count)
|
||||||
} else {
|
})
|
||||||
None
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@ -579,15 +567,15 @@ impl Player {
|
|||||||
let amount_to_add = max_stack - item_count;
|
let amount_to_add = max_stack - item_count;
|
||||||
if let Some(amount_left) = amount.checked_sub(u32::from(amount_to_add)) {
|
if let Some(amount_left) = amount.checked_sub(u32::from(amount_to_add)) {
|
||||||
amount = amount_left;
|
amount = amount_left;
|
||||||
*slot = Some(ItemStack {
|
*slot = ItemStack {
|
||||||
item_id: item.id,
|
item_id: item.id,
|
||||||
item_count: item.components.max_stack_size,
|
item_count: item.components.max_stack_size,
|
||||||
});
|
};
|
||||||
} else {
|
} else {
|
||||||
*slot = Some(ItemStack {
|
*slot = ItemStack {
|
||||||
item_id: item.id,
|
item_id: item.id,
|
||||||
item_count: max_stack - (amount_to_add - amount as u8),
|
item_count: max_stack - (amount_to_add - amount as u8),
|
||||||
});
|
};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -222,9 +222,7 @@ impl Client {
|
|||||||
|
|
||||||
let mut enc = self.enc.lock().await;
|
let mut enc = self.enc.lock().await;
|
||||||
if let Err(error) = enc.append_packet(packet) {
|
if let Err(error) = enc.append_packet(packet) {
|
||||||
if error.kickable() {
|
|
||||||
self.kick(&error.to_string()).await;
|
self.kick(&error.to_string()).await;
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,7 +443,6 @@ impl Client {
|
|||||||
"Failed to handle client packet id {} in Login State",
|
"Failed to handle client packet id {} in Login State",
|
||||||
packet.id.0
|
packet.id.0
|
||||||
);
|
);
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@ -722,7 +722,7 @@ impl Player {
|
|||||||
|
|
||||||
let block_bounding_box = BoundingBox::from_block(&world_pos);
|
let block_bounding_box = BoundingBox::from_block(&world_pos);
|
||||||
let bounding_box = entity.bounding_box.load();
|
let bounding_box = entity.bounding_box.load();
|
||||||
//TODO: Make this check for every entity in that posistion
|
//TODO: Make this check for every entity in that position
|
||||||
if !bounding_box.intersects(&block_bounding_box) {
|
if !bounding_box.intersects(&block_bounding_box) {
|
||||||
world
|
world
|
||||||
.set_block_state(world_pos, block.default_state_id)
|
.set_block_state(world_pos, block.default_state_id)
|
||||||
|
|||||||
@ -14,7 +14,7 @@ use crate::server::Server;
|
|||||||
use super::super::args::ArgumentConsumer;
|
use super::super::args::ArgumentConsumer;
|
||||||
use super::{Arg, DefaultNameArgConsumer, FindArg, GetClientSideArgParser};
|
use super::{Arg, DefaultNameArgConsumer, FindArg, GetClientSideArgParser};
|
||||||
|
|
||||||
/// todo: implement for entitites that aren't players
|
/// todo: implement for entities that aren't players
|
||||||
///
|
///
|
||||||
/// For selecting a single entity, eg. using @s, a player name or entity uuid.
|
/// For selecting a single entity, eg. using @s, a player name or entity uuid.
|
||||||
///
|
///
|
||||||
|
|||||||
@ -39,7 +39,7 @@ impl ArgumentConsumer for Position2DArgumentConsumer {
|
|||||||
) -> Option<Arg<'a>> {
|
) -> Option<Arg<'a>> {
|
||||||
let pos = MaybeRelativePosition2D::try_new(args.pop()?, args.pop()?)?;
|
let pos = MaybeRelativePosition2D::try_new(args.pop()?, args.pop()?)?;
|
||||||
|
|
||||||
let vec2 = pos.try_to_abolute(src.position())?;
|
let vec2 = pos.try_to_absolute(src.position())?;
|
||||||
|
|
||||||
Some(Arg::Pos2D(vec2))
|
Some(Arg::Pos2D(vec2))
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ impl MaybeRelativePosition2D {
|
|||||||
Some(Self(x.try_into().ok()?, z.try_into().ok()?))
|
Some(Self(x.try_into().ok()?, z.try_into().ok()?))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn try_to_abolute(self, origin: Option<Vector3<f64>>) -> Option<Vector2<f64>> {
|
fn try_to_absolute(self, origin: Option<Vector3<f64>>) -> Option<Vector2<f64>> {
|
||||||
Some(Vector2::new(
|
Some(Vector2::new(
|
||||||
self.0.into_absolute(origin.map(|o| o.x))?,
|
self.0.into_absolute(origin.map(|o| o.x))?,
|
||||||
self.1.into_absolute(origin.map(|o| o.z))?,
|
self.1.into_absolute(origin.map(|o| o.z))?,
|
||||||
|
|||||||
@ -32,7 +32,7 @@ pub(crate) mod arg_message;
|
|||||||
pub(crate) mod arg_players;
|
pub(crate) mod arg_players;
|
||||||
pub(crate) mod arg_position_2d;
|
pub(crate) mod arg_position_2d;
|
||||||
pub(crate) mod arg_position_3d;
|
pub(crate) mod arg_position_3d;
|
||||||
pub(crate) mod arg_postition_block;
|
pub(crate) mod arg_position_block;
|
||||||
pub(crate) mod arg_resource_location;
|
pub(crate) mod arg_resource_location;
|
||||||
pub(crate) mod arg_rotation;
|
pub(crate) mod arg_rotation;
|
||||||
pub(crate) mod arg_simple;
|
pub(crate) mod arg_simple;
|
||||||
@ -50,7 +50,7 @@ pub(crate) trait ArgumentConsumer: Sync + GetClientSideArgParser {
|
|||||||
|
|
||||||
/// Used for tab completion (but only if argument suggestion type is "minecraft:ask_server"!).
|
/// Used for tab completion (but only if argument suggestion type is "minecraft:ask_server"!).
|
||||||
///
|
///
|
||||||
/// NOTE: This is called after this consumer's [`ArgumentConsumer::consume`] method returnd None, so if args is used here, make sure [`ArgumentConsumer::consume`] never returns None after mutating args.
|
/// NOTE: This is called after this consumer's [`ArgumentConsumer::consume`] method returned None, so if args is used here, make sure [`ArgumentConsumer::consume`] never returns None after mutating args.
|
||||||
async fn suggest<'a>(
|
async fn suggest<'a>(
|
||||||
&self,
|
&self,
|
||||||
sender: &CommandSender<'a>,
|
sender: &CommandSender<'a>,
|
||||||
|
|||||||
@ -463,7 +463,7 @@ impl CommandExecutor for BossbarSetExecuter {
|
|||||||
.bossbars
|
.bossbars
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
.update_visibilty(server, namespace.to_string(), visibility)
|
.update_visibility(server, namespace.to_string(), visibility)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(()) => {}
|
Ok(()) => {}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::command::args::arg_block::BlockArgumentConsumer;
|
use crate::command::args::arg_block::BlockArgumentConsumer;
|
||||||
use crate::command::args::arg_postition_block::BlockPosArgumentConsumer;
|
use crate::command::args::arg_position_block::BlockPosArgumentConsumer;
|
||||||
use crate::command::args::{ConsumedArgs, FindArg};
|
use crate::command::args::{ConsumedArgs, FindArg};
|
||||||
use crate::command::tree::CommandTree;
|
use crate::command::tree::CommandTree;
|
||||||
use crate::command::tree_builder::{argument, literal, require};
|
use crate::command::tree_builder::{argument, literal, require};
|
||||||
|
|||||||
@ -3,7 +3,7 @@ use pumpkin_core::text::color::NamedColor;
|
|||||||
use pumpkin_core::text::TextComponent;
|
use pumpkin_core::text::TextComponent;
|
||||||
|
|
||||||
use crate::command::args::arg_block::BlockArgumentConsumer;
|
use crate::command::args::arg_block::BlockArgumentConsumer;
|
||||||
use crate::command::args::arg_postition_block::BlockPosArgumentConsumer;
|
use crate::command::args::arg_position_block::BlockPosArgumentConsumer;
|
||||||
use crate::command::args::{ConsumedArgs, FindArg};
|
use crate::command::args::{ConsumedArgs, FindArg};
|
||||||
use crate::command::tree::CommandTree;
|
use crate::command::tree::CommandTree;
|
||||||
use crate::command::tree_builder::{argument, literal, require};
|
use crate::command::tree_builder::{argument, literal, require};
|
||||||
|
|||||||
@ -70,7 +70,7 @@ impl<'a> CommandDispatcher<'a> {
|
|||||||
}
|
}
|
||||||
Err(pumpkin_error) => {
|
Err(pumpkin_error) => {
|
||||||
pumpkin_error.log();
|
pumpkin_error.log();
|
||||||
sender.send_message(TextComponent::text("Unknown internal error occured while running command. Please see server log").color(Color::Named(NamedColor::Red))).await;
|
sender.send_message(TextComponent::text("Unknown internal error occurred while running command. Please see server log").color(Color::Named(NamedColor::Red))).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ use pumpkin_core::math::{
|
|||||||
};
|
};
|
||||||
use pumpkin_entity::{entity_type::EntityType, pose::EntityPose, EntityId};
|
use pumpkin_entity::{entity_type::EntityType, pose::EntityPose, EntityId};
|
||||||
use pumpkin_protocol::{
|
use pumpkin_protocol::{
|
||||||
client::play::{CSetEntityMetadata, CTeleportEntitiy, Metadata},
|
client::play::{CSetEntityMetadata, CTeleportEntity, Metadata},
|
||||||
VarInt,
|
VarInt,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ impl Entity {
|
|||||||
|
|
||||||
pub async fn teleport(&self, position: Vector3<f64>, yaw: f32, pitch: f32) {
|
pub async fn teleport(&self, position: Vector3<f64>, yaw: f32, pitch: f32) {
|
||||||
self.world
|
self.world
|
||||||
.broadcast_packet_all(&CTeleportEntitiy::new(
|
.broadcast_packet_all(&CTeleportEntity::new(
|
||||||
self.entity_id.into(),
|
self.entity_id.into(),
|
||||||
position,
|
position,
|
||||||
Vector3::new(0.0, 0.0, 0.0),
|
Vector3::new(0.0, 0.0, 0.0),
|
||||||
|
|||||||
@ -86,7 +86,7 @@ pub struct Player {
|
|||||||
/// The item currently being held by the player.
|
/// The item currently being held by the player.
|
||||||
pub carried_item: AtomicCell<Option<ItemStack>>,
|
pub carried_item: AtomicCell<Option<ItemStack>>,
|
||||||
|
|
||||||
/// send `send_abilties_update` when changed
|
/// send `send_abilities_update` when changed
|
||||||
/// The player's abilities and special powers.
|
/// The player's abilities and special powers.
|
||||||
///
|
///
|
||||||
/// This field represents the various abilities that the player possesses, such as flight, invulnerability, and other special effects.
|
/// This field represents the various abilities that the player possesses, such as flight, invulnerability, and other special effects.
|
||||||
@ -390,7 +390,7 @@ impl Player {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Updates the current abilities the Player has
|
/// Updates the current abilities the Player has
|
||||||
pub async fn send_abilties_update(&self) {
|
pub async fn send_abilities_update(&self) {
|
||||||
let mut b = 0i8;
|
let mut b = 0i8;
|
||||||
let abilities = &self.abilities.lock().await;
|
let abilities = &self.abilities.lock().await;
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#![deny(clippy::pedantic)]
|
#![deny(clippy::pedantic)]
|
||||||
// #![warn(clippy::restriction)]
|
// #![warn(clippy::restriction)]
|
||||||
#![deny(clippy::cargo)]
|
#![deny(clippy::cargo)]
|
||||||
|
#![deny(clippy::if_then_some_else_none)]
|
||||||
// REMOVE SOME WHEN RELEASE
|
// REMOVE SOME WHEN RELEASE
|
||||||
#![expect(clippy::cargo_common_metadata)]
|
#![expect(clippy::cargo_common_metadata)]
|
||||||
#![expect(clippy::multiple_crate_versions)]
|
#![expect(clippy::multiple_crate_versions)]
|
||||||
|
|||||||
@ -34,7 +34,7 @@ pub enum VelocityError {
|
|||||||
#[error("Failed to read address")]
|
#[error("Failed to read address")]
|
||||||
FailedReadAddress,
|
FailedReadAddress,
|
||||||
#[error("Failed to parse address")]
|
#[error("Failed to parse address")]
|
||||||
FailedParseAddres,
|
FailedParseAddress,
|
||||||
#[error("Failed to read game profile name")]
|
#[error("Failed to read game profile name")]
|
||||||
FailedReadProfileName,
|
FailedReadProfileName,
|
||||||
#[error("Failed to read game profile UUID")]
|
#[error("Failed to read game profile UUID")]
|
||||||
@ -129,7 +129,7 @@ pub fn receive_velocity_plugin_response(
|
|||||||
|
|
||||||
let socket_addr: SocketAddr = SocketAddr::new(
|
let socket_addr: SocketAddr = SocketAddr::new(
|
||||||
addr.parse::<IpAddr>()
|
addr.parse::<IpAddr>()
|
||||||
.map_err(|_| VelocityError::FailedParseAddres)?,
|
.map_err(|_| VelocityError::FailedParseAddress)?,
|
||||||
port,
|
port,
|
||||||
);
|
);
|
||||||
let profile = read_game_profile(&mut buf)?;
|
let profile = read_game_profile(&mut buf)?;
|
||||||
|
|||||||
@ -27,16 +27,16 @@ pub async fn start_query_handler(server: Arc<Server>, bound_addr: SocketAddr) {
|
|||||||
.expect("Unable to bind to address"),
|
.expect("Unable to bind to address"),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Challange tokens are bound to the IP address and port
|
// Challenge tokens are bound to the IP address and port
|
||||||
let valid_challange_tokens = Arc::new(RwLock::new(HashMap::new()));
|
let valid_challenge_tokens = Arc::new(RwLock::new(HashMap::new()));
|
||||||
let valid_challange_tokens_clone = valid_challange_tokens.clone();
|
let valid_challenge_tokens_clone = valid_challenge_tokens.clone();
|
||||||
// All challange tokens ever created are expired every 30 seconds
|
// All challenge tokens ever created are expired every 30 seconds
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut interval = time::interval(Duration::from_secs(30));
|
let mut interval = time::interval(Duration::from_secs(30));
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
interval.tick().await;
|
interval.tick().await;
|
||||||
valid_challange_tokens_clone.write().await.clear();
|
valid_challenge_tokens_clone.write().await.clear();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ pub async fn start_query_handler(server: Arc<Server>, bound_addr: SocketAddr) {
|
|||||||
|
|
||||||
loop {
|
loop {
|
||||||
let socket = socket.clone();
|
let socket = socket.clone();
|
||||||
let valid_challange_tokens = valid_challange_tokens.clone();
|
let valid_challenge_tokens = valid_challenge_tokens.clone();
|
||||||
let server = server.clone();
|
let server = server.clone();
|
||||||
let mut buf = vec![0; 1024];
|
let mut buf = vec![0; 1024];
|
||||||
let (_, addr) = socket.recv_from(&mut buf).await.unwrap();
|
let (_, addr) = socket.recv_from(&mut buf).await.unwrap();
|
||||||
@ -57,7 +57,7 @@ pub async fn start_query_handler(server: Arc<Server>, bound_addr: SocketAddr) {
|
|||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
if let Err(err) = handle_packet(
|
if let Err(err) = handle_packet(
|
||||||
buf,
|
buf,
|
||||||
valid_challange_tokens,
|
valid_challenge_tokens,
|
||||||
server,
|
server,
|
||||||
socket,
|
socket,
|
||||||
addr,
|
addr,
|
||||||
@ -87,10 +87,10 @@ async fn handle_packet(
|
|||||||
match raw_packet.packet_type {
|
match raw_packet.packet_type {
|
||||||
PacketType::Handshake => {
|
PacketType::Handshake => {
|
||||||
if let Ok(packet) = SHandshake::decode(&mut raw_packet).await {
|
if let Ok(packet) = SHandshake::decode(&mut raw_packet).await {
|
||||||
let challange_token = rand::thread_rng().gen_range(1..=i32::MAX);
|
let challenge_token = rand::thread_rng().gen_range(1..=i32::MAX);
|
||||||
let response = CHandshake {
|
let response = CHandshake {
|
||||||
session_id: packet.session_id,
|
session_id: packet.session_id,
|
||||||
challange_token,
|
challenge_token,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ignore all errors since we don't want the query handler to crash
|
// Ignore all errors since we don't want the query handler to crash
|
||||||
@ -99,7 +99,7 @@ async fn handle_packet(
|
|||||||
.send_to(response.encode().await.as_slice(), addr)
|
.send_to(response.encode().await.as_slice(), addr)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
clients.write().await.insert(challange_token, addr);
|
clients.write().await.insert(challenge_token, addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PacketType::Status => {
|
PacketType::Status => {
|
||||||
@ -107,7 +107,7 @@ async fn handle_packet(
|
|||||||
if clients
|
if clients
|
||||||
.read()
|
.read()
|
||||||
.await
|
.await
|
||||||
.get(&packet.challange_token)
|
.get(&packet.challenge_token)
|
||||||
.is_some_and(|token_bound_ip: &SocketAddr| token_bound_ip == &addr)
|
.is_some_and(|token_bound_ip: &SocketAddr| token_bound_ip == &addr)
|
||||||
{
|
{
|
||||||
if packet.is_full_request {
|
if packet.is_full_request {
|
||||||
@ -150,7 +150,7 @@ async fn handle_packet(
|
|||||||
.send_to(response.encode().await.as_slice(), addr)
|
.send_to(response.encode().await.as_slice(), addr)
|
||||||
.await;
|
.await;
|
||||||
} else {
|
} else {
|
||||||
let resposne = CBasicStatus {
|
let response = CBasicStatus {
|
||||||
session_id: packet.session_id,
|
session_id: packet.session_id,
|
||||||
motd: CString::new(BASIC_CONFIG.motd.as_str())?,
|
motd: CString::new(BASIC_CONFIG.motd.as_str())?,
|
||||||
map: CString::new("world")?,
|
map: CString::new("world")?,
|
||||||
@ -161,7 +161,7 @@ async fn handle_packet(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let _ = socket
|
let _ = socket
|
||||||
.send_to(resposne.encode().await.as_slice(), addr)
|
.send_to(response.encode().await.as_slice(), addr)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,16 +73,12 @@ impl Server {
|
|||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
// TODO: only create when needed
|
// TODO: only create when needed
|
||||||
|
|
||||||
let auth_client = if BASIC_CONFIG.online_mode {
|
let auth_client = BASIC_CONFIG.online_mode.then(|| {
|
||||||
Some(
|
|
||||||
reqwest::Client::builder()
|
reqwest::Client::builder()
|
||||||
.timeout(Duration::from_millis(5000))
|
.timeout(Duration::from_millis(5000))
|
||||||
.build()
|
.build()
|
||||||
.expect("Failed to to make reqwest client"),
|
.expect("Failed to to make reqwest client")
|
||||||
)
|
});
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
// First register default command, after that plugins can put in their own
|
// First register default command, after that plugins can put in their own
|
||||||
let command_dispatcher = default_dispatcher();
|
let command_dispatcher = default_dispatcher();
|
||||||
|
|||||||
@ -189,7 +189,7 @@ impl CustomBossbars {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn update_visibilty(
|
pub async fn update_visibility(
|
||||||
&mut self,
|
&mut self,
|
||||||
server: &Server,
|
server: &Server,
|
||||||
resource_location: String,
|
resource_location: String,
|
||||||
@ -365,7 +365,7 @@ impl CustomBossbars {
|
|||||||
) -> Result<(), BossbarUpdateError> {
|
) -> Result<(), BossbarUpdateError> {
|
||||||
let bossbar = self.custom_bossbars.get_mut(&resource_location);
|
let bossbar = self.custom_bossbars.get_mut(&resource_location);
|
||||||
if let Some(bossbar) = bossbar {
|
if let Some(bossbar) = bossbar {
|
||||||
// Get differnce between old and new player list and remove bossbars from old players
|
// Get difference between old and new player list and remove bossbars from old players
|
||||||
let removed_players: Vec<Uuid> = bossbar
|
let removed_players: Vec<Uuid> = bossbar
|
||||||
.player
|
.player
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
@ -150,16 +150,16 @@ impl World {
|
|||||||
&self,
|
&self,
|
||||||
sound_id: u16,
|
sound_id: u16,
|
||||||
category: SoundCategory,
|
category: SoundCategory,
|
||||||
posistion: &Vector3<f64>,
|
position: &Vector3<f64>,
|
||||||
) {
|
) {
|
||||||
let seed = thread_rng().gen::<f64>();
|
let seed = thread_rng().gen::<f64>();
|
||||||
self.broadcast_packet_all(&CSoundEffect::new(
|
self.broadcast_packet_all(&CSoundEffect::new(
|
||||||
VarInt(i32::from(sound_id)),
|
VarInt(i32::from(sound_id)),
|
||||||
None,
|
None,
|
||||||
category,
|
category,
|
||||||
posistion.x,
|
position.x,
|
||||||
posistion.y,
|
position.y,
|
||||||
posistion.z,
|
position.z,
|
||||||
1.0,
|
1.0,
|
||||||
1.0,
|
1.0,
|
||||||
seed,
|
seed,
|
||||||
@ -442,7 +442,7 @@ impl World {
|
|||||||
.await;
|
.await;
|
||||||
|
|
||||||
log::debug!("Sending player abilities to {}", player.gameprofile.name);
|
log::debug!("Sending player abilities to {}", player.gameprofile.name);
|
||||||
player.send_abilties_update().await;
|
player.send_abilities_update().await;
|
||||||
|
|
||||||
player.send_permission_lvl_update().await;
|
player.send_permission_lvl_update().await;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user