From 601474aa84cfc071c724051ac121e3c9cc796577 Mon Sep 17 00:00:00 2001 From: Alexander Foremny Date: Sun, 17 Mar 2024 09:26:25 +0100 Subject: feat: skillshots --- src/server.rs | 174 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 135 insertions(+), 39 deletions(-) (limited to 'src/server.rs') diff --git a/src/server.rs b/src/server.rs index e3d5a72..b2f22b3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -189,6 +189,10 @@ fn move_to_target(position: Vec2, target_position: Vec2, max_distance: f32) -> ( } } +fn move_along_direction(position: Vec2, direction: Vec2, distance: f32) -> Vec2 { + position + distance * direction +} + fn imperative_attack_approach( entity_map: Res, mut players: Query<(&PlayerId, &mut Imperative)>, @@ -198,7 +202,7 @@ fn imperative_attack_approach( ) { for (id, mut imperative) in players.iter_mut() { match *imperative { - Imperative::Attack(AttackKey::A, target_player) => { + Imperative::AttackTarget(_, target_player) => { let Some(entity) = entity_map.0.get(&id.0) else { *imperative = Imperative::Idle; return; @@ -242,7 +246,7 @@ fn imperative_attack_attack( ) { for (id, mut imperative) in players.iter_mut() { match *imperative { - Imperative::Attack(AttackKey::A, target_player) => { + Imperative::AttackTarget(_, target_player) => { let Some(entity) = entity_map.0.get(&id.0) else { *imperative = Imperative::Idle; return; @@ -269,24 +273,54 @@ fn imperative_attack_attack( }; if cooldown.a_cooldown.is_zero() { cooldown.a_cooldown = Duration::from_secs_f32(1.5); - let instant = *champion == Champion::Meele; + let projectile_type = if *champion == Champion::Meele { + ProjectileType::Instant(InstantProjectile { target_player }) + } else { + ProjectileType::Targeted(TargetedProjectile { + target_player, + position: position.0, + }) + }; commands.spawn(ProjectileBundle { projectile: Projectile { - target_player, source_player: *id, damage: 4., - instant, + type_: projectile_type, }, - position: ProjectilePosition(if instant { - target_position.0 - } else { - position.0 - }), replicate: Replicate::default(), }); } } } + Imperative::AttackDirection(_, direction) => { + let Some(entity) = entity_map.0.get(&id.0) else { + *imperative = Imperative::Idle; + return; + }; + let Ok(position) = positions.get_mut(*entity) else { + *imperative = Imperative::Idle; + return; + }; + let Ok(mut cooldown) = cooldowns.get_mut(*entity) else { + *imperative = Imperative::Idle; + return; + }; + if cooldown.a_cooldown.is_zero() { + cooldown.a_cooldown = Duration::from_secs_f32(1.5); + commands.spawn(ProjectileBundle { + projectile: Projectile { + source_player: *id, + damage: 4., + type_: ProjectileType::Free(FreeProjectile { + position: position.0, + direction, + starting_position: position.0, + }), + }, + replicate: Replicate::default(), + }); + } + } _ => {} } } @@ -296,24 +330,40 @@ const PROJECTILE_SPEED: f32 = 150.; fn projectile_move( entity_map: Res, - mut projectile_positions: Query<&mut ProjectilePosition>, player_positions: Query<&PlayerPosition>, - projectiles: Query<(Entity, &mut Projectile)>, + mut projectiles: Query<&mut Projectile>, time: Res