mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 22:41:30 +11:00
Use a VecDeque for events
This commit is contained in:
parent
232b76a8f7
commit
c468fc3eea
|
@ -98,14 +98,16 @@ impl Config for Game {
|
||||||
fn update(&self, server: &Server, worlds: &mut Worlds) {
|
fn update(&self, server: &Server, worlds: &mut Worlds) {
|
||||||
let world = worlds.iter_mut().next().unwrap().1;
|
let world = worlds.iter_mut().next().unwrap().1;
|
||||||
|
|
||||||
|
let spawn_pos = [
|
||||||
|
SIZE_X as f64 / 2.0,
|
||||||
|
BOARD_Y as f64 + 1.0,
|
||||||
|
SIZE_Z as f64 / 2.0,
|
||||||
|
];
|
||||||
|
|
||||||
world.clients.retain(|_, client| {
|
world.clients.retain(|_, client| {
|
||||||
if client.created_tick() == server.current_tick() {
|
if client.created_tick() == server.current_tick() {
|
||||||
client.set_game_mode(GameMode::Survival);
|
client.set_game_mode(GameMode::Survival);
|
||||||
let spawn_pos = [
|
|
||||||
SIZE_X as f64 / 2.0,
|
|
||||||
BOARD_Y as f64 + 1.0,
|
|
||||||
SIZE_Z as f64 / 2.0,
|
|
||||||
];
|
|
||||||
client.teleport(spawn_pos, 0.0, 0.0);
|
client.teleport(spawn_pos, 0.0, 0.0);
|
||||||
|
|
||||||
world.meta.player_list_mut().insert(
|
world.meta.player_list_mut().insert(
|
||||||
|
@ -132,16 +134,24 @@ impl Config for Game {
|
||||||
let State { board, board_buf } = &mut *self.state.lock().unwrap();
|
let State { board, board_buf } = &mut *self.state.lock().unwrap();
|
||||||
|
|
||||||
for (_, client) in world.clients.iter_mut() {
|
for (_, client) in world.clients.iter_mut() {
|
||||||
for event in client.events_mut().drain(..) {
|
while let Some(event) = client.pop_event() {
|
||||||
if let Event::Digging(e) = event {
|
match event {
|
||||||
let pos = e.position;
|
Event::Digging(e) => {
|
||||||
|
let pos = e.position;
|
||||||
|
|
||||||
if (0..SIZE_X as i32).contains(&pos.x)
|
if (0..SIZE_X as i32).contains(&pos.x)
|
||||||
&& (0..SIZE_Z as i32).contains(&pos.z)
|
&& (0..SIZE_Z as i32).contains(&pos.z)
|
||||||
&& pos.y == BOARD_Y
|
&& pos.y == BOARD_Y
|
||||||
{
|
{
|
||||||
board[pos.x as usize + pos.z as usize * SIZE_X] = true;
|
board[pos.x as usize + pos.z as usize * SIZE_X] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Event::Movement { position, .. } => {
|
||||||
|
if position.y <= 0.0 {
|
||||||
|
client.teleport(spawn_pos, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,9 +201,9 @@ impl Config for Game {
|
||||||
|
|
||||||
if cell_x < SIZE_X && cell_z < SIZE_Z {
|
if cell_x < SIZE_X && cell_z < SIZE_Z {
|
||||||
let b = if board[cell_x + cell_z * SIZE_X] {
|
let b = if board[cell_x + cell_z * SIZE_X] {
|
||||||
BlockState::WHITE_WOOL
|
BlockState::GRASS_BLOCK
|
||||||
} else {
|
} else {
|
||||||
BlockState::BLACK_WOOL
|
BlockState::DIRT
|
||||||
};
|
};
|
||||||
chunk.set_block_state(x, (BOARD_Y - min_y) as usize, z, b);
|
chunk.set_block_state(x, (BOARD_Y - min_y) as usize, z, b);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/// Contains the [`Event`] enum and related data types.
|
/// Contains the [`Event`] enum and related data types.
|
||||||
mod event;
|
mod event;
|
||||||
use std::collections::HashSet;
|
use std::collections::{HashSet, VecDeque};
|
||||||
use std::iter::FusedIterator;
|
use std::iter::FusedIterator;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ pub struct Client {
|
||||||
/// If spawn_position or spawn_position_yaw were modified this tick.
|
/// If spawn_position or spawn_position_yaw were modified this tick.
|
||||||
modified_spawn_position: bool,
|
modified_spawn_position: bool,
|
||||||
death_location: Option<(DimensionId, BlockPos)>,
|
death_location: Option<(DimensionId, BlockPos)>,
|
||||||
events: Vec<Event>,
|
events: VecDeque<Event>,
|
||||||
/// The ID of the last keepalive sent.
|
/// The ID of the last keepalive sent.
|
||||||
last_keepalive_id: i64,
|
last_keepalive_id: i64,
|
||||||
/// If the last sent keepalive got a response.
|
/// If the last sent keepalive got a response.
|
||||||
|
@ -167,7 +167,7 @@ impl Client {
|
||||||
spawn_position_yaw: 0.0,
|
spawn_position_yaw: 0.0,
|
||||||
modified_spawn_position: true,
|
modified_spawn_position: true,
|
||||||
death_location: None,
|
death_location: None,
|
||||||
events: Vec::new(),
|
events: VecDeque::new(),
|
||||||
last_keepalive_id: 0,
|
last_keepalive_id: 0,
|
||||||
got_keepalive: true,
|
got_keepalive: true,
|
||||||
new_max_view_distance: 16,
|
new_max_view_distance: 16,
|
||||||
|
@ -289,12 +289,8 @@ impl Client {
|
||||||
self.send.is_none()
|
self.send.is_none()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn events(&self) -> &Vec<Event> {
|
pub fn pop_event(&mut self) -> Option<Event> {
|
||||||
&self.events
|
self.events.pop_front()
|
||||||
}
|
|
||||||
|
|
||||||
pub fn events_mut(&mut self) -> &mut Vec<Event> {
|
|
||||||
&mut self.events
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The current view distance of this client measured in chunks.
|
/// The current view distance of this client measured in chunks.
|
||||||
|
@ -381,7 +377,7 @@ impl Client {
|
||||||
client.pitch = new_pitch;
|
client.pitch = new_pitch;
|
||||||
client.on_ground = new_on_ground;
|
client.on_ground = new_on_ground;
|
||||||
|
|
||||||
client.events.push(event);
|
client.events.push_back(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +404,7 @@ impl Client {
|
||||||
C2sPlayPacket::BlockEntityTagQuery(_) => {}
|
C2sPlayPacket::BlockEntityTagQuery(_) => {}
|
||||||
C2sPlayPacket::ChangeDifficulty(_) => {}
|
C2sPlayPacket::ChangeDifficulty(_) => {}
|
||||||
C2sPlayPacket::ChatCommand(_) => {}
|
C2sPlayPacket::ChatCommand(_) => {}
|
||||||
C2sPlayPacket::Chat(p) => self.events.push(Event::ChatMessage {
|
C2sPlayPacket::Chat(p) => self.events.push_back(Event::ChatMessage {
|
||||||
message: p.message.0,
|
message: p.message.0,
|
||||||
timestamp: Duration::from_millis(p.timestamp),
|
timestamp: Duration::from_millis(p.timestamp),
|
||||||
}),
|
}),
|
||||||
|
@ -425,7 +421,7 @@ impl Client {
|
||||||
allow_server_listings: p.allow_server_listings,
|
allow_server_listings: p.allow_server_listings,
|
||||||
});
|
});
|
||||||
|
|
||||||
self.events.push(Event::SettingsChanged(old));
|
self.events.push_back(Event::SettingsChanged(old));
|
||||||
}
|
}
|
||||||
C2sPlayPacket::CommandSuggestion(_) => {}
|
C2sPlayPacket::CommandSuggestion(_) => {}
|
||||||
C2sPlayPacket::ContainerButtonClick(_) => {}
|
C2sPlayPacket::ContainerButtonClick(_) => {}
|
||||||
|
@ -438,7 +434,7 @@ impl Client {
|
||||||
// TODO: verify that the client has line of sight to the targeted entity and
|
// TODO: verify that the client has line of sight to the targeted entity and
|
||||||
// that the distance is <=4 blocks.
|
// that the distance is <=4 blocks.
|
||||||
|
|
||||||
self.events.push(Event::InteractWithEntity {
|
self.events.push_back(Event::InteractWithEntity {
|
||||||
id,
|
id,
|
||||||
sneaking: p.sneaking,
|
sneaking: p.sneaking,
|
||||||
typ: match p.typ {
|
typ: match p.typ {
|
||||||
|
@ -487,7 +483,7 @@ impl Client {
|
||||||
handle_movement_packet(self, true, p.position, p.yaw, p.pitch, self.on_ground);
|
handle_movement_packet(self, true, p.position, p.yaw, p.pitch, self.on_ground);
|
||||||
}
|
}
|
||||||
C2sPlayPacket::PaddleBoat(p) => {
|
C2sPlayPacket::PaddleBoat(p) => {
|
||||||
self.events.push(Event::SteerBoat {
|
self.events.push_back(Event::SteerBoat {
|
||||||
left_paddle_turning: p.left_paddle_turning,
|
left_paddle_turning: p.left_paddle_turning,
|
||||||
right_paddle_turning: p.right_paddle_turning,
|
right_paddle_turning: p.right_paddle_turning,
|
||||||
});
|
});
|
||||||
|
@ -503,7 +499,7 @@ impl Client {
|
||||||
self.dug_blocks.push(p.sequence.0);
|
self.dug_blocks.push(p.sequence.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.events.push(match p.status {
|
self.events.push_back(match p.status {
|
||||||
DiggingStatus::StartedDigging => Event::Digging(Digging {
|
DiggingStatus::StartedDigging => Event::Digging(Digging {
|
||||||
status: event::DiggingStatus::Start,
|
status: event::DiggingStatus::Start,
|
||||||
position: p.location,
|
position: p.location,
|
||||||
|
|
Loading…
Reference in a new issue