Skip to content
This repository was archived by the owner on Jul 1, 2024. It is now read-only.

Commit d7c2b46

Browse files
committed
Optimizations
1 parent 790e5ab commit d7c2b46

File tree

5 files changed

+19
-14
lines changed

5 files changed

+19
-14
lines changed

minecraft-server/src/entities/monsters/zombies.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ pub struct Zombie {
1717
// https://minecraft.wiki/w/Attribute
1818
const ZOMBIE_BASE_FOLLOW_RANGE: f64 = 35.0;
1919
const ZOMBIE_BASE_MOVEMENT_SPEED: f64 = 0.23;
20+
const ZOMBIE_SEARCH_COOLDOWN: u64 = 20;
2021

2122
pub struct ZombieTask {
2223
newton_task: NewtonTask,
2324
target: Option<Eid>,
25+
last_search_tick: u64,
2426
}
2527

2628
impl ZombieTask {
@@ -29,7 +31,8 @@ impl ZombieTask {
2931
let Some(newton_task) = NewtonTask::init(&anyentity).await else { return None; };
3032
Some(ZombieTask {
3133
newton_task,
32-
target: None
34+
target: None,
35+
last_search_tick: 0,
3336
})
3437
}
3538

@@ -132,20 +135,21 @@ impl ZombieTask {
132135
h.world.try_move(&collision_shape, &translation).await
133136
}
134137

135-
pub async fn tick(&mut self, h: Handler<Zombie>, entity_change_set: &EntityChangeSet) {
138+
pub async fn tick(&mut self, h: Handler<Zombie>, tick_id: u64, entity_change_set: &EntityChangeSet) {
136139
// Acquire target if none
137140
let mut positions = None;
138-
if self.target.is_none() {
141+
if self.target.is_none() && self.last_search_tick + ZOMBIE_SEARCH_COOLDOWN < tick_id {
139142
positions = self.acquire_target(&h).await;
143+
self.last_search_tick = tick_id;
140144
}
141145

142146
// Get target position if not already acquired
143-
if positions.is_none() {
147+
if self.target.is_some() && positions.is_none() {
144148
let target_position = self.get_target_position(&h).await;
145149
let self_position = self.get_self_position(&h).await;
146150
positions = match (target_position, self_position) {
147151
(Some(target_position), Some(self_position)) => Some((self_position, target_position)),
148-
_ => return,
152+
_ => None,
149153
};
150154
}
151155

@@ -161,6 +165,7 @@ impl ZombieTask {
161165
}).await;
162166
}
163167

168+
// Apply gravity and velocity
164169
self.newton_task.tick(h.into(), entity_change_set).await;
165170
}
166171
}

minecraft-server/src/entities/tasks/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ impl EntityTask {
2222
}
2323
}
2424

25-
pub async fn tick(&mut self, h: Handler<Entity>, entity_change_set: &EntityChangeSet) {
25+
pub async fn tick(&mut self, h: Handler<Entity>, tick_id: u64, entity_change_set: &EntityChangeSet) {
2626
match self {
27-
EntityTask::Zombie(zombie_task) => zombie_task.tick(h.assume_other(), entity_change_set).await,
27+
EntityTask::Zombie(zombie_task) => zombie_task.tick(h.assume_other(), tick_id, entity_change_set).await,
2828
}
2929
}
3030
}

minecraft-server/src/server_behavior.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::prelude::*;
66
#[derive(Clone, Debug)]
77
pub enum ServerMessage {
88
/// Message indicating a new tick has started
9-
Tick(usize),
9+
Tick(u64),
1010
}
1111

1212
pub struct ServerBehavior {
@@ -23,11 +23,11 @@ impl ServerBehavior {
2323
// Send ticks to player handlers
2424
let world2: &World = world;
2525
tokio::spawn(async move {
26-
let mut tick_id = 0;
26+
let mut tick_id: u64 = 0;
2727
let mut tick = tokio::time::interval(Duration::from_millis(50));
2828
loop {
2929
tick.tick().await;
30-
world2.tick().await;
30+
world2.tick(tick_id).await;
3131
let _ = sender.send(ServerMessage::Tick(tick_id));
3232
tick_id += 1;
3333
}

minecraft-server/src/world/ecs.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,12 @@ impl Entities {
122122
entity
123123
}
124124

125-
pub(super) async fn tick(&self, world: &'static World) {
125+
pub(super) async fn tick(&self, tick_id: u64, world: &'static World) {
126126
let entity_change_set = std::mem::take(&mut *self.change_set.write().await);
127127
let mut tasks = self.tasks.write().await;
128128
for (eid, task) in tasks.iter_mut() {
129129
let h = Handler::<Entity>::assume(*eid, world);
130-
task.tick(h, &entity_change_set).await;
130+
task.tick(h, tick_id, &entity_change_set).await;
131131
}
132132
}
133133
}

minecraft-server/src/world/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ impl World {
158158
}
159159
}
160160

161-
pub async fn tick(&'static self) {
162-
self.entities.tick(self).await;
161+
pub async fn tick(&'static self, tick_id: u64) {
162+
self.entities.tick(tick_id, self).await;
163163
// TODO: tick world
164164
}
165165
}

0 commit comments

Comments
 (0)