diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-12-16 02:32:47 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-12-16 02:32:47 +0100 |
| commit | e99a71f4f5918e9e43c5f8ff01ce348021f925ea (patch) | |
| tree | f831db78bd44dba3248e370628e916f29b0aa67d /server/src/entity | |
| parent | d3ddc7490bbe0b7696faf42ab8510b32fbd86f12 (diff) | |
| download | hurrycurry-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.rs | 3 | ||||
| -rw-r--r-- | server/src/entity/player_portal_pair.rs | 62 |
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(()) |