aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/entity/conveyor.rs13
-rw-r--r--server/src/entity/item_portal.rs13
-rw-r--r--server/src/server.rs19
3 files changed, 26 insertions, 19 deletions
diff --git a/server/src/entity/conveyor.rs b/server/src/entity/conveyor.rs
index e8ff34d7..6177ba9c 100644
--- a/server/src/entity/conveyor.rs
+++ b/server/src/entity/conveyor.rs
@@ -17,7 +17,7 @@
*/
use super::{Entity, EntityContext};
use crate::interaction::interact;
-use anyhow::{anyhow, Result};
+use anyhow::{anyhow, bail, Result};
use hurrycurry_protocol::{glam::IVec2, ItemIndex, ItemLocation};
#[derive(Debug, Clone)]
@@ -62,11 +62,12 @@ impl Entity for Conveyor {
}
self.cooldown = 0.;
- let [from, to] = c
- .game
- .tiles
- .get_many_mut([&self.from, &self.to])
- .ok_or(anyhow!("conveyor does ends in itself"))?;
+ if self.from == self.to {
+ bail!("conveyor does ends in itself")
+ }
+ let [Some(from), Some(to)] = c.game.tiles.get_many_mut([&self.from, &self.to]) else {
+ bail!("at least one conveyor end not on map");
+ };
interact(
&c.game.data,
diff --git a/server/src/entity/item_portal.rs b/server/src/entity/item_portal.rs
index 8eda7a3c..3ea33fa6 100644
--- a/server/src/entity/item_portal.rs
+++ b/server/src/entity/item_portal.rs
@@ -17,7 +17,7 @@
*/
use super::{Entity, EntityContext};
use crate::interaction::interact;
-use anyhow::{anyhow, Result};
+use anyhow::{bail, Result};
use hurrycurry_protocol::{glam::IVec2, ItemLocation};
#[derive(Debug, Default, Clone)]
@@ -28,11 +28,12 @@ pub struct ItemPortal {
impl Entity for ItemPortal {
fn tick(&mut self, c: EntityContext) -> Result<()> {
- let [from, to] = c
- .game
- .tiles
- .get_many_mut([&self.from, &self.to])
- .ok_or(anyhow!("conveyor does ends in itself"))?;
+ if self.from == self.to {
+ bail!("item portal ends in itself")
+ }
+ let [Some(from), Some(to)] = c.game.tiles.get_many_mut([&self.from, &self.to]) else {
+ bail!("at least one item portal end not on map");
+ };
if from.item.is_some() {
interact(
diff --git a/server/src/server.rs b/server/src/server.rs
index d8470fb8..18f78fc0 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -498,11 +498,14 @@ impl Server {
};
if let Some(base_pid) = other_pid {
- let [other, this] = self
- .game
- .players
- .get_many_mut([&pid, &base_pid])
- .ok_or(tre!("s.error.self_interact"))?;
+ if pid == base_pid {
+ return Err(tre!("s.error.self_interact"));
+ }
+ let [Some(other), Some(this)] =
+ self.game.players.get_many_mut([&pid, &base_pid])
+ else {
+ return Err(tre!("s.error.self_interact"));
+ };
if this.class == PlayerClass::Customer || other.class == PlayerClass::Customer {
return Err(tre!("s.error.customer_interact"));
@@ -633,8 +636,10 @@ impl Server {
self.game
.players_spatial_index
.query(pos1, 2., |p2, _pos2| {
- if let Some([a, b]) = self.game.players.get_many_mut([&p1, &p2]) {
- a.movement.collide(&mut b.movement, dt)
+ if p1 != p2 {
+ if let [Some(a), Some(b)] = self.game.players.get_many_mut([&p1, &p2]) {
+ a.movement.collide(&mut b.movement, dt)
+ }
}
})
});