minior position/rotation improvements
This commit is contained in:
parent
e96f072951
commit
770d73f080
@ -3,7 +3,7 @@ use pumpkin_macros::packet;
|
|||||||
use pumpkin_text::TextComponent;
|
use pumpkin_text::TextComponent;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::{ VarInt};
|
use crate::VarInt;
|
||||||
|
|
||||||
#[derive(Serialize, Clone)]
|
#[derive(Serialize, Clone)]
|
||||||
#[packet(0x39)]
|
#[packet(0x39)]
|
||||||
|
|||||||
@ -12,6 +12,9 @@ pub struct CRemoveEntities {
|
|||||||
|
|
||||||
impl CRemoveEntities {
|
impl CRemoveEntities {
|
||||||
pub fn new(entitiy_ids: Vec<VarInt>) -> Self {
|
pub fn new(entitiy_ids: Vec<VarInt>) -> Self {
|
||||||
Self { count: VarInt(entitiy_ids.len() as i32), entitiy_ids }
|
Self {
|
||||||
|
count: VarInt(entitiy_ids.len() as i32),
|
||||||
|
entitiy_ids,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,13 +29,13 @@ impl CSpawnEntity {
|
|||||||
x: f64,
|
x: f64,
|
||||||
y: f64,
|
y: f64,
|
||||||
z: f64,
|
z: f64,
|
||||||
pitch: u8, // angle
|
pitch: f32, // angle
|
||||||
yaw: u8, // angle
|
yaw: f32, // angle
|
||||||
head_yaw: u8, // angle
|
head_yaw: f32, // angle
|
||||||
data: VarInt,
|
data: VarInt,
|
||||||
velocity_x: i16,
|
velocity_x: f32,
|
||||||
velocity_y: i16,
|
velocity_y: f32,
|
||||||
velocity_z: i16,
|
velocity_z: f32,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
entity_id,
|
entity_id,
|
||||||
@ -44,13 +44,13 @@ impl CSpawnEntity {
|
|||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
z,
|
z,
|
||||||
pitch,
|
pitch: (pitch * 256.0 / 360.0).floor() as u8,
|
||||||
yaw,
|
yaw: (yaw * 256.0 / 360.0).floor() as u8,
|
||||||
head_yaw,
|
head_yaw: (head_yaw * 256.0 / 360.0).floor() as u8,
|
||||||
data,
|
data,
|
||||||
velocity_x,
|
velocity_x: (velocity_x.clamp(-3.9, 3.9) * 8000.0) as i16,
|
||||||
velocity_y,
|
velocity_y: (velocity_y.clamp(-3.9, 3.9) * 8000.0) as i16,
|
||||||
velocity_z,
|
velocity_z: (velocity_z.clamp(-3.9, 3.9) * 8000.0) as i16,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,8 +6,8 @@ use fastnbt::SerOpts;
|
|||||||
use hover::HoverEvent;
|
use hover::HoverEvent;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub mod color;
|
|
||||||
pub mod click;
|
pub mod click;
|
||||||
|
pub mod color;
|
||||||
pub mod hover;
|
pub mod hover;
|
||||||
|
|
||||||
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
||||||
@ -163,9 +163,9 @@ impl TextComponent {
|
|||||||
click_event: &self.click_event,
|
click_event: &self.click_event,
|
||||||
hover_event: &self.hover_event,
|
hover_event: &self.hover_event,
|
||||||
};
|
};
|
||||||
// dbg!(&serde_json::to_string(&astruct));
|
// dbg!(&serde_json::to_string(&astruct));
|
||||||
let nbt = fastnbt::to_bytes_with_opts(&astruct, SerOpts::network_nbt()).unwrap();
|
|
||||||
nbt
|
fastnbt::to_bytes_with_opts(&astruct, SerOpts::network_nbt()).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ use crate::{
|
|||||||
commands::{handle_command, CommandSender},
|
commands::{handle_command, CommandSender},
|
||||||
entity::player::Hand,
|
entity::player::Hand,
|
||||||
server::Server,
|
server::Server,
|
||||||
|
util::math::wrap_degrees,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::Client;
|
use super::Client;
|
||||||
@ -38,18 +39,27 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn clamp_horizontal(pos: f64) -> f64 {
|
||||||
|
pos.clamp(-3.0E7, 3.0E7)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clamp_vertical(pos: f64) -> f64 {
|
||||||
|
pos.clamp(-2.0E7, 2.0E7)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_position(&mut self, server: &mut Server, position: SPlayerPosition) {
|
pub fn handle_position(&mut self, server: &mut Server, position: SPlayerPosition) {
|
||||||
if position.x.is_nan() || position.feet_y.is_nan() || position.z.is_nan() {
|
if position.x.is_nan() || position.feet_y.is_nan() || position.z.is_nan() {
|
||||||
self.kick("Invalid movement");
|
self.kick("Invalid movement");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let player = self.player.as_mut().unwrap();
|
let player = self.player.as_mut().unwrap();
|
||||||
let entity = &mut player.entity;
|
let entity = &mut player.entity;
|
||||||
entity.lastx = entity.x;
|
entity.lastx = entity.x;
|
||||||
entity.lasty = entity.y;
|
entity.lasty = entity.y;
|
||||||
entity.lastz = entity.z;
|
entity.lastz = entity.z;
|
||||||
entity.x = position.x;
|
entity.x = Self::clamp_horizontal(position.x);
|
||||||
entity.y = position.feet_y;
|
entity.y = Self::clamp_vertical(position.feet_y);
|
||||||
entity.z = position.z;
|
entity.z = Self::clamp_horizontal(position.z);
|
||||||
// TODO: teleport when moving > 8 block
|
// TODO: teleport when moving > 8 block
|
||||||
|
|
||||||
// send new position to all other players
|
// send new position to all other players
|
||||||
@ -81,18 +91,20 @@ impl Client {
|
|||||||
|| position_rotation.z.is_nan()
|
|| position_rotation.z.is_nan()
|
||||||
{
|
{
|
||||||
self.kick("Invalid movement");
|
self.kick("Invalid movement");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if !position_rotation.yaw.is_finite() || !position_rotation.pitch.is_finite() {
|
if !position_rotation.yaw.is_finite() || !position_rotation.pitch.is_finite() {
|
||||||
self.kick("Invalid rotation");
|
self.kick("Invalid rotation");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let player = self.player.as_mut().unwrap();
|
let player = self.player.as_mut().unwrap();
|
||||||
let entity = &mut player.entity;
|
let entity = &mut player.entity;
|
||||||
|
|
||||||
entity.x = position_rotation.x;
|
entity.x = Self::clamp_horizontal(position_rotation.x);
|
||||||
entity.y = position_rotation.feet_y;
|
entity.y = Self::clamp_vertical(position_rotation.feet_y);
|
||||||
entity.z = position_rotation.z;
|
entity.z = Self::clamp_horizontal(position_rotation.z);
|
||||||
entity.yaw = position_rotation.yaw % 360.0;
|
entity.yaw = wrap_degrees(position_rotation.yaw);
|
||||||
entity.pitch = position_rotation.pitch.clamp(-90.0, 90.0) % 360.0;
|
entity.pitch = wrap_degrees(position_rotation.pitch);
|
||||||
|
|
||||||
// send new position to all other players
|
// send new position to all other players
|
||||||
let on_ground = player.on_ground;
|
let on_ground = player.on_ground;
|
||||||
@ -122,22 +134,24 @@ impl Client {
|
|||||||
pub fn handle_rotation(&mut self, server: &mut Server, rotation: SPlayerRotation) {
|
pub fn handle_rotation(&mut self, server: &mut Server, rotation: SPlayerRotation) {
|
||||||
if !rotation.yaw.is_finite() || !rotation.pitch.is_finite() {
|
if !rotation.yaw.is_finite() || !rotation.pitch.is_finite() {
|
||||||
self.kick("Invalid rotation");
|
self.kick("Invalid rotation");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let player = self.player.as_mut().unwrap();
|
let player = self.player.as_mut().unwrap();
|
||||||
let entity = &mut player.entity;
|
let entity = &mut player.entity;
|
||||||
entity.yaw = rotation.yaw % 360.0;
|
entity.yaw = wrap_degrees(rotation.yaw);
|
||||||
entity.pitch = rotation.pitch.clamp(-90.0, 90.0) % 360.0;
|
entity.pitch = wrap_degrees(rotation.pitch);
|
||||||
// send new position to all other players
|
// send new position to all other players
|
||||||
let on_ground = player.on_ground;
|
let on_ground = player.on_ground;
|
||||||
let entity_id = entity.entity_id;
|
let entity_id = entity.entity_id;
|
||||||
let yaw = entity.yaw;
|
let yaw = (entity.yaw * 256.0 / 360.0).floor();
|
||||||
let pitch = entity.pitch;
|
let pitch = (entity.pitch * 256.0 / 360.0).floor();
|
||||||
|
let head_yaw = (entity.head_yaw * 256.0 / 360.0).floor();
|
||||||
|
|
||||||
server.broadcast_packet(
|
server.broadcast_packet(
|
||||||
self,
|
self,
|
||||||
CUpdateEntityRot::new(entity_id.into(), yaw as u8, pitch as u8, on_ground),
|
CUpdateEntityRot::new(entity_id.into(), yaw as u8, pitch as u8, on_ground),
|
||||||
);
|
);
|
||||||
server.broadcast_packet(self, CHeadRot::new(entity_id.into(), yaw as u8));
|
server.broadcast_packet(self, CHeadRot::new(entity_id.into(), head_yaw as u8));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_chat_command(&mut self, _server: &mut Server, command: SChatCommand) {
|
pub fn handle_chat_command(&mut self, _server: &mut Server, command: SChatCommand) {
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
use pumpkin_protocol::{
|
use pumpkin_protocol::CURRENT_MC_PROTOCOL;
|
||||||
CURRENT_MC_PROTOCOL,
|
use pumpkin_text::{color::NamedColor, TextComponent};
|
||||||
};
|
|
||||||
use pumpkin_text::{click::ClickEvent, color::NamedColor, hover::HoverEvent, TextComponent};
|
|
||||||
|
|
||||||
use crate::server::CURRENT_MC_VERSION;
|
use crate::server::CURRENT_MC_VERSION;
|
||||||
|
|
||||||
|
|||||||
@ -165,6 +165,8 @@ impl Server {
|
|||||||
let x = 10.0;
|
let x = 10.0;
|
||||||
let y = 500.0;
|
let y = 500.0;
|
||||||
let z = 10.0;
|
let z = 10.0;
|
||||||
|
let yaw = 10.0;
|
||||||
|
let pitch = 10.0;
|
||||||
client.teleport(x, y, z, 10.0, 10.0);
|
client.teleport(x, y, z, 10.0, 10.0);
|
||||||
let gameprofile = client.gameprofile.as_ref().unwrap();
|
let gameprofile = client.gameprofile.as_ref().unwrap();
|
||||||
// first send info update to our new player, So he can see his Skin
|
// first send info update to our new player, So he can see his Skin
|
||||||
@ -208,6 +210,7 @@ impl Server {
|
|||||||
// spawn player for every client
|
// spawn player for every client
|
||||||
self.broadcast_packet_expect(
|
self.broadcast_packet_expect(
|
||||||
client,
|
client,
|
||||||
|
// TODO: add velo
|
||||||
CSpawnEntity::new(
|
CSpawnEntity::new(
|
||||||
entity_id.into(),
|
entity_id.into(),
|
||||||
gameprofile.id,
|
gameprofile.id,
|
||||||
@ -215,13 +218,13 @@ impl Server {
|
|||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
z,
|
z,
|
||||||
0,
|
pitch,
|
||||||
0,
|
yaw,
|
||||||
0,
|
yaw,
|
||||||
0.into(),
|
0.into(),
|
||||||
0,
|
0.0,
|
||||||
0,
|
0.0,
|
||||||
0,
|
0.0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
// spawn players for our client
|
// spawn players for our client
|
||||||
@ -238,13 +241,13 @@ impl Server {
|
|||||||
entity.x,
|
entity.x,
|
||||||
entity.y,
|
entity.y,
|
||||||
entity.z,
|
entity.z,
|
||||||
entity.yaw as u8,
|
entity.yaw,
|
||||||
entity.pitch as u8,
|
entity.pitch,
|
||||||
0,
|
entity.pitch,
|
||||||
0.into(),
|
0.into(),
|
||||||
0,
|
0.0,
|
||||||
0,
|
0.0,
|
||||||
0,
|
0.0,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
pumpkin/src/util/math.rs
Normal file
12
pumpkin/src/util/math.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pub fn wrap_degrees(var: f32) -> f32 {
|
||||||
|
let mut var1 = var % 360.0;
|
||||||
|
if var1 >= 180.0 {
|
||||||
|
var1 -= 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if var1 < -180.0 {
|
||||||
|
var1 += 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var1
|
||||||
|
}
|
||||||
@ -1 +1 @@
|
|||||||
|
pub mod math;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user