aboutsummaryrefslogtreecommitdiff
path: root/server/src/entity
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-16 02:32:47 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-16 02:32:47 +0100
commite99a71f4f5918e9e43c5f8ff01ce348021f925ea (patch)
treef831db78bd44dba3248e370628e916f29b0aa67d /server/src/entity
parentd3ddc7490bbe0b7696faf42ab8510b32fbd86f12 (diff)
downloadhurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar
hurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar.bz2
hurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar.zst
Add grey holes; player portal pair rest state is grey holes
Diffstat (limited to 'server/src/entity')
-rw-r--r--server/src/entity/mod.rs3
-rw-r--r--server/src/entity/player_portal_pair.rs62
2 files changed, 45 insertions, 20 deletions
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs
index ee8a1a74..c10e1dbd 100644
--- a/server/src/entity/mod.rs
+++ b/server/src/entity/mod.rs
@@ -178,7 +178,8 @@ pub fn construct_entity(decl: &EntityDecl) -> DynEntity {
a,
b,
in_tile,
+ neutral_tile,
out_tile,
- } => Box::new(PlayerPortalPair::new(a, b, in_tile, out_tile)),
+ } => Box::new(PlayerPortalPair::new(a, b, in_tile, neutral_tile, out_tile)),
}
}
diff --git a/server/src/entity/player_portal_pair.rs b/server/src/entity/player_portal_pair.rs
index b73f5891..9691ca05 100644
--- a/server/src/entity/player_portal_pair.rs
+++ b/server/src/entity/player_portal_pair.rs
@@ -30,21 +30,29 @@ pub struct PlayerPortalPair {
a_f: Vec2,
b_f: Vec2,
in_tile: TileIndex,
+ neutral_tile: TileIndex,
out_tile: TileIndex,
- a_out: bool,
- b_out: bool,
+ state: i8,
+ delay: f32,
}
impl PlayerPortalPair {
- pub fn new(a: IVec2, b: IVec2, in_tile: TileIndex, out_tile: TileIndex) -> Self {
+ pub fn new(
+ a: IVec2,
+ b: IVec2,
+ in_tile: TileIndex,
+ neutral_tile: TileIndex,
+ out_tile: TileIndex,
+ ) -> Self {
Self {
a_i: a,
b_i: b,
a_f: a.as_vec2() + vec2(0.5, 0.5),
b_f: b.as_vec2() + vec2(0.5, 0.5),
in_tile,
+ neutral_tile,
out_tile,
- a_out: true,
- b_out: true,
+ state: 1,
+ delay: 0.,
}
}
}
@@ -58,38 +66,54 @@ impl Entity for PlayerPortalPair {
o
};
- if self.a_out && qn(self.a_f, 1.5).is_none() {
+ self.delay -= c.dt;
+
+ let near_a = qn(self.a_f, 1.5);
+ let near_b = qn(self.b_f, 1.5);
+ let in_a = qn(self.a_f, 0.7);
+ let in_b = qn(self.b_f, 0.7);
+
+ if (self.state == 1 && near_b.is_none() && in_a.is_none())
+ || (self.state == -1 && near_a.is_none() && in_b.is_none())
+ {
+ c.game.set_tile(self.b_i, Some(self.neutral_tile));
+ c.game.set_tile(self.a_i, Some(self.neutral_tile));
+ self.state = 0;
+ return Ok(());
+ }
+
+ if self.state == 0 && in_a.is_some() {
c.game.set_tile(self.a_i, Some(self.in_tile));
- self.a_out = false;
+ c.game.set_tile(self.b_i, Some(self.out_tile));
+ self.state = 1;
+ self.delay = 0.2;
return Ok(());
}
- if self.b_out && qn(self.b_f, 1.5).is_none() {
+ if self.state == 0 && in_b.is_some() {
c.game.set_tile(self.b_i, Some(self.in_tile));
- self.b_out = false;
+ c.game.set_tile(self.a_i, Some(self.out_tile));
+ self.state = -1;
+ self.delay = 0.2;
return Ok(());
}
- if !self.a_out
- && let Some(player) = qn(self.a_f, 0.5)
+ if self.state == 1
+ && self.delay < 0.
+ && let Some(player) = in_a
&& let Some(p) = c.game.players.get_mut(&player)
{
p.movement.position = self.b_f;
c.packet_out.push_back(PacketC::MovementSync { player });
- c.game.set_tile(self.b_i, Some(self.out_tile));
- self.b_out = true;
- return Ok(());
}
- if !self.b_out
- && let Some(player) = qn(self.b_f, 0.5)
+ if self.state == -1
+ && self.delay < 0.
+ && let Some(player) = in_b
&& let Some(p) = c.game.players.get_mut(&player)
{
p.movement.position = self.a_f;
c.packet_out.push_back(PacketC::MovementSync { player });
- c.game.set_tile(self.a_i, Some(self.out_tile));
- self.a_out = true;
- return Ok(());
}
Ok(())