use crate::protocol::*; use crate::shared::activation::*; use crate::shared::buffs::*; use crate::shared::champion::*; use crate::shared::cooldown::*; use crate::shared::faction::*; use crate::shared::health::*; use crate::shared::immovable::*; use crate::shared::imperative::*; use crate::shared::player::*; use crate::shared::shape::*; use crate::shared::stats::*; use bevy::prelude::*; use bevy::utils::*; use lightyear::prelude::*; #[derive(Bundle)] pub struct NexusBundle { id: PlayerId, position: PlayerPosition, color: PlayerColor, imperative: Imperative, cooldown: Cooldown, health: Health, champion: Champion, effective_stats: EffectiveStats, buffs: Buffs, activation: Activation, shape: Shape, nexus: Nexus, immovable: Immovable, faction: Faction, replicate: Replicate, } impl NexusBundle { pub fn new(id: ClientId, position: Vec2, faction: Faction) -> Self { let mut replicate = Replicate { replication_group: ReplicationGroup::default().set_priority(10.), ..Default::default() }; replicate.enable_replicate_once::(); replicate.enable_replicate_once::(); replicate.target::(NetworkTarget::Single(id)); replicate.target::(NetworkTarget::Single(id)); replicate.target::(NetworkTarget::Single(id)); let champion = Champion::Nexus; let effective_stats = EffectiveStats(champion.base_stats().0); NexusBundle { id: PlayerId(id), position: PlayerPosition(position), color: PlayerColor(faction.to_color()), imperative: Imperative::Idle, cooldown: Cooldown::default(), health: Health { health: effective_stats.0.max_health, shield: 0., }, champion, effective_stats, buffs: Buffs::default(), activation: Activation::default(), shape: Shape::nexus(), nexus: Nexus::default(), immovable: Immovable, faction, replicate, } } } #[derive(Component)] pub struct Nexus { pub spawn_minions: Timer, } impl Default for Nexus { fn default() -> Self { let mut spawn_minions = Timer::from_seconds(60., TimerMode::Repeating); spawn_minions.set_elapsed(Duration::from_secs_f32(60.)); Nexus { spawn_minions } } }