From 3343ddf4cc5d0059ca8f9825b93bffb1c5c39cae Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Tue, 18 Jul 2023 12:11:19 +0200 Subject: [PATCH] go into blink state at half buildup time --- assets/voxygen/voxel/object/portal.vox | 4 +- assets/voxygen/voxel/object/portal_active.vox | 4 +- server/src/sys/teleporter.rs | 59 ++++++++++++++++--- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/assets/voxygen/voxel/object/portal.vox b/assets/voxygen/voxel/object/portal.vox index e8358bf549..bfb531545b 100644 --- a/assets/voxygen/voxel/object/portal.vox +++ b/assets/voxygen/voxel/object/portal.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7908a4ec9f15eebaa3360598de0f44fdbb317bdebdf94538015bef363aa5a17 -size 64414 +oid sha256:14b9db19d7ba5320d3fd72d062d45c1efb0baddedaf1bf5cae79fc2909541856 +size 50670 diff --git a/assets/voxygen/voxel/object/portal_active.vox b/assets/voxygen/voxel/object/portal_active.vox index c8a3df3720..c8481918a4 100644 --- a/assets/voxygen/voxel/object/portal_active.vox +++ b/assets/voxygen/voxel/object/portal_active.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:98cfc67080935c5a832939c857dbe76912a93e233b93387a338f413c151f3929 -size 64414 +oid sha256:fa3dbaa31ec9cc6fa91dc86c13ab6a0cf6dfb576ef3d2692b91777aa51334679 +size 50670 diff --git a/server/src/sys/teleporter.rs b/server/src/sys/teleporter.rs index f4a1c3a809..0b30dc131a 100644 --- a/server/src/sys/teleporter.rs +++ b/server/src/sys/teleporter.rs @@ -1,6 +1,15 @@ +use std::time::Duration; + use common::{ - comp::{object, Agent, Body, ForceUpdate, Player, Pos, Teleporter, Teleporting}, + comp::{ + ability::AbilityMeta, object, Agent, Body, CharacterState, ForceUpdate, Player, Pos, + Teleporter, Teleporting, + }, resources::Time, + states::{ + blink, + utils::{AbilityInfo, StageSection}, + }, CachedSpatialGrid, }; use common_ecs::{Origin, Phase, System}; @@ -27,6 +36,7 @@ impl<'a> System<'a> for Sys { WriteStorage<'a, ForceUpdate>, WriteStorage<'a, Teleporting>, WriteStorage<'a, Body>, + WriteStorage<'a, CharacterState>, Read<'a, CachedSpatialGrid>, Read<'a, Time>, ); @@ -46,6 +56,7 @@ impl<'a> System<'a> for Sys { mut forced_update, mut teleporting, mut bodies, + mut character_states, spatial_grid, time, ): Self::SystemData, @@ -54,7 +65,14 @@ impl<'a> System<'a> for Sys { let mut cancel_teleport = vec![]; let mut start_teleporting = vec![]; - let mut player_data = (&entities, &positions, &players, teleporting.maybe()).join(); + let mut player_data = ( + &entities, + &positions, + &players, + &mut character_states, + teleporting.maybe(), + ) + .join(); let check_aggro = |entity, pos: Vec3| { spatial_grid @@ -78,11 +96,15 @@ impl<'a> System<'a> for Sys { let mut is_active = false; - for (entity, pos, _, teleporting) in nearby_entities.filter_map(|entity| { - player_data - .get(entity, &entities) - .filter(|(_, player_pos, _, _)| in_portal_range(player_pos.0, teleporter_pos.0)) - }) { + for (entity, pos, _, mut character_state, teleporting) in + nearby_entities.filter_map(|entity| { + player_data + .get(entity, &entities) + .filter(|(_, player_pos, _, _, _)| { + in_portal_range(player_pos.0, teleporter_pos.0) + }) + }) + { if teleporter.requires_no_aggro && check_aggro(entity, pos.0) { if teleporting.is_some() { cancel_teleport.push(entity) @@ -97,6 +119,29 @@ impl<'a> System<'a> for Sys { portal: portal_entity, end_time: Time(time.0 + teleporter.buildup_time.0), })); + } else if let Some(remaining) = teleporting.and_then(|teleporting| { + ((time.0 - teleporting.teleport_start.0) >= teleporter.buildup_time.0 / 2. + && !matches!(*character_state, CharacterState::Blink(_))) + .then_some(teleporter.buildup_time.0 - (time.0 - teleporting.teleport_start.0)) + }) { + // Move into blink character state at half buildup time + *character_state = CharacterState::Blink(blink::Data { + timer: Duration::default(), + stage_section: StageSection::Buildup, + static_data: blink::StaticData { + buildup_duration: Duration::from_millis((remaining * 1000.) as u64), + recover_duration: Duration::default(), + max_range: 0., + ability_info: AbilityInfo { + tool: None, + hand: None, + input: common::comp::InputKind::Primary, + ability_meta: AbilityMeta::default(), + ability: None, + input_attr: None, + }, + }, + }); } is_active = true;