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

Commit

Permalink
Merge pull request #98 from Mubelotix/main
Browse files Browse the repository at this point in the history
update
  • Loading branch information
DimitriTimoz committed Dec 23, 2023
2 parents 7f656b2 + 69c7bef commit 34d2e14
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 98 deletions.
53 changes: 34 additions & 19 deletions minecraft-server/src/entities/monsters/zombies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,21 @@ impl Handler<Zombie> {
}
}

pub async fn sleep_ticks(server_msg_rcvr: &mut BroadcastReceiver<ServerMessage>, t: usize) {
let mut i = 0;
while i < t {
let Ok(msg) = server_msg_rcvr.recv().await else {continue};
if matches!(&msg, &ServerMessage::Tick(_)) { i += 1; }
}
}

const ZOOMBIE_SPEED: f64 = 0.2; // Arbitrary value

pub async fn zombie_ai_task<T: EntityDescendant + ZombieDescendant>(h: Handler<T>, mut server_msg_rcvr: BroadcastReceiver<ServerMessage>) where AnyEntity: TryAsEntityRef<T> {
loop {
let msg = server_msg_rcvr.recv().await.unwrap();
sleep_ticks(&mut server_msg_rcvr, 1).await;

if !matches!(&msg, &ServerMessage::Tick(_)) {
continue;
}

let self_position = h.observe(|e| e.get_entity().position.clone()).await.unwrap();
let mut self_position = h.observe(|e| e.get_entity().position.clone()).await.unwrap();
let chunk = self_position.chunk_column();
let player_positions = h.world.observe_entities(chunk, |entity| {
let network_entity = entity.to_network().unwrap();
Expand All @@ -42,7 +48,7 @@ pub async fn zombie_ai_task<T: EntityDescendant + ZombieDescendant>(h: Handler<T
})
}).await;

let Some((target_position, network_entity)) = player_positions.get(0) else { continue };
let Some((target_position, network_entity)) = player_positions.get(0) else { sleep_ticks(&mut server_msg_rcvr, 100).await; continue };
let target_object = CollisionShape {
x1: target_position.x - network_entity.width() as f64 / 2.0,
y1: target_position.y,
Expand All @@ -51,20 +57,29 @@ pub async fn zombie_ai_task<T: EntityDescendant + ZombieDescendant>(h: Handler<T
y2: target_position.y + network_entity.height() as f64,
z2: target_position.z + network_entity.width() as f64 / 2.0,
};

let mut translation = Translation {
x: target_position.x - self_position.x,
y: target_position.y - self_position.y,
z: target_position.z - self_position.z,
};
translation.set_norm(0.23000000417232513);

let authorized_translation = h.world.try_move(&target_object, &translation).await;
for _ in 0..50 {
let mut translation = Translation {
x: target_position.x - self_position.x,
y: target_position.y - self_position.y,
z: target_position.z - self_position.z,
};
translation.set_norm(ZOOMBIE_SPEED);

let authorized_translation = h.world.try_move(&target_object, &translation).await;

let new_pos = h.mutate(|e| {
e.get_entity_mut().position += authorized_translation;
(e.get_entity().position.clone(), EntityChanges::position())
}).await;
self_position = match new_pos {
Some(pos) => pos,
None => break,
};

h.mutate(|e| {
e.get_entity_mut().position += authorized_translation;
((), EntityChanges::position())
}).await;
sleep_ticks(&mut server_msg_rcvr, 1).await; // TODO: do while
}

}
}

Expand Down
25 changes: 13 additions & 12 deletions minecraft-server/src/entities/tasks/newton.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,29 @@ use crate::CollisionShape;
use super::*;

pub async fn newton_task<T: EntityDescendant>(h: Handler<T>, mut server_msg_rcvr: BroadcastReceiver<ServerMessage>) where AnyEntity: TryAsEntityRef<T> {
let Some(network_entity) = h.observe_any(|any_entity| any_entity.to_network()).await else { return; };

let (width, height) = match network_entity {
Some(network_entity) => (network_entity.width() as f64, network_entity.height() as f64),
None => {
warn!("Entity {} has no network entity", h.eid);
return;
}
};

loop {
let msg = server_msg_rcvr.recv().await.unwrap();
let Ok(msg) = server_msg_rcvr.recv().await else {continue};

if !matches!(&msg, &ServerMessage::Tick(_)) {
continue;
}

// Get data from entity
let Some((mut position, mut velocity, network_entity)) = h.observe_any(|any_entity| {
let Some((mut position, mut velocity)) = h.observe_any(|any_entity| {
let entity = any_entity.as_entity();
let network_entity = any_entity.to_network();
(entity.position.clone(), entity.velocity.clone(), network_entity)
(entity.position.clone(), entity.velocity.clone())
}).await else { return; };

let (width, height) = match network_entity {
Some(network_entity) => (network_entity.width() as f64, network_entity.height() as f64),
None => {
warn!("Entity {} has no network entity", h.eid); // TODO(perf): Make gravity verify that the entity has bounding boxes at the start
return;
}
};

// Apply velocity and collisions
let mut changes = EntityChanges::nothing();
let mut new_velocity = velocity.clone();
Expand Down
Loading

0 comments on commit 34d2e14

Please sign in to comment.