66 lines
2.1 KiB
Rust
66 lines
2.1 KiB
Rust
use pumpkin_data::packet::clientbound::PLAY_RESPAWN;
|
|
use pumpkin_macros::java_packet;
|
|
use pumpkin_util::version::JavaMinecraftVersion;
|
|
|
|
use crate::{
|
|
ClientPacket,
|
|
java::client::play::player_spawn_data::PlayerSpawnData,
|
|
ser::{NetworkWriteExt, WritingError},
|
|
};
|
|
|
|
#[java_packet(PLAY_RESPAWN)]
|
|
pub struct CRespawn {
|
|
pub player_spawn_info: PlayerSpawnData,
|
|
pub data_kept: u8,
|
|
}
|
|
|
|
impl CRespawn {
|
|
pub const KEEP_ATTRIBUTE_MODIFIERS: u8 = 1;
|
|
pub const KEEP_ENTITY_DATA: u8 = 2;
|
|
pub const KEEP_ALL_DATA: u8 = 3;
|
|
|
|
#[must_use]
|
|
pub const fn new(player_spawn_info: PlayerSpawnData, data_kept: u8) -> Self {
|
|
Self {
|
|
player_spawn_info,
|
|
data_kept,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ClientPacket for CRespawn {
|
|
fn write_packet_data(
|
|
&self,
|
|
mut write: impl std::io::Write,
|
|
version: &JavaMinecraftVersion,
|
|
) -> Result<(), WritingError> {
|
|
if version < &JavaMinecraftVersion::V_1_20_2 {
|
|
write.write_string(self.player_spawn_info.dimension.minecraft_name)?;
|
|
write.write_string(self.player_spawn_info.dimension.minecraft_name)?;
|
|
write.write_i64_be(self.player_spawn_info.hashed_seed)?;
|
|
write.write_u8(self.player_spawn_info.game_mode)?;
|
|
write.write_i8(self.player_spawn_info.previous_gamemode)?;
|
|
write.write_bool(self.player_spawn_info.debug)?;
|
|
write.write_bool(self.player_spawn_info.is_flat)?;
|
|
write.write_i8(self.data_kept as i8)?;
|
|
write.write_option(
|
|
&self.player_spawn_info.death_dimension_name,
|
|
|write, (dim, pos)| {
|
|
write.write_string(dim)?;
|
|
write.write_block_pos(pos)?;
|
|
Ok(())
|
|
},
|
|
)?;
|
|
if version >= &JavaMinecraftVersion::V_1_20 {
|
|
write.write_var_int(&self.player_spawn_info.portal_cooldown)?;
|
|
}
|
|
return Ok(());
|
|
}
|
|
|
|
self.player_spawn_info
|
|
.write_packet_data(&mut write, version)?;
|
|
write.write_i8(self.data_kept as i8)?;
|
|
Ok(())
|
|
}
|
|
}
|