From 7e091dddc6d4ecb8c9906b801632ab4b4453a712 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Sun, 20 Sep 2020 21:16:52 -0700
Subject: [PATCH 01/23] Add 3rd skill for hammer, bow, and axe minus skillbar
 UI stuff

---
 common/src/comp/ability.rs                  | 106 ++++++++++++
 common/src/comp/character_state.rs          |  10 ++
 common/src/comp/inventory/item/tool.rs      |  55 ++++++-
 common/src/states/charged_melee.rs          | 171 ++++++++++++++++++++
 common/src/states/leap_melee.rs             |  44 ++++-
 common/src/states/mod.rs                    |   2 +
 common/src/states/repeater_ranged.rs        | 153 ++++++++++++++++++
 common/src/sys/character_behavior.rs        |   4 +
 common/src/sys/stats.rs                     |   2 +
 voxygen/src/anim/src/character/charge.rs    |  16 ++
 voxygen/src/anim/src/character/leapmelee.rs | 141 ++++++++++++++--
 voxygen/src/hud/skillbar.rs                 |  15 ++
 12 files changed, 698 insertions(+), 21 deletions(-)
 create mode 100644 common/src/states/charged_melee.rs
 create mode 100644 common/src/states/repeater_ranged.rs

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 345ad6997b..c07beab4a0 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -18,6 +18,7 @@ pub enum CharacterAbilityType {
     BasicMelee,
     BasicRanged,
     Boost,
+    ChargedMelee,
     ChargedRanged,
     DashMelee,
     BasicBlock,
@@ -26,6 +27,7 @@ pub enum CharacterAbilityType {
     SpinMelee,
     GroundShockwave,
     BasicBeam,
+    RepeaterRanged,
 }
 
 impl From<&CharacterState> for CharacterAbilityType {
@@ -39,9 +41,11 @@ impl From<&CharacterState> for CharacterAbilityType {
             CharacterState::LeapMelee(_) => Self::LeapMelee,
             CharacterState::ComboMelee(data) => Self::ComboMelee(data.stage_section, data.stage),
             CharacterState::SpinMelee(_) => Self::SpinMelee,
+            CharacterState::ChargedMelee(_) => Self::ChargedMelee,
             CharacterState::ChargedRanged(_) => Self::ChargedRanged,
             CharacterState::GroundShockwave(_) => Self::ChargedRanged,
             CharacterState::BasicBeam(_) => Self::BasicBeam,
+            CharacterState::RepeaterRanged(_) => Self::RepeaterRanged,
             _ => Self::BasicMelee,
         }
     }
@@ -69,6 +73,20 @@ pub enum CharacterAbility {
         projectile_gravity: Option<Gravity>,
         projectile_speed: f32,
     },
+    RepeaterRanged {
+        movement_duration: Duration,
+        energy_cost: u32,
+        holdable: bool,
+        prepare_duration: Duration,
+        recover_duration: Duration,
+        projectile: Projectile,
+        projectile_body: Body,
+        projectile_light: Option<LightEmitter>,
+        projectile_gravity: Option<Gravity>,
+        projectile_speed: f32,
+        repetitions: u32,
+        current_rep: u32,
+    },
     Boost {
         duration: Duration,
         only_up: bool,
@@ -107,6 +125,10 @@ pub enum CharacterAbility {
         buildup_duration: Duration,
         recover_duration: Duration,
         base_damage: u32,
+        range: f32,
+        max_angle: f32,
+        leap_speed: f32,
+        leap_vert_speed: f32,
     },
     SpinMelee {
         buildup_duration: Duration,
@@ -122,6 +144,19 @@ pub enum CharacterAbility {
         forward_speed: f32,
         num_spins: u32,
     },
+    ChargedMelee {
+        energy_cost: u32,
+        energy_drain: u32,
+        initial_damage: u32,
+        max_damage: u32,
+        initial_knockback: f32,
+        max_knockback: f32,
+        prepare_duration: Duration,
+        charge_duration: Duration,
+        recover_duration: Duration,
+        range: f32,
+        max_angle: f32,
+    },
     ChargedRanged {
         energy_cost: u32,
         energy_drain: u32,
@@ -203,6 +238,14 @@ impl CharacterAbility {
                 .energy
                 .try_change_by(-(*energy_cost as i32), EnergySource::Ability)
                 .is_ok(),
+            CharacterAbility::ChargedMelee { energy_cost, .. } => update
+                .energy
+                .try_change_by(-(*energy_cost as i32), EnergySource::Ability)
+                .is_ok(),
+            CharacterAbility::RepeaterRanged { energy_cost, .. } => update
+                .energy
+                .try_change_by(-(*energy_cost as i32), EnergySource::Ability)
+                .is_ok(),
             CharacterAbility::GroundShockwave { energy_cost, .. } => update
                 .energy
                 .try_change_by(-(*energy_cost as i32), EnergySource::Ability)
@@ -424,6 +467,10 @@ impl From<&CharacterAbility> for CharacterState {
                 buildup_duration,
                 recover_duration,
                 base_damage,
+                range,
+                max_angle,
+                leap_speed,
+                leap_vert_speed,
             } => CharacterState::LeapMelee(leap_melee::Data {
                 initialize: true,
                 exhausted: false,
@@ -431,6 +478,10 @@ impl From<&CharacterAbility> for CharacterState {
                 buildup_duration: *buildup_duration,
                 recover_duration: *recover_duration,
                 base_damage: *base_damage,
+                range: *range,
+                max_angle: *max_angle,
+                leap_speed: *leap_speed,
+                leap_vert_speed: *leap_vert_speed,
             }),
             CharacterAbility::SpinMelee {
                 buildup_duration,
@@ -465,6 +516,32 @@ impl From<&CharacterAbility> for CharacterState {
                 stage_section: StageSection::Buildup,
                 exhausted: false,
             }),
+            CharacterAbility::ChargedMelee {
+                energy_cost: _,
+                energy_drain,
+                initial_damage,
+                max_damage,
+                initial_knockback,
+                max_knockback,
+                prepare_duration,
+                charge_duration,
+                recover_duration,
+                range,
+                max_angle,
+            } => CharacterState::ChargedMelee(charged_melee::Data {
+                exhausted: false,
+                energy_drain: *energy_drain,
+                initial_damage: *initial_damage,
+                max_damage: *max_damage,
+                initial_knockback: *initial_knockback,
+                max_knockback: *max_knockback,
+                prepare_duration: *prepare_duration,
+                charge_duration: *charge_duration,
+                charge_timer: Duration::default(),
+                recover_duration: *recover_duration,
+                range: *range,
+                max_angle: *max_angle,
+            }),
             CharacterAbility::ChargedRanged {
                 energy_cost: _,
                 energy_drain,
@@ -497,6 +574,35 @@ impl From<&CharacterAbility> for CharacterState {
                 initial_projectile_speed: *initial_projectile_speed,
                 max_projectile_speed: *max_projectile_speed,
             }),
+            CharacterAbility::RepeaterRanged {
+                energy_cost: _,
+                movement_duration,
+                holdable,
+                prepare_duration,
+                recover_duration,
+                projectile,
+                projectile_body,
+                projectile_light,
+                projectile_gravity,
+                projectile_speed,
+                repetitions,
+                current_rep,
+            } => CharacterState::RepeaterRanged(repeater_ranged::Data {
+                exhausted: false,
+                prepare_timer: Duration::default(),
+                holdable: *holdable,
+                movement_duration: *movement_duration,
+                prepare_duration: *prepare_duration,
+                recover_duration: *recover_duration,
+                projectile: projectile.clone(),
+                projectile_body: *projectile_body,
+                projectile_light: *projectile_light,
+                projectile_gravity: *projectile_gravity,
+                projectile_speed: *projectile_speed,
+                repetitions: *repetitions,
+                current_rep: *current_rep,
+                initialize: true,
+            }),
             CharacterAbility::GroundShockwave {
                 energy_cost: _,
                 buildup_duration,
diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs
index 4e99d35469..4d68df5696 100644
--- a/common/src/comp/character_state.rs
+++ b/common/src/comp/character_state.rs
@@ -69,6 +69,10 @@ pub enum CharacterState {
     SpinMelee(spin_melee::Data),
     /// A charged ranged attack (e.g. bow)
     ChargedRanged(charged_ranged::Data),
+    /// A charged melee attack
+    ChargedMelee(charged_melee::Data),
+    /// A repeating ranged attack
+    RepeaterRanged(repeater_ranged::Data),
     /// A ground shockwave attack
     GroundShockwave(ground_shockwave::Data),
     /// A continuous attack that affects all creatures in a cone originating
@@ -87,7 +91,9 @@ impl CharacterState {
             | CharacterState::BasicBlock
             | CharacterState::LeapMelee(_)
             | CharacterState::SpinMelee(_)
+            | CharacterState::ChargedMelee(_)
             | CharacterState::ChargedRanged(_)
+            | CharacterState::RepeaterRanged(_)
             | CharacterState::GroundShockwave(_)
             | CharacterState::BasicBeam(_)
         )
@@ -101,7 +107,9 @@ impl CharacterState {
             | CharacterState::ComboMelee(_)
             | CharacterState::LeapMelee(_)
             | CharacterState::SpinMelee(_)
+            | CharacterState::ChargedMelee(_)
             | CharacterState::ChargedRanged(_)
+            | CharacterState::RepeaterRanged(_)
             | CharacterState::GroundShockwave(_)
             | CharacterState::BasicBeam(_)
         )
@@ -115,7 +123,9 @@ impl CharacterState {
             | CharacterState::ComboMelee(_)
             | CharacterState::BasicBlock
             | CharacterState::LeapMelee(_)
+            | CharacterState::ChargedMelee(_)
             | CharacterState::ChargedRanged(_)
+            | CharacterState::RepeaterRanged(_)
             | CharacterState::GroundShockwave(_)
             | CharacterState::BasicBeam(_)
         )
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index c16bcd8061..2c9cde6b8a 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -226,6 +226,17 @@ impl Tool {
                     forward_speed: 0.0,
                     num_spins: 1,
                 },
+                LeapMelee {
+                    energy_cost: 300,
+                    movement_duration: Duration::from_millis(200),
+                    buildup_duration: Duration::from_millis(1000),
+                    recover_duration: Duration::from_millis(600),
+                    base_damage: (170.0 * self.base_power()) as u32,
+                    range: 3.5,
+                    max_angle: 50.0,
+                    leap_speed: 20.0,
+                    leap_vert_speed: 16.0,
+                },
             ],
             Hammer(_) => vec![
                 BasicMelee {
@@ -237,12 +248,29 @@ impl Tool {
                     range: 3.5,
                     max_angle: 20.0,
                 },
+                ChargedMelee {
+                    energy_cost: 0,
+                    energy_drain: 300,
+                    initial_damage: (20.0 * self.base_power()) as u32,
+                    max_damage: (170.0 * self.base_power()) as u32,
+                    initial_knockback: 12.0,
+                    max_knockback: 60.0,
+                    prepare_duration: Duration::from_millis(200),
+                    charge_duration: Duration::from_millis(1200),
+                    recover_duration: Duration::from_millis(500),
+                    range: 3.5,
+                    max_angle: 30.0,
+                },
                 LeapMelee {
-                    energy_cost: 800,
+                    energy_cost: 700,
                     movement_duration: Duration::from_millis(500),
                     buildup_duration: Duration::from_millis(1000),
                     recover_duration: Duration::from_millis(100),
                     base_damage: (240.0 * self.base_power()) as u32,
+                    range: 4.5,
+                    max_angle: 360.0,
+                    leap_speed: 24.0,
+                    leap_vert_speed: 8.0,
                 },
             ],
             Farming(_) => vec![BasicMelee {
@@ -293,6 +321,31 @@ impl Tool {
                     initial_projectile_speed: 100.0,
                     max_projectile_speed: 500.0,
                 },
+                RepeaterRanged {
+                    energy_cost: 400,
+                    holdable: true,
+                    movement_duration: Duration::from_millis(200),
+                    prepare_duration: Duration::from_millis(1000),
+                    recover_duration: Duration::from_millis(1000),
+                    projectile: Projectile {
+                        hit_solid: vec![projectile::Effect::Stick],
+                        hit_entity: vec![
+                            projectile::Effect::Damage((-40.0 * self.base_power()) as i32),
+                            projectile::Effect::Knockback(10.0),
+                            projectile::Effect::RewardEnergy(50),
+                            projectile::Effect::Vanish,
+                        ],
+                        time_left: Duration::from_secs(15),
+                        owner: None,
+                        ignore_group: true,
+                    },
+                    projectile_body: Body::Object(object::Body::Arrow),
+                    projectile_light: None,
+                    projectile_gravity: Some(Gravity(0.2)),
+                    projectile_speed: 100.0,
+                    repetitions: 4,
+                    current_rep: 0,
+                },
             ],
             Dagger(_) => vec![BasicMelee {
                 energy_cost: 0,
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
new file mode 100644
index 0000000000..68b35f4b5d
--- /dev/null
+++ b/common/src/states/charged_melee.rs
@@ -0,0 +1,171 @@
+use crate::{
+    comp::{Attacking, CharacterState, EnergySource, StateUpdate},
+    states::utils::*,
+    sys::character_behavior::*,
+};
+use serde::{Deserialize, Serialize};
+use std::time::Duration;
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct Data {
+    /// Whether the attack fired already
+    pub exhausted: bool,
+    /// How much energy is drained per second when charging
+    pub energy_drain: u32,
+    /// How much damage is dealt with no charge
+    pub initial_damage: u32,
+    /// How much damage is dealt with max charge
+    pub max_damage: u32,
+    /// How much knockback there is with no charge
+    pub initial_knockback: f32,
+    /// How much knockback there is at max charge
+    pub max_knockback: f32,
+    /// How long the weapon needs to be prepared for
+    pub prepare_duration: Duration,
+    /// How long it takes to charge the weapon to max damage and knockback
+    pub charge_duration: Duration,
+    /// How long the state has been charging
+    pub charge_timer: Duration,
+    /// How long the state has until exiting
+    pub recover_duration: Duration,
+    /// Max range
+    pub range: f32,
+    /// Max angle (45.0 will give you a 90.0 angle window)
+    pub max_angle: f32,
+}
+
+impl CharacterBehavior for Data {
+    fn behavior(&self, data: &JoinData) -> StateUpdate {
+        let mut update = StateUpdate::from(data);
+
+        handle_move(data, &mut update, 0.3);
+        handle_jump(data, &mut update);
+
+        if self.prepare_duration != Duration::default() {
+            // Prepare (draw the bow)
+            update.character = CharacterState::ChargedMelee(Data {
+                exhausted: self.exhausted,
+                energy_drain: self.energy_drain,
+                initial_damage: self.initial_damage,
+                max_damage: self.max_damage,
+                initial_knockback: self.initial_knockback,
+                max_knockback: self.max_knockback,
+                prepare_duration: self
+                    .prepare_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                charge_duration: self.charge_duration,
+                charge_timer: self.charge_timer,
+                recover_duration: self.recover_duration,
+                range: self.range,
+                max_angle: self.max_angle,
+            });
+        } else if data.inputs.secondary.is_pressed()
+            && self.charge_timer < self.charge_duration
+            && update.energy.current() > 0
+        {
+            // Charge the attack
+            update.character = CharacterState::ChargedMelee(Data {
+                exhausted: self.exhausted,
+                energy_drain: self.energy_drain,
+                initial_damage: self.initial_damage,
+                max_damage: self.max_damage,
+                initial_knockback: self.initial_knockback,
+                max_knockback: self.max_knockback,
+                prepare_duration: self.prepare_duration,
+                charge_timer: self
+                    .charge_timer
+                    .checked_add(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                charge_duration: self.charge_duration,
+                recover_duration: self.recover_duration,
+                range: self.range,
+                max_angle: self.max_angle,
+            });
+
+            // Consumes energy if there's enough left and RMB is held down
+            update.energy.change_by(
+                -(self.energy_drain as f32 * data.dt.0) as i32,
+                EnergySource::Ability,
+            );
+        } else if data.inputs.secondary.is_pressed() {
+            // Charge the attack
+            update.character = CharacterState::ChargedMelee(Data {
+                exhausted: self.exhausted,
+                energy_drain: self.energy_drain,
+                initial_damage: self.initial_damage,
+                max_damage: self.max_damage,
+                initial_knockback: self.initial_knockback,
+                max_knockback: self.max_knockback,
+                prepare_duration: self.prepare_duration,
+                charge_timer: self.charge_timer,
+                charge_duration: self.charge_duration,
+                recover_duration: self.recover_duration,
+                range: self.range,
+                max_angle: self.max_angle,
+            });
+
+            // Consumes energy if there's enough left and RMB is held down
+            update.energy.change_by(
+                -(self.energy_drain as f32 * data.dt.0 / 5.0) as i32,
+                EnergySource::Ability,
+            );
+        } else if !self.exhausted {
+            let charge_amount =
+                (self.charge_timer.as_secs_f32() / self.charge_duration.as_secs_f32()).min(1.0);
+            let damage = self.initial_damage as f32 + (charge_amount * (self.max_damage - self.initial_damage) as f32);
+            // Hit attempt
+            data.updater.insert(data.entity, Attacking {
+                base_damage: damage as u32,
+                base_heal: 0,
+                range: self.range,
+                max_angle: self.max_angle.to_radians(),
+                applied: false,
+                hit_count: 0,
+                knockback: self.initial_knockback
+                    + charge_amount * (self.max_knockback - self.initial_knockback),
+            });
+
+            update.character = CharacterState::ChargedMelee(Data {
+                exhausted: true,
+                energy_drain: self.energy_drain,
+                initial_damage: self.initial_damage,
+                max_damage: self.max_damage,
+                initial_knockback: self.initial_knockback,
+                max_knockback: self.max_knockback,
+                prepare_duration: self.prepare_duration,
+                charge_timer: self.charge_timer,
+                charge_duration: self.charge_duration,
+                recover_duration: self.recover_duration,
+                range: self.range,
+                max_angle: self.max_angle,
+            });
+        } else if self.recover_duration != Duration::default() {
+            // Recovery
+            update.character = CharacterState::ChargedMelee(Data {
+                exhausted: self.exhausted,
+                energy_drain: self.energy_drain,
+                initial_damage: self.initial_damage,
+                max_damage: self.max_damage,
+                initial_knockback: self.initial_knockback,
+                max_knockback: self.max_knockback,
+                prepare_duration: self.prepare_duration,
+                charge_timer: self.charge_timer,
+                charge_duration: self.charge_duration,
+                recover_duration: self
+                    .recover_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                range: self.range,
+                max_angle: self.max_angle,
+            });
+        } else {
+            // Done
+            update.character = CharacterState::Wielding;
+            // Make sure attack component is removed
+            data.updater.remove::<Attacking>(data.entity);
+        }
+
+        update
+    }
+}
diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs
index 5575c110b7..fbae6da4c0 100644
--- a/common/src/states/leap_melee.rs
+++ b/common/src/states/leap_melee.rs
@@ -7,9 +7,8 @@ use serde::{Deserialize, Serialize};
 use std::time::Duration;
 use vek::Vec3;
 
-const LEAP_SPEED: f32 = 24.0;
-
-#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
+#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
+//#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
 pub struct Data {
     /// How long the state is moving
     pub movement_duration: Duration,
@@ -21,6 +20,14 @@ pub struct Data {
     pub base_damage: u32,
     /// Whether the attack can deal more damage
     pub exhausted: bool,
+    /// Max range
+    pub range: f32,
+    /// Max angle (45.0 will give you a 90.0 angle window)
+    pub max_angle: f32,
+    /// Leap speed
+    pub leap_speed: f32,
+    /// Leap vertical speed?
+    pub leap_vert_speed: f32,
     pub initialize: bool,
 }
 
@@ -37,13 +44,17 @@ impl CharacterBehavior for Data {
 
         if self.movement_duration != Duration::default() {
             // Jumping
-            update.vel.0 = Vec3::new(data.inputs.look_dir.x, data.inputs.look_dir.y, 8.0)
-                * ((self.movement_duration.as_millis() as f32) / 250.0)
+            //update.vel.0 = Vec3::new(data.inputs.look_dir.x, data.inputs.look_dir.y, 8.0)
+            update.vel.0 = Vec3::new(
+                data.inputs.look_dir.x,
+                data.inputs.look_dir.y,
+                self.leap_vert_speed,
+            ) * ((self.movement_duration.as_millis() as f32) / 250.0)
                 + (update.vel.0 * Vec3::new(2.0, 2.0, 0.0)
                     + 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default())
                 .try_normalized()
                 .unwrap_or_default()
-                    * LEAP_SPEED
+                    * self.leap_speed
                     * (1.0 - data.inputs.look_dir.z.abs());
 
             update.character = CharacterState::LeapMelee(Data {
@@ -55,6 +66,10 @@ impl CharacterBehavior for Data {
                 recover_duration: self.recover_duration,
                 base_damage: self.base_damage,
                 exhausted: false,
+                range: self.range,
+                max_angle: self.max_angle,
+                leap_speed: self.leap_speed,
+                leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
             });
         } else if self.buildup_duration != Duration::default() && !data.physics.on_ground {
@@ -68,6 +83,10 @@ impl CharacterBehavior for Data {
                 recover_duration: self.recover_duration,
                 base_damage: self.base_damage,
                 exhausted: false,
+                range: self.range,
+                max_angle: self.max_angle,
+                leap_speed: self.leap_speed,
+                leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
             });
         } else if !self.exhausted {
@@ -75,8 +94,9 @@ impl CharacterBehavior for Data {
             data.updater.insert(data.entity, Attacking {
                 base_damage: self.base_damage,
                 base_heal: 0,
-                range: 4.5,
-                max_angle: 360_f32.to_radians(),
+                range: self.range,
+                //range: 4.5,
+                max_angle: self.max_angle.to_radians(),
                 applied: false,
                 hit_count: 0,
                 knockback: 25.0,
@@ -88,6 +108,10 @@ impl CharacterBehavior for Data {
                 recover_duration: self.recover_duration,
                 base_damage: self.base_damage,
                 exhausted: true,
+                range: self.range,
+                max_angle: self.max_angle,
+                leap_speed: self.leap_speed,
+                leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
             });
         } else if self.recover_duration != Duration::default() {
@@ -102,6 +126,10 @@ impl CharacterBehavior for Data {
                     .unwrap_or_default(),
                 base_damage: self.base_damage,
                 exhausted: true,
+                range: self.range,
+                max_angle: self.max_angle,
+                leap_speed: self.leap_speed,
+                leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
             });
         } else {
diff --git a/common/src/states/mod.rs b/common/src/states/mod.rs
index 85474faa90..a93df8c30c 100644
--- a/common/src/states/mod.rs
+++ b/common/src/states/mod.rs
@@ -3,6 +3,7 @@ pub mod basic_block;
 pub mod basic_melee;
 pub mod basic_ranged;
 pub mod boost;
+pub mod charged_melee;
 pub mod charged_ranged;
 pub mod climb;
 pub mod combo_melee;
@@ -14,6 +15,7 @@ pub mod glide_wield;
 pub mod ground_shockwave;
 pub mod idle;
 pub mod leap_melee;
+pub mod repeater_ranged;
 pub mod roll;
 pub mod sit;
 pub mod sneak;
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
new file mode 100644
index 0000000000..25d321aa29
--- /dev/null
+++ b/common/src/states/repeater_ranged.rs
@@ -0,0 +1,153 @@
+use crate::{
+    comp::{Body, CharacterState, Gravity, LightEmitter, Projectile, StateUpdate},
+    event::ServerEvent,
+    states::utils::*,
+    sys::character_behavior::*,
+};
+use serde::{Deserialize, Serialize};
+use std::time::Duration;
+use vek::Vec3;
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct Data {
+    /// How long the state is moving
+    pub movement_duration: Duration,
+    /// Can you hold the ability beyond the prepare duration
+    pub holdable: bool,
+    /// How long we have to prepare the weapon
+    pub prepare_duration: Duration,
+    /// How long we prepared the weapon already
+    pub prepare_timer: Duration,
+    /// How long the state has until exiting
+    pub recover_duration: Duration,
+    pub projectile: Projectile,
+    pub projectile_body: Body,
+    pub projectile_light: Option<LightEmitter>,
+    pub projectile_gravity: Option<Gravity>,
+    pub projectile_speed: f32,
+    /// Whether the attack fired already
+    pub exhausted: bool,
+    /// How many times to repeat
+    pub repetitions: u32,
+    /// Current repetition
+    pub current_rep: u32,
+    pub initialize: bool,
+}
+
+impl CharacterBehavior for Data {
+    fn behavior(&self, data: &JoinData) -> StateUpdate {
+        let mut update = StateUpdate::from(data);
+
+        handle_move(data, &mut update, 1.0);
+        handle_jump(data, &mut update);
+
+        if !self.exhausted
+            && if self.holdable {
+                data.inputs.holding_ability_key() || self.prepare_timer < self.prepare_duration
+            } else {
+                self.prepare_timer < self.prepare_duration
+            }
+        {
+            // Prepare (draw the bow)
+            update.character = CharacterState::RepeaterRanged(Data {
+                movement_duration: self.movement_duration,
+                prepare_timer: self.prepare_timer + Duration::from_secs_f32(data.dt.0),
+                holdable: self.holdable,
+                prepare_duration: self.prepare_duration,
+                recover_duration: self.recover_duration,
+                projectile: self.projectile.clone(),
+                projectile_body: self.projectile_body,
+                projectile_light: self.projectile_light,
+                projectile_gravity: self.projectile_gravity,
+                projectile_speed: self.projectile_speed,
+                exhausted: false,
+                repetitions: self.repetitions,
+                current_rep: self.current_rep,
+                initialize: false,
+            });
+        } else if self.movement_duration != Duration::default() {
+            // Jumping
+            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 10.0);
+
+            update.character = CharacterState::RepeaterRanged(Data {
+                movement_duration: self
+                    .movement_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                prepare_timer: self.prepare_timer,
+                holdable: self.holdable,
+                prepare_duration: self.prepare_duration,
+                recover_duration: self.recover_duration,
+                projectile: self.projectile.clone(),
+                projectile_body: self.projectile_body,
+                projectile_light: self.projectile_light,
+                projectile_gravity: self.projectile_gravity,
+                projectile_speed: self.projectile_speed,
+                exhausted: false,
+                repetitions: self.repetitions,
+                current_rep: self.current_rep,
+                initialize: false,
+            });
+        } else if !self.exhausted && self.current_rep < self.repetitions {
+            let mut projectile = self.projectile.clone();
+            projectile.owner = Some(*data.uid);
+            update.server_events.push_front(ServerEvent::Shoot {
+                entity: data.entity,
+                dir: data.inputs.look_dir,
+                body: self.projectile_body,
+                projectile,
+                light: self.projectile_light,
+                gravity: self.projectile_gravity,
+                speed: self.projectile_speed,
+            });
+
+            update.character = CharacterState::RepeaterRanged(Data {
+                movement_duration: self.movement_duration,
+                prepare_timer: self.prepare_timer,
+                holdable: self.holdable,
+                prepare_duration: self.prepare_duration,
+                //recover_duration: self.recover_duration,
+                recover_duration: self
+                    .recover_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                projectile: self.projectile.clone(),
+                projectile_body: self.projectile_body,
+                projectile_light: self.projectile_light,
+                projectile_gravity: self.projectile_gravity,
+                projectile_speed: self.projectile_speed,
+                exhausted: false,
+                repetitions: self.repetitions,
+                current_rep: self.current_rep + 1,
+                initialize: false,
+            });
+        } else if self.recover_duration != Duration::default() {
+            // Recovery
+            update.character = CharacterState::RepeaterRanged(Data {
+                movement_duration: Duration::default(),
+                prepare_timer: self.prepare_timer,
+                holdable: self.holdable,
+                prepare_duration: self.prepare_duration,
+                recover_duration: self
+                    .recover_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                projectile: self.projectile.clone(),
+                projectile_body: self.projectile_body,
+                projectile_light: self.projectile_light,
+                projectile_gravity: self.projectile_gravity,
+                projectile_speed: self.projectile_speed,
+                exhausted: true,
+                repetitions: self.repetitions,
+                current_rep: 0,
+                initialize: false,
+            });
+            return update;
+        } else {
+            // Done
+            update.character = CharacterState::Wielding;
+        }
+
+        update
+    }
+}
diff --git a/common/src/sys/character_behavior.rs b/common/src/sys/character_behavior.rs
index 4ec197b19e..83aebf3912 100644
--- a/common/src/sys/character_behavior.rs
+++ b/common/src/sys/character_behavior.rs
@@ -261,7 +261,9 @@ impl<'a> System<'a> for Sys {
                     CharacterState::DashMelee(data) => data.handle_event(&j, action),
                     CharacterState::LeapMelee(data) => data.handle_event(&j, action),
                     CharacterState::SpinMelee(data) => data.handle_event(&j, action),
+                    CharacterState::ChargedMelee(data) => data.handle_event(&j, action),
                     CharacterState::ChargedRanged(data) => data.handle_event(&j, action),
+                    CharacterState::RepeaterRanged(data) => data.handle_event(&j, action),
                     CharacterState::GroundShockwave(data) => data.handle_event(&j, action),
                     CharacterState::BasicBeam(data) => data.handle_event(&j, action),
                 };
@@ -291,7 +293,9 @@ impl<'a> System<'a> for Sys {
                 CharacterState::DashMelee(data) => data.behavior(&j),
                 CharacterState::LeapMelee(data) => data.behavior(&j),
                 CharacterState::SpinMelee(data) => data.behavior(&j),
+                CharacterState::ChargedMelee(data) => data.behavior(&j),
                 CharacterState::ChargedRanged(data) => data.behavior(&j),
+                CharacterState::RepeaterRanged(data) => data.behavior(&j),
                 CharacterState::GroundShockwave(data) => data.behavior(&j),
                 CharacterState::BasicBeam(data) => data.behavior(&j),
             };
diff --git a/common/src/sys/stats.rs b/common/src/sys/stats.rs
index 9fe746effa..2590eb2f52 100644
--- a/common/src/sys/stats.rs
+++ b/common/src/sys/stats.rs
@@ -112,7 +112,9 @@ impl<'a> System<'a> for Sys {
                 | CharacterState::SpinMelee { .. }
                 | CharacterState::ComboMelee { .. }
                 | CharacterState::BasicRanged { .. }
+                | CharacterState::ChargedMelee { .. }
                 | CharacterState::ChargedRanged { .. }
+                | CharacterState::RepeaterRanged { .. }
                 | CharacterState::GroundShockwave { .. }
                 | CharacterState::BasicBeam { .. } => {
                     if energy.get_unchecked().regen_rate != 0.0 {
diff --git a/voxygen/src/anim/src/character/charge.rs b/voxygen/src/anim/src/character/charge.rs
index 942bc0e2d8..df0a4dcdc4 100644
--- a/voxygen/src/anim/src/character/charge.rs
+++ b/voxygen/src/anim/src/character/charge.rs
@@ -147,6 +147,22 @@ impl Animation for ChargeAnimation {
                     * Quaternion::rotation_z(stop * -0.6);
                 next.control.scale = Vec3::one();
             },
+            Some(ToolKind::Hammer(_)) => {
+                next.l_hand.position = Vec3::new(-8.0, -2.0 + stop * -1.0, 13.0);
+                next.l_hand.orientation = Quaternion::rotation_x(2.1)
+                    * Quaternion::rotation_y(0.7)
+                    * Quaternion::rotation_z(-0.3);
+                next.l_hand.scale = Vec3::one() * 1.05;
+                next.r_hand.position = Vec3::new(-11.0, 2.0, 6.0);
+                next.r_hand.orientation = Quaternion::rotation_x(1.8)
+                    * Quaternion::rotation_y(2.3)
+                    * Quaternion::rotation_z(0.3);
+                next.r_hand.scale = Vec3::one() * 1.05;
+                next.main.position = Vec3::new(-12.0, 1.0, 4.0);
+                next.main.orientation = Quaternion::rotation_x(0.3)
+                    * Quaternion::rotation_y(0.3)
+                    * Quaternion::rotation_z(0.6);
+            },
             _ => {},
         }
 
diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index dada5b978d..41d0739138 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -2,6 +2,7 @@ use super::{super::Animation, CharacterSkeleton, SkeletonAttr};
 use common::comp::item::{Hands, ToolKind};
 /* use std::f32::consts::PI; */
 use super::super::vek::*;
+use std::f32::consts::PI;
 
 pub struct LeapAnimation;
 
@@ -31,6 +32,19 @@ impl Animation for LeapAnimation {
         .sqrt())
             * ((anim_time as f32 * lab as f32 * 4.0).sin());
 
+        // Spin stuff here
+        let foot = (((5.0)
+            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * lab as f32 * 10.32).sin());
+
+        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
+
+        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
+        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
+
+        // end spin stuff
+
         if let Some(ToolKind::Hammer(_)) = active_tool_kind {
             next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
             next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
@@ -94,16 +108,119 @@ impl Animation for LeapAnimation {
                 * Quaternion::rotation_y(0.0)
                 * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
             next.control.scale = Vec3::one();
+
+            next.lantern.position = Vec3::new(
+                skeleton_attr.lantern.0,
+                skeleton_attr.lantern.1,
+                skeleton_attr.lantern.2,
+            );
+            next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+            next.glider.scale = Vec3::one() * 0.0;
+            next.l_control.scale = Vec3::one();
+            next.r_control.scale = Vec3::one();
+
+            next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+            next.torso.orientation = Quaternion::rotation_z(0.0);
+            next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        } else if let Some(ToolKind::Axe(_)) = active_tool_kind {
+            //INTENTION: SWORD
+            next.l_hand.position = Vec3::new(-0.75, -1.0, -2.5);
+            next.l_hand.orientation = Quaternion::rotation_x(1.27);
+            next.l_hand.scale = Vec3::one() * 1.04;
+            next.r_hand.position = Vec3::new(0.75, -1.5, -5.5);
+            next.r_hand.orientation = Quaternion::rotation_x(1.27);
+            next.r_hand.scale = Vec3::one() * 1.05;
+            //next.main.position = Vec3::new(0.0, 0.0, 10.0);
+            next.main.position = Vec3::new(0.0, 0.0, -5.0);
+            next.main.orientation = Quaternion::rotation_x(1.6)
+                * Quaternion::rotation_y(0.0)
+                * Quaternion::rotation_z(-0.4);
+            next.main.scale = Vec3::one();
+
+            next.control.position = Vec3::new(-4.5 + spinhalf * 4.0, 11.0, 8.0);
+            next.control.orientation = Quaternion::rotation_x(0.6 + spinhalf * -3.3)
+                * Quaternion::rotation_y(0.2 + spin * -2.0)
+                * Quaternion::rotation_z(1.4 + spin * 0.1);
+            next.control.scale = Vec3::one();
+            next.head.position = Vec3::new(
+                0.0,
+                -2.0 + skeleton_attr.head.0 + spin * -0.8,
+                skeleton_attr.head.1,
+            );
+            next.head.orientation = Quaternion::rotation_z(spin * -0.25)
+                * Quaternion::rotation_x(0.0 + spin * -0.1)
+                * Quaternion::rotation_y(spin * -0.2);
+            next.chest.position = Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1);
+            next.chest.orientation = Quaternion::rotation_z(spin * 0.1)
+                * Quaternion::rotation_x(0.0 + spin * 0.1)
+                * Quaternion::rotation_y(decel * -0.2);
+            next.chest.scale = Vec3::one();
+
+            next.belt.position = Vec3::new(0.0, 0.0, -2.0);
+            next.belt.orientation = next.chest.orientation * -0.1;
+            next.belt.scale = Vec3::one();
+
+            next.shorts.position = Vec3::new(0.0, 0.0, -5.0);
+            next.belt.orientation = next.chest.orientation * -0.08;
+            next.shorts.scale = Vec3::one();
+            next.torso.position = Vec3::new(0.0, 0.0, 0.1) * skeleton_attr.scaler;
+            next.torso.orientation = Quaternion::rotation_z((spin * 7.0).max(0.3))
+                * Quaternion::rotation_x(0.0)
+                * Quaternion::rotation_y(0.3);
+            next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+
+            // Stuff after the branch in the spin animation file
+
+            next.l_foot.position =
+                Vec3::new(-skeleton_attr.foot.0, foot * 1.0, skeleton_attr.foot.2);
+            next.l_foot.orientation = Quaternion::rotation_x(foot * -1.2);
+            next.l_foot.scale = Vec3::one();
+
+            next.r_foot.position =
+                Vec3::new(skeleton_attr.foot.0, foot * -1.0, skeleton_attr.foot.2);
+            next.r_foot.orientation = Quaternion::rotation_x(foot * 1.2);
+            next.r_foot.scale = Vec3::one();
+
+            next.l_shoulder.position = Vec3::new(-5.0, 0.0, 4.7);
+            next.l_shoulder.orientation = Quaternion::rotation_x(0.0);
+            next.l_shoulder.scale = Vec3::one() * 1.1;
+
+            next.r_shoulder.position = Vec3::new(5.0, 0.0, 4.7);
+            next.r_shoulder.orientation = Quaternion::rotation_x(0.0);
+            next.r_shoulder.scale = Vec3::one() * 1.1;
+
+            next.glider.position = Vec3::new(0.0, 5.0, 0.0);
+            next.glider.orientation = Quaternion::rotation_y(0.0);
+            next.glider.scale = Vec3::one() * 0.0;
+
+            next.lantern.position = Vec3::new(
+                skeleton_attr.lantern.0,
+                skeleton_attr.lantern.1,
+                skeleton_attr.lantern.2,
+            );
+            next.lantern.orientation =
+                Quaternion::rotation_x(spin * -0.7 + 0.4) * Quaternion::rotation_y(spin * 0.4);
+            next.lantern.scale = Vec3::one() * 0.65;
+            next.hold.scale = Vec3::one() * 0.0;
+
+            next.l_control.position = Vec3::new(0.0, 0.0, 0.0);
+            next.l_control.orientation = Quaternion::rotation_x(0.0);
+            next.l_control.scale = Vec3::one();
+
+            next.r_control.position = Vec3::new(0.0, 0.0, 0.0);
+            next.r_control.orientation = Quaternion::rotation_x(0.0);
+            next.r_control.scale = Vec3::one();
         }
-        next.lantern.position = Vec3::new(
-            skeleton_attr.lantern.0,
-            skeleton_attr.lantern.1,
-            skeleton_attr.lantern.2,
-        );
-        next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-        next.glider.scale = Vec3::one() * 0.0;
-        next.l_control.scale = Vec3::one();
-        next.r_control.scale = Vec3::one();
+
+        //next.lantern.position = Vec3::new(
+        //    skeleton_attr.lantern.0,
+        //    skeleton_attr.lantern.1,
+        //    skeleton_attr.lantern.2,
+        //);
+        //next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+        //next.glider.scale = Vec3::one() * 0.0;
+        //next.l_control.scale = Vec3::one();
+        //next.r_control.scale = Vec3::one();
 
         next.second.scale = match (
             active_tool_kind.map(|tk| tk.hands()),
@@ -113,9 +230,9 @@ impl Animation for LeapAnimation {
             (_, _) => Vec3::zero(),
         };
 
-        next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-        next.torso.orientation = Quaternion::rotation_z(0.0);
-        next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        //next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+        //next.torso.orientation = Quaternion::rotation_z(0.0);
+        //next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
         next
     }
 }
diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs
index 899581ba4f..a3b00ce5bb 100644
--- a/voxygen/src/hud/skillbar.rs
+++ b/voxygen/src/hud/skillbar.rs
@@ -724,6 +724,13 @@ impl<'a> Widget for Skillbar<'a> {
                     Color::Rgba(0.3, 0.3, 0.3, 0.8)
                 }
             },
+            Some(ToolKind::Axe(_)) => {
+                if self.energy.current() as f64 >= 100.0 {
+                    Color::Rgba(1.0, 1.0, 1.0, 1.0)
+                } else {
+                    Color::Rgba(0.3, 0.3, 0.3, 0.8)
+                }
+            },
             _ => Color::Rgba(1.0, 1.0, 1.0, 1.0),
         })
         .set(state.ids.m2_content, ui);
@@ -785,6 +792,14 @@ impl<'a> Widget for Skillbar<'a> {
                         .map(|i| i.item.kind())
                         .and_then(|kind| match kind {
                             ItemKind::Tool(Tool { kind, .. }) => match kind {
+                                ToolKind::Hammer(_) => Some((
+                                    "Smash of Doom",
+                                    "\nAn AOE attack with knockback. \nLeaps to position of \
+                                     cursor.",
+                                )),
+                                ToolKind::Axe(_) => {
+                                    Some(("Spin Leap", "\nA slashing running spin leap."))
+                                },
                                 ToolKind::Staff(_) => Some((
                                     "Firebomb",
                                     "\nWhirls a big fireball into the air. \nExplodes the ground \

From 7e5ced158b1fa4d8f5e6c782ce393e75c2d0ba2f Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Mon, 21 Sep 2020 13:45:50 -0700
Subject: [PATCH 02/23] Add skillbar stuff for 3rd skills

---
 .../element/icons/skill_axe_leap_slash.png    | Bin 0 -> 789 bytes
 .../element/icons/skill_bow_jump_burst.png    | Bin 0 -> 675 bytes
 .../element/icons/skill_hammergolf.png        | Bin 0 -> 982 bytes
 common/src/comp/ability.rs                    |   3 +
 common/src/comp/inventory/item/tool.rs        |   5 +-
 common/src/states/repeater_ranged.rs          |  10 +++-
 voxygen/src/hud/hotbar.rs                     |   3 +
 voxygen/src/hud/img_ids.rs                    |   5 +-
 voxygen/src/hud/skillbar.rs                   |   7 ++-
 voxygen/src/hud/slots.rs                      |  33 +++++++++--
 voxygen/src/scene/figure/mod.rs               |  52 ++++++++++++++++++
 11 files changed, 109 insertions(+), 9 deletions(-)
 create mode 100644 assets/voxygen/element/icons/skill_axe_leap_slash.png
 create mode 100644 assets/voxygen/element/icons/skill_bow_jump_burst.png
 create mode 100644 assets/voxygen/element/icons/skill_hammergolf.png

diff --git a/assets/voxygen/element/icons/skill_axe_leap_slash.png b/assets/voxygen/element/icons/skill_axe_leap_slash.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cf85d48a98b35947cfcf97a9ed51059f1477f06
GIT binary patch
literal 789
zcmV+w1M2*VP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkvmAkP!xv$riu?*94sQ@kfAzR5EXIMDionYs1;guFuCaqnlvOS
zE{=k0!NJF3)xpJCR|i)?5PX0*IXWr2NQvhrg%&X$xZIEbp8x0Ga{-}VW}4M84rsb<
zrV?>6lU)_NUeSXv0vG^fW*Kvml!R}6-BTykU5sb>_x)L6HD@s(AQI0q!?cMvh^IGg
zgY!OdgcW6#_?&pmqze*1a$WKGjdQ_efoDd{bZVYBLM#^ASZQNcG&SNW;;5?WlrLmF
zRyl8R*2-1ZyeEHQD5tM1bDh>O5?I6%B#2N@MG0lth|#W-Vj)H6aUcJX>zBx-kgEhn
zjs;YpL3aJ%fAD*@R(^8AOA5t-&KJk|7y-I=fkw@7zK<QJaRLONfh)b`uhfB=Ptt2G
zEqVm>Z37qAElt@2E_Z;zCqp)6R|?V+@_FF>jJ_!g^xp!#Yu?<N=Qw=;(lo2&4RCM>
zj20++-RIri?Q{FLr#ZhL+Rt)oV4lr|00006VoOIv0PFx707(kgPBQ=i010qNS#tmY
zE+YT{E+YYWr9XB6000McNliru<OvM{9swNxEam_J02y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{008YtL_t(I%dJ(x4Z|P|v=Iv+<-rOJkwr3KR_Fj3f(<Hu
zY!LdWjI0X~s>Tu$T;S|GCxnTJg3pB>h?pF+COgbV>$%st1Y)B-W;VM{rUNlMB54t{
z66r9ro7Z!%Ys7V8{<k4$g%MCjPs(iAU;LWszQv75+#={DKg{-(jK<z|8|~5O?TlX|
znHbYumTtDlyDxT3j`g=4ljGoXiOKOoM8Q*8-mi)gIl9~hdJ%jsGW4?%hUbl5NQHQC
zgoz5ms<iYL$!M;5noZGO>I$@{y?az7GfF@U?w-qB2n$wq@dmtZRbDH5@)z&{e$C}2
TnuAt^00000NkvXXu0mjf!>3H@

literal 0
HcmV?d00001

diff --git a/assets/voxygen/element/icons/skill_bow_jump_burst.png b/assets/voxygen/element/icons/skill_bow_jump_burst.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc77937ec3f76328e291a0b11eb44e9589289180
GIT binary patch
literal 675
zcmV;U0$lxxP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iQ>7{u2O~&vh)|s@h>AFB6^c+H)C#RSn2&xzlZGV4
z#ZhoAIQX$xb#QUk)xlK|1V2EW9Gw(hq{ROvg%&X$9QWhhy~o`<fUB1k&FUBjG~G5+
ziMWu-t_q=7bYlQKA{dqw%a{|zBz(u$JpydKi?J;KbAOIrHD@V6Kp>t~4AUmwAfDc|
z4aWP#yi$}@;&b9LlP*a7$aLA`H^v2*IhM(r>C`+iPb?JLSZ-sbXlle$#8Fk#DWA)D
ztTNtWtd*-u^PcR5;hes*%ygPVNMI355FtQD6(y8mBSx!EiiH&I$9?<}*DsPwCRYgx
zITlcX2Fdk<{lV{Ut^DMKmlTczoiC2_F#?2kfkw@7zK<QJaRLONfh)b`uhfB=Ptt2G
zEqVm>Z37qAElu77E_Z;zCqptNR|?YP@_FF>jJ_!g^xpzKYhG{7eVjf3Y3eF@0~{Oz
zqXo)d_jz|$dvE`qY4-O6dZKcwLLXl900006VoOIv0PFx707(kgPBQ=i010qNS#tmY
zE+YT{E+YYWr9XB6000McNliru<OvlN91~J7A;$m!02y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{004VQL_t(I%VS^|*+5g`{eMc$V4}98Sa7-Y`U^ouWEz_~
zbh+y<1R0r#@#^&#f{fT`ba@mnqZ>*}cv2(maT-STNMRbZ>2L6Q8E2$uO1%FM!^jGe
zX>4qCLz$2hCwhX#mB8__nW!C+7+xku6S_~Z=_T29RLySq007L}TMM}<!<hg8002ov
JPDHLkV1lEa5_JFo

literal 0
HcmV?d00001

diff --git a/assets/voxygen/element/icons/skill_hammergolf.png b/assets/voxygen/element/icons/skill_hammergolf.png
new file mode 100644
index 0000000000000000000000000000000000000000..74bcf2fc32595d5584a189b6f4b628b867d25f78
GIT binary patch
literal 982
zcmV;{11bE8P)<h;3K|Lk000e1NJLTq000yK000yS0ssI20_%!e0004lX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iQ%hAU4(%Y~kfAzR5EXIMDionYs1;guFuC*#ni!H4
z7e~Rh;NZt%)xpJCR|i)?5c~jfa&%I3krMxx6k5c1aNLh~_a1le0HIN3n$<N1Xu54?
zQb{qFUlGHv=s^fk2#CwfGG-+y4d3x~j{slq5<JWQ+@GUQEm#Z)h{Q9@Fm2*>;;BvB
z;Ji;9V`W(-J|`YE>4L<MTvt4P<6LrC;F&Qqo0%hy5sRe`RyvrKO^tYxIIe0s<qJ8F
zRnA+SwQ7yE?#W*mDd@{fT&FpN6c(@u2_h8KP(c+o613{1Sjf<R(#JpO`XzEH<f?#?
zV;&pOAiI9>Klt6PRh$_2k|IeU^x`-l!$5c!Xx1I)``B@sCqVESxYFDHjRr9NNqW7l
z#gBmgZQ$a%ttorJ<qk0LWXPuMN<o@Ju?W1M(KqFR=q=E@>h;#z$LRx*rLNL9z`-Ff
zQljiNpLch6_V(|YR)0SmfO3RCTdwK=000SaNLh0L04^f{04^f|c%?sf00007bV*G`
z2jmF_69pU$+0;}3000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0005O
zNkl<ZILm#LKTcyY5XOIwXjgiv!U+%sLP8v2ImBxt4nXhJ<Px+r6!a)^x^3M=j<kCN
zhbARbQhZyCpP!ROJ906$XTJISIY~Ijw-N%t!vhkF1;BC%5F_vJz{U5TeP4|3?}2k0
zdjtfEQKr<B^U2i=VpPuKS4tOzz<ytlQsU-jKpo1Fc00(L%_zxBY`0up4cL-W(&3;G
z)c0DgBnkBKA;~Y~7n1k#UJ{+?6r-FZi{z#N+VgK0Tqi)kcYwQ|RkMk?xhdMCUt5mH
z(&QNN9^i0@YXB}U*=$ZwV-%f=fKpNj3PDooO-jYad*y67TiRF+R=K^J#3)Hxt*j$-
zQqJ<eI!l^Z{I9t$N!D5Z#7*J$w!Z(_09Xmymx+i@{zq2MwS+b|n{d%per@u!rZpc!
zDc2Ab!U)t<S9YaBlx5NgBrxaNj-o@eB(3CZy_NSR-8zECcrxsPD`&kfOY-^2@yK#H
z(qNeFs4E14-rmYo>^iJ|iPMtg^|k6wm8&Mt&m#w0o}2}@bViD`bnAP)yqr)nMtQHc
zM?m4q8G-+Ea@OOco}MHPt*fZ>`H5-Ue0%X;cX#Ie7dILYNpPW?i~s-t07*qoM6N<$
Eg8Y2IS^xk5

literal 0
HcmV?d00001

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index c07beab4a0..4a29cd0434 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -86,6 +86,7 @@ pub enum CharacterAbility {
         projectile_speed: f32,
         repetitions: u32,
         current_rep: u32,
+        leap: bool,
     },
     Boost {
         duration: Duration,
@@ -587,6 +588,7 @@ impl From<&CharacterAbility> for CharacterState {
                 projectile_speed,
                 repetitions,
                 current_rep,
+                leap,
             } => CharacterState::RepeaterRanged(repeater_ranged::Data {
                 exhausted: false,
                 prepare_timer: Duration::default(),
@@ -602,6 +604,7 @@ impl From<&CharacterAbility> for CharacterState {
                 repetitions: *repetitions,
                 current_rep: *current_rep,
                 initialize: true,
+                leap: *leap,
             }),
             CharacterAbility::GroundShockwave {
                 energy_cost: _,
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 2c9cde6b8a..50ae1de5d3 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -322,10 +322,10 @@ impl Tool {
                     max_projectile_speed: 500.0,
                 },
                 RepeaterRanged {
-                    energy_cost: 400,
+                    energy_cost: 200,
                     holdable: true,
                     movement_duration: Duration::from_millis(200),
-                    prepare_duration: Duration::from_millis(1000),
+                    prepare_duration: Duration::from_millis(500),
                     recover_duration: Duration::from_millis(1000),
                     projectile: Projectile {
                         hit_solid: vec![projectile::Effect::Stick],
@@ -345,6 +345,7 @@ impl Tool {
                     projectile_speed: 100.0,
                     repetitions: 4,
                     current_rep: 0,
+                    leap: true,
                 },
             ],
             Dagger(_) => vec![BasicMelee {
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index 25d321aa29..26086e8762 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -32,6 +32,8 @@ pub struct Data {
     /// Current repetition
     pub current_rep: u32,
     pub initialize: bool,
+    /// Whether there should be a jump
+    pub leap: bool,
 }
 
 impl CharacterBehavior for Data {
@@ -64,10 +66,13 @@ impl CharacterBehavior for Data {
                 repetitions: self.repetitions,
                 current_rep: self.current_rep,
                 initialize: false,
+                leap: self.leap,
             });
         } else if self.movement_duration != Duration::default() {
             // Jumping
-            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 10.0);
+            if self.leap {
+                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 10.0);
+            }
 
             update.character = CharacterState::RepeaterRanged(Data {
                 movement_duration: self
@@ -87,6 +92,7 @@ impl CharacterBehavior for Data {
                 repetitions: self.repetitions,
                 current_rep: self.current_rep,
                 initialize: false,
+                leap: self.leap,
             });
         } else if !self.exhausted && self.current_rep < self.repetitions {
             let mut projectile = self.projectile.clone();
@@ -120,6 +126,7 @@ impl CharacterBehavior for Data {
                 repetitions: self.repetitions,
                 current_rep: self.current_rep + 1,
                 initialize: false,
+                leap: self.leap,
             });
         } else if self.recover_duration != Duration::default() {
             // Recovery
@@ -141,6 +148,7 @@ impl CharacterBehavior for Data {
                 repetitions: self.repetitions,
                 current_rep: 0,
                 initialize: false,
+                leap: self.leap,
             });
             return update;
         } else {
diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs
index 321b6451d2..e17245c2a8 100644
--- a/voxygen/src/hud/hotbar.rs
+++ b/voxygen/src/hud/hotbar.rs
@@ -81,6 +81,9 @@ impl State {
                             ToolKind::Staff(_) => true,
                             ToolKind::Debug(kind) => kind == "Boost",
                             ToolKind::Sword(_) => true,
+                            ToolKind::Hammer(_) => true,
+                            ToolKind::Axe(_) => true,
+                            ToolKind::Bow(_) => true,
                             _ => false,
                         }
                     } else {
diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs
index 7dbe148a98..9279c52b21 100644
--- a/voxygen/src/hud/img_ids.rs
+++ b/voxygen/src/hud/img_ids.rs
@@ -140,7 +140,7 @@ image_ids! {
         flyingrod_m1: "voxygen.element.icons.debug_wand_m1",
         flyingrod_m2: "voxygen.element.icons.debug_wand_m2",
         sword_pierce: "voxygen.element.icons.skill_sword_pierce",
-        hammerleap: "voxygen.element.icons.skill_hammerleap",
+        hammergolf: "voxygen.element.icons.skill_hammergolf",
         axespin: "voxygen.element.icons.skill_axespin",
 
         // Skillbar
@@ -277,6 +277,9 @@ image_ids! {
         heal_0: "voxygen.element.icons.heal_0",
         sword_whirlwind: "voxygen.element.icons.sword_whirlwind",
         heal_bomb: "voxygen.element.icons.heal_bomb",
+        hammerleap: "voxygen.element.icons.skill_hammerleap",
+        skill_axe_leap_slash: "voxygen.element.icons.skill_axe_leap_slash",
+        skill_bow_jump_burst: "voxygen.element.icons.skill_bow_jump_burst",
 
         // Buttons
         button: "voxygen.element.buttons.button",
diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs
index a3b00ce5bb..064157c5e9 100644
--- a/voxygen/src/hud/skillbar.rs
+++ b/voxygen/src/hud/skillbar.rs
@@ -696,7 +696,8 @@ impl<'a> Widget for Skillbar<'a> {
             Some(ToolKind::Sword(_)) => self.imgs.twohsword_m2,
             Some(ToolKind::Dagger(_)) => self.imgs.onehdagger_m2,
             Some(ToolKind::Shield(_)) => self.imgs.onehshield_m2,
-            Some(ToolKind::Hammer(_)) => self.imgs.hammerleap,
+            //Some(ToolKind::Hammer(_)) => self.imgs.hammerleap,
+            Some(ToolKind::Hammer(_)) => self.imgs.hammergolf,
             Some(ToolKind::Axe(_)) => self.imgs.axespin,
             Some(ToolKind::Bow(_)) => self.imgs.bow_m2,
             Some(ToolKind::Sceptre(_)) => self.imgs.heal_bomb,
@@ -809,6 +810,10 @@ impl<'a> Widget for Skillbar<'a> {
                                     "Whirlwind",
                                     "\nMove forward while spinning with \n your sword.",
                                 )),
+                                ToolKind::Bow(_) => Some((
+                                    "Burst",
+                                    "\nLaunches a burst of arrows at the top \nof a running leap.",
+                                )),
                                 ToolKind::Debug(kind) => match kind.as_ref() {
                                     "Boost" => Some((
                                         "Possessing Arrow",
diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs
index f365cf8087..f03a758426 100644
--- a/voxygen/src/hud/slots.rs
+++ b/voxygen/src/hud/slots.rs
@@ -85,6 +85,9 @@ pub enum HotbarImage {
     Fireball,
     SnakeArrow,
     SwordWhirlwind,
+    HammerLeap,
+    AxeLeapSlash,
+    BowJumpBurst,
 }
 
 type HotbarSource<'a> = (&'a hotbar::State, &'a Inventory, &'a Loadout, &'a Energy);
@@ -110,6 +113,9 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
                     match kind {
                         ItemKind::Tool(Tool { kind, .. }) => match kind {
                             ToolKind::Staff(_) => Some(HotbarImage::Fireball),
+                            ToolKind::Hammer(_) => Some(HotbarImage::HammerLeap),
+                            ToolKind::Axe(_) => Some(HotbarImage::AxeLeapSlash),
+                            ToolKind::Bow(_) => Some(HotbarImage::BowJumpBurst),
                             ToolKind::Debug(kind) => match kind.as_ref() {
                                 "Boost" => Some(HotbarImage::SnakeArrow),
                                 _ => None,
@@ -119,11 +125,27 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
                         },
                         _ => None,
                     }
-                    .map(|image_key| {
-                        (
+                    .map(|image_key| match image_key {
+                        HotbarImage::Fireball => (
                             image_key,
-                            (energy.current() < 500).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
-                        )
+                            (energy.current() < 450).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                        ),
+                        HotbarImage::HammerLeap => (
+                            image_key,
+                            (energy.current() < 700).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                        ),
+                        HotbarImage::AxeLeapSlash => (
+                            image_key,
+                            (energy.current() < 300).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                        ),
+                        HotbarImage::BowJumpBurst => (
+                            image_key,
+                            (energy.current() < 200).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                        ),
+                        _ => (
+                            image_key,
+                            (energy.current() < 1000).then_some(Color::Rgba(1.0, 1.0, 1.0, 1.0)),
+                        ),
                     })
                 }),
         })
@@ -146,6 +168,9 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
             HotbarImage::SnakeArrow => imgs.snake_arrow_0,
             HotbarImage::Fireball => imgs.fire_spell_1,
             HotbarImage::SwordWhirlwind => imgs.sword_whirlwind,
+            HotbarImage::HammerLeap => imgs.hammerleap,
+            HotbarImage::AxeLeapSlash => imgs.skill_axe_leap_slash,
+            HotbarImage::BowJumpBurst => imgs.skill_bow_jump_burst,
         }
     }
 }
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index b128ec0b3a..cac9a0bb0d 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -848,6 +848,32 @@ impl FigureMgr {
                                 )
                             }
                         },
+                        CharacterState::ChargedMelee(data) => {
+                            if data.exhausted {
+                                anim::character::AlphaAnimation::update_skeleton(
+                                    &target_base,
+                                    (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),
+                                    state.state_time,
+                                    &mut state_animation_rate,
+                                    skeleton_attr,
+                                )
+                            } else {
+                                anim::character::ChargeAnimation::update_skeleton(
+                                    &target_base,
+                                    (
+                                        active_tool_kind,
+                                        second_tool_kind,
+                                        vel.0.magnitude(),
+                                        ori,
+                                        state.last_ori,
+                                        time,
+                                    ),
+                                    state.state_time,
+                                    &mut state_animation_rate,
+                                    skeleton_attr,
+                                )
+                            }
+                        },
                         CharacterState::ChargedRanged(data) => {
                             if data.exhausted {
                                 anim::character::ShootAnimation::update_skeleton(
@@ -874,6 +900,32 @@ impl FigureMgr {
                                 )
                             }
                         },
+                        CharacterState::RepeaterRanged(data) => {
+                            if data.exhausted {
+                                anim::character::ShootAnimation::update_skeleton(
+                                    &target_base,
+                                    (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),
+                                    state.state_time,
+                                    &mut state_animation_rate,
+                                    skeleton_attr,
+                                )
+                            } else {
+                                anim::character::ChargeAnimation::update_skeleton(
+                                    &target_base,
+                                    (
+                                        active_tool_kind,
+                                        second_tool_kind,
+                                        vel.0.magnitude(),
+                                        ori,
+                                        state.last_ori,
+                                        time,
+                                    ),
+                                    state.state_time,
+                                    &mut state_animation_rate,
+                                    skeleton_attr,
+                                )
+                            }
+                        },
                         CharacterState::Sneak { .. } => {
                             anim::character::SneakAnimation::update_skeleton(
                                 &CharacterSkeleton::default(),

From 973f59da6efcc86a98828a101144f011d66d8bd0 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Thu, 24 Sep 2020 22:51:26 -0700
Subject: [PATCH 03/23] Addressed comments

---
 common/src/comp/ability.rs             |  5 +-
 common/src/comp/inventory/item/tool.rs | 26 +++++----
 common/src/states/charged_melee.rs     |  2 +-
 common/src/states/leap_melee.rs        | 12 ++--
 common/src/states/repeater_ranged.rs   | 80 +++++++++++++++-----------
 common/src/util/mod.rs                 |  2 +-
 voxygen/src/hud/skillbar.rs            |  1 -
 voxygen/src/hud/slots.rs               |  2 +-
 voxygen/src/scene/figure/mod.rs        |  2 +-
 9 files changed, 77 insertions(+), 55 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 4a29cd0434..bc54eb2b82 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -128,6 +128,7 @@ pub enum CharacterAbility {
         base_damage: u32,
         range: f32,
         max_angle: f32,
+        knockback: f32,
         leap_speed: f32,
         leap_vert_speed: f32,
     },
@@ -470,6 +471,7 @@ impl From<&CharacterAbility> for CharacterState {
                 base_damage,
                 range,
                 max_angle,
+                knockback,
                 leap_speed,
                 leap_vert_speed,
             } => CharacterState::LeapMelee(leap_melee::Data {
@@ -481,6 +483,7 @@ impl From<&CharacterAbility> for CharacterState {
                 base_damage: *base_damage,
                 range: *range,
                 max_angle: *max_angle,
+                knockback: *knockback,
                 leap_speed: *leap_speed,
                 leap_vert_speed: *leap_vert_speed,
             }),
@@ -590,7 +593,6 @@ impl From<&CharacterAbility> for CharacterState {
                 current_rep,
                 leap,
             } => CharacterState::RepeaterRanged(repeater_ranged::Data {
-                exhausted: false,
                 prepare_timer: Duration::default(),
                 holdable: *holdable,
                 movement_duration: *movement_duration,
@@ -603,7 +605,6 @@ impl From<&CharacterAbility> for CharacterState {
                 projectile_speed: *projectile_speed,
                 repetitions: *repetitions,
                 current_rep: *current_rep,
-                initialize: true,
                 leap: *leap,
             }),
             CharacterAbility::GroundShockwave {
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 50ae1de5d3..219368083e 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -227,15 +227,18 @@ impl Tool {
                     num_spins: 1,
                 },
                 LeapMelee {
-                    energy_cost: 300,
+                    energy_cost: 450,
                     movement_duration: Duration::from_millis(200),
                     buildup_duration: Duration::from_millis(1000),
                     recover_duration: Duration::from_millis(600),
-                    base_damage: (170.0 * self.base_power()) as u32,
+                    base_damage: (160.0 * self.base_power()) as u32,
                     range: 3.5,
-                    max_angle: 50.0,
-                    leap_speed: 20.0,
-                    leap_vert_speed: 16.0,
+                    max_angle: 120.0,
+                    knockback: 15.0,
+                    //leap_speed: 20.0,
+                    leap_speed: 16.0,
+                    leap_vert_speed: 6.0,
+                    //leap_vert_speed: 16.0,
                 },
             ],
             Hammer(_) => vec![
@@ -269,8 +272,11 @@ impl Tool {
                     base_damage: (240.0 * self.base_power()) as u32,
                     range: 4.5,
                     max_angle: 360.0,
+                    knockback: 25.0,
                     leap_speed: 24.0,
-                    leap_vert_speed: 8.0,
+                    //leap_speed: 24.0,
+                    leap_vert_speed: 4.0,
+                    //leap_vert_speed: 8.0,
                 },
             ],
             Farming(_) => vec![BasicMelee {
@@ -322,11 +328,11 @@ impl Tool {
                     max_projectile_speed: 500.0,
                 },
                 RepeaterRanged {
-                    energy_cost: 200,
+                    energy_cost: 10,
                     holdable: true,
                     movement_duration: Duration::from_millis(200),
-                    prepare_duration: Duration::from_millis(500),
-                    recover_duration: Duration::from_millis(1000),
+                    prepare_duration: Duration::from_millis(50),
+                    recover_duration: Duration::from_millis(500),
                     projectile: Projectile {
                         hit_solid: vec![projectile::Effect::Stick],
                         hit_entity: vec![
@@ -343,7 +349,7 @@ impl Tool {
                     projectile_light: None,
                     projectile_gravity: Some(Gravity(0.2)),
                     projectile_speed: 100.0,
-                    repetitions: 4,
+                    repetitions: 5,
                     current_rep: 0,
                     leap: true,
                 },
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
index 68b35f4b5d..b7a9fce9c9 100644
--- a/common/src/states/charged_melee.rs
+++ b/common/src/states/charged_melee.rs
@@ -42,7 +42,7 @@ impl CharacterBehavior for Data {
         handle_jump(data, &mut update);
 
         if self.prepare_duration != Duration::default() {
-            // Prepare (draw the bow)
+            // Prepare (draw back weapon)
             update.character = CharacterState::ChargedMelee(Data {
                 exhausted: self.exhausted,
                 energy_drain: self.energy_drain,
diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs
index fbae6da4c0..4eea14cef5 100644
--- a/common/src/states/leap_melee.rs
+++ b/common/src/states/leap_melee.rs
@@ -24,6 +24,8 @@ pub struct Data {
     pub range: f32,
     /// Max angle (45.0 will give you a 90.0 angle window)
     pub max_angle: f32,
+    /// Knockback
+    pub knockback: f32,
     /// Leap speed
     pub leap_speed: f32,
     /// Leap vertical speed?
@@ -44,12 +46,11 @@ impl CharacterBehavior for Data {
 
         if self.movement_duration != Duration::default() {
             // Jumping
-            //update.vel.0 = Vec3::new(data.inputs.look_dir.x, data.inputs.look_dir.y, 8.0)
             update.vel.0 = Vec3::new(
                 data.inputs.look_dir.x,
                 data.inputs.look_dir.y,
                 self.leap_vert_speed,
-            ) * ((self.movement_duration.as_millis() as f32) / 250.0)
+            ) * (2.0)
                 + (update.vel.0 * Vec3::new(2.0, 2.0, 0.0)
                     + 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default())
                 .try_normalized()
@@ -68,6 +69,7 @@ impl CharacterBehavior for Data {
                 exhausted: false,
                 range: self.range,
                 max_angle: self.max_angle,
+                knockback: self.knockback,
                 leap_speed: self.leap_speed,
                 leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
@@ -85,6 +87,7 @@ impl CharacterBehavior for Data {
                 exhausted: false,
                 range: self.range,
                 max_angle: self.max_angle,
+                knockback: self.knockback,
                 leap_speed: self.leap_speed,
                 leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
@@ -95,11 +98,10 @@ impl CharacterBehavior for Data {
                 base_damage: self.base_damage,
                 base_heal: 0,
                 range: self.range,
-                //range: 4.5,
                 max_angle: self.max_angle.to_radians(),
                 applied: false,
                 hit_count: 0,
-                knockback: 25.0,
+                knockback: self.knockback,
             });
 
             update.character = CharacterState::LeapMelee(Data {
@@ -110,6 +112,7 @@ impl CharacterBehavior for Data {
                 exhausted: true,
                 range: self.range,
                 max_angle: self.max_angle,
+                knockback: self.knockback,
                 leap_speed: self.leap_speed,
                 leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
@@ -128,6 +131,7 @@ impl CharacterBehavior for Data {
                 exhausted: true,
                 range: self.range,
                 max_angle: self.max_angle,
+                knockback: self.knockback,
                 leap_speed: self.leap_speed,
                 leap_vert_speed: self.leap_vert_speed,
                 initialize: false,
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index 26086e8762..e6580841ab 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -3,6 +3,7 @@ use crate::{
     event::ServerEvent,
     states::utils::*,
     sys::character_behavior::*,
+    util::dir::*,
 };
 use serde::{Deserialize, Serialize};
 use std::time::Duration;
@@ -25,13 +26,10 @@ pub struct Data {
     pub projectile_light: Option<LightEmitter>,
     pub projectile_gravity: Option<Gravity>,
     pub projectile_speed: f32,
-    /// Whether the attack fired already
-    pub exhausted: bool,
     /// How many times to repeat
     pub repetitions: u32,
     /// Current repetition
     pub current_rep: u32,
-    pub initialize: bool,
     /// Whether there should be a jump
     pub leap: bool,
 }
@@ -43,7 +41,7 @@ impl CharacterBehavior for Data {
         handle_move(data, &mut update, 1.0);
         handle_jump(data, &mut update);
 
-        if !self.exhausted
+        if self.current_rep <= self.repetitions
             && if self.holdable {
                 data.inputs.holding_ability_key() || self.prepare_timer < self.prepare_duration
             } else {
@@ -62,10 +60,8 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                exhausted: false,
                 repetitions: self.repetitions,
                 current_rep: self.current_rep,
-                initialize: false,
                 leap: self.leap,
             });
         } else if self.movement_duration != Duration::default() {
@@ -88,18 +84,58 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                exhausted: false,
                 repetitions: self.repetitions,
                 current_rep: self.current_rep,
-                initialize: false,
                 leap: self.leap,
             });
-        } else if !self.exhausted && self.current_rep < self.repetitions {
+        } else if self.recover_duration != Duration::default() {
+            // Hover
+            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 0.0);
+
+            // Recovery
+            update.character = CharacterState::RepeaterRanged(Data {
+                movement_duration: Duration::default(),
+                prepare_timer: self.prepare_timer,
+                holdable: self.holdable,
+                prepare_duration: self.prepare_duration,
+                recover_duration: self
+                    .recover_duration
+                    .checked_sub(Duration::from_secs_f32(data.dt.0))
+                    .unwrap_or_default(),
+                projectile: self.projectile.clone(),
+                projectile_body: self.projectile_body,
+                projectile_light: self.projectile_light,
+                projectile_gravity: self.projectile_gravity,
+                projectile_speed: self.projectile_speed,
+                repetitions: self.repetitions,
+                current_rep: self.current_rep,
+                leap: self.leap,
+            });
+        } else if self.current_rep < self.repetitions {
+            // Hover
+            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 0.0);
+
+            // Fire
             let mut projectile = self.projectile.clone();
             projectile.owner = Some(*data.uid);
             update.server_events.push_front(ServerEvent::Shoot {
                 entity: data.entity,
-                dir: data.inputs.look_dir,
+                dir: Dir::from_unnormalized(Vec3::new(
+                    data.inputs.look_dir[0]
+                        + (if self.current_rep % 2 == 0 {
+                            self.current_rep as f32 / 400.0
+                        } else {
+                            -1.0 * self.current_rep as f32 / 400.0
+                        }),
+                    data.inputs.look_dir[1]
+                        + (if self.current_rep % 2 == 0 {
+                            -1.0 * self.current_rep as f32 / 400.0
+                        } else {
+                            self.current_rep as f32 / 400.0
+                        }),
+                    data.inputs.look_dir[2],
+                ))
+                .expect("That didn't work"),
                 body: self.projectile_body,
                 projectile,
                 light: self.projectile_light,
@@ -122,32 +158,8 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                exhausted: false,
                 repetitions: self.repetitions,
                 current_rep: self.current_rep + 1,
-                initialize: false,
-                leap: self.leap,
-            });
-        } else if self.recover_duration != Duration::default() {
-            // Recovery
-            update.character = CharacterState::RepeaterRanged(Data {
-                movement_duration: Duration::default(),
-                prepare_timer: self.prepare_timer,
-                holdable: self.holdable,
-                prepare_duration: self.prepare_duration,
-                recover_duration: self
-                    .recover_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                projectile: self.projectile.clone(),
-                projectile_body: self.projectile_body,
-                projectile_light: self.projectile_light,
-                projectile_gravity: self.projectile_gravity,
-                projectile_speed: self.projectile_speed,
-                exhausted: true,
-                repetitions: self.repetitions,
-                current_rep: 0,
-                initialize: false,
                 leap: self.leap,
             });
             return update;
diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs
index 8c4578d4e9..94f04ea02c 100644
--- a/common/src/util/mod.rs
+++ b/common/src/util/mod.rs
@@ -1,5 +1,5 @@
 mod color;
-mod dir;
+pub mod dir;
 mod option;
 pub mod userdata_dir;
 
diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs
index 064157c5e9..706142badd 100644
--- a/voxygen/src/hud/skillbar.rs
+++ b/voxygen/src/hud/skillbar.rs
@@ -696,7 +696,6 @@ impl<'a> Widget for Skillbar<'a> {
             Some(ToolKind::Sword(_)) => self.imgs.twohsword_m2,
             Some(ToolKind::Dagger(_)) => self.imgs.onehdagger_m2,
             Some(ToolKind::Shield(_)) => self.imgs.onehshield_m2,
-            //Some(ToolKind::Hammer(_)) => self.imgs.hammerleap,
             Some(ToolKind::Hammer(_)) => self.imgs.hammergolf,
             Some(ToolKind::Axe(_)) => self.imgs.axespin,
             Some(ToolKind::Bow(_)) => self.imgs.bow_m2,
diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs
index f03a758426..03b9125df9 100644
--- a/voxygen/src/hud/slots.rs
+++ b/voxygen/src/hud/slots.rs
@@ -136,7 +136,7 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
                         ),
                         HotbarImage::AxeLeapSlash => (
                             image_key,
-                            (energy.current() < 300).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                            (energy.current() < 450).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
                         ),
                         HotbarImage::BowJumpBurst => (
                             image_key,
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index cac9a0bb0d..f2e64cb4da 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -901,7 +901,7 @@ impl FigureMgr {
                             }
                         },
                         CharacterState::RepeaterRanged(data) => {
-                            if data.exhausted {
+                            if data.current_rep != 0 {
                                 anim::character::ShootAnimation::update_skeleton(
                                     &target_base,
                                     (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),

From a84faedf171846c86265c14a4d109791dd07b112 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Thu, 24 Sep 2020 23:25:56 -0700
Subject: [PATCH 04/23] Reducing the amount of data in character state

---
 common/src/comp/ability.rs             |  9 +++----
 common/src/comp/inventory/item/tool.rs |  3 +--
 common/src/states/repeater_ranged.rs   | 34 +++++++++++---------------
 voxygen/src/scene/figure/mod.rs        |  2 +-
 4 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index bc54eb2b82..cae57558e5 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -84,8 +84,7 @@ pub enum CharacterAbility {
         projectile_light: Option<LightEmitter>,
         projectile_gravity: Option<Gravity>,
         projectile_speed: f32,
-        repetitions: u32,
-        current_rep: u32,
+        reps_remaining: u32,
         leap: bool,
     },
     Boost {
@@ -589,8 +588,7 @@ impl From<&CharacterAbility> for CharacterState {
                 projectile_light,
                 projectile_gravity,
                 projectile_speed,
-                repetitions,
-                current_rep,
+                reps_remaining,
                 leap,
             } => CharacterState::RepeaterRanged(repeater_ranged::Data {
                 prepare_timer: Duration::default(),
@@ -603,8 +601,7 @@ impl From<&CharacterAbility> for CharacterState {
                 projectile_light: *projectile_light,
                 projectile_gravity: *projectile_gravity,
                 projectile_speed: *projectile_speed,
-                repetitions: *repetitions,
-                current_rep: *current_rep,
+                reps_remaining: *reps_remaining,
                 leap: *leap,
             }),
             CharacterAbility::GroundShockwave {
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 219368083e..626d50a751 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -349,8 +349,7 @@ impl Tool {
                     projectile_light: None,
                     projectile_gravity: Some(Gravity(0.2)),
                     projectile_speed: 100.0,
-                    repetitions: 5,
-                    current_rep: 0,
+                    reps_remaining: 5,
                     leap: true,
                 },
             ],
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index e6580841ab..b720a621f2 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -26,10 +26,8 @@ pub struct Data {
     pub projectile_light: Option<LightEmitter>,
     pub projectile_gravity: Option<Gravity>,
     pub projectile_speed: f32,
-    /// How many times to repeat
-    pub repetitions: u32,
-    /// Current repetition
-    pub current_rep: u32,
+    /// How many repetitions remaining
+    pub reps_remaining: u32,
     /// Whether there should be a jump
     pub leap: bool,
 }
@@ -41,7 +39,7 @@ impl CharacterBehavior for Data {
         handle_move(data, &mut update, 1.0);
         handle_jump(data, &mut update);
 
-        if self.current_rep <= self.repetitions
+        if self.reps_remaining > 0
             && if self.holdable {
                 data.inputs.holding_ability_key() || self.prepare_timer < self.prepare_duration
             } else {
@@ -60,8 +58,7 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                repetitions: self.repetitions,
-                current_rep: self.current_rep,
+                reps_remaining: self.reps_remaining,
                 leap: self.leap,
             });
         } else if self.movement_duration != Duration::default() {
@@ -84,8 +81,7 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                repetitions: self.repetitions,
-                current_rep: self.current_rep,
+                reps_remaining: self.reps_remaining,
                 leap: self.leap,
             });
         } else if self.recover_duration != Duration::default() {
@@ -107,11 +103,10 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                repetitions: self.repetitions,
-                current_rep: self.current_rep,
+                reps_remaining: self.reps_remaining,
                 leap: self.leap,
             });
-        } else if self.current_rep < self.repetitions {
+        } else if self.reps_remaining > 0 {
             // Hover
             update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 0.0);
 
@@ -122,16 +117,16 @@ impl CharacterBehavior for Data {
                 entity: data.entity,
                 dir: Dir::from_unnormalized(Vec3::new(
                     data.inputs.look_dir[0]
-                        + (if self.current_rep % 2 == 0 {
-                            self.current_rep as f32 / 400.0
+                        + (if self.reps_remaining % 2 == 0 {
+                            self.reps_remaining as f32 / 400.0
                         } else {
-                            -1.0 * self.current_rep as f32 / 400.0
+                            -1.0 * self.reps_remaining as f32 / 400.0
                         }),
                     data.inputs.look_dir[1]
-                        + (if self.current_rep % 2 == 0 {
-                            -1.0 * self.current_rep as f32 / 400.0
+                        + (if self.reps_remaining % 2 == 0 {
+                            -1.0 * self.reps_remaining as f32 / 400.0
                         } else {
-                            self.current_rep as f32 / 400.0
+                            self.reps_remaining as f32 / 400.0
                         }),
                     data.inputs.look_dir[2],
                 ))
@@ -158,8 +153,7 @@ impl CharacterBehavior for Data {
                 projectile_light: self.projectile_light,
                 projectile_gravity: self.projectile_gravity,
                 projectile_speed: self.projectile_speed,
-                repetitions: self.repetitions,
-                current_rep: self.current_rep + 1,
+                reps_remaining: self.reps_remaining - 1,
                 leap: self.leap,
             });
             return update;
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index f2e64cb4da..8c8053d355 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -901,7 +901,7 @@ impl FigureMgr {
                             }
                         },
                         CharacterState::RepeaterRanged(data) => {
-                            if data.current_rep != 0 {
+                            if data.reps_remaining > 0 {
                                 anim::character::ShootAnimation::update_skeleton(
                                     &target_base,
                                     (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),

From a16046c598185e966522c77f0aa62b12788cb2fd Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Thu, 24 Sep 2020 23:46:26 -0700
Subject: [PATCH 05/23] Fix what broke during rebase

---
 voxygen/src/scene/figure/mod.rs | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index 8c8053d355..98b9099f78 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -852,7 +852,13 @@ impl FigureMgr {
                             if data.exhausted {
                                 anim::character::AlphaAnimation::update_skeleton(
                                     &target_base,
-                                    (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),
+                                    (
+                                        active_tool_kind,
+                                        second_tool_kind,
+                                        vel.0.magnitude(),
+                                        time,
+                                        None,
+                                    ),
                                     state.state_time,
                                     &mut state_animation_rate,
                                     skeleton_attr,

From 90e93e63bd71d410a05e408529404e77de464ae7 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Fri, 25 Sep 2020 09:29:10 -0700
Subject: [PATCH 06/23] Made bow leap more graceful and set energy costs and
 removed jitter for no leap

---
 common/src/comp/inventory/item/tool.rs |  8 ++------
 common/src/states/repeater_ranged.rs   | 12 ++++++++----
 voxygen/src/hud/slots.rs               |  2 +-
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 626d50a751..f47ea2ab7f 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -233,12 +233,10 @@ impl Tool {
                     recover_duration: Duration::from_millis(600),
                     base_damage: (160.0 * self.base_power()) as u32,
                     range: 3.5,
-                    max_angle: 120.0,
+                    max_angle: 100.0,
                     knockback: 15.0,
-                    //leap_speed: 20.0,
                     leap_speed: 16.0,
                     leap_vert_speed: 6.0,
-                    //leap_vert_speed: 16.0,
                 },
             ],
             Hammer(_) => vec![
@@ -274,9 +272,7 @@ impl Tool {
                     max_angle: 360.0,
                     knockback: 25.0,
                     leap_speed: 24.0,
-                    //leap_speed: 24.0,
                     leap_vert_speed: 4.0,
-                    //leap_vert_speed: 8.0,
                 },
             ],
             Farming(_) => vec![BasicMelee {
@@ -328,7 +324,7 @@ impl Tool {
                     max_projectile_speed: 500.0,
                 },
                 RepeaterRanged {
-                    energy_cost: 10,
+                    energy_cost: 450,
                     holdable: true,
                     movement_duration: Duration::from_millis(200),
                     prepare_duration: Duration::from_millis(50),
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index b720a621f2..e151da3ca2 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -85,8 +85,10 @@ impl CharacterBehavior for Data {
                 leap: self.leap,
             });
         } else if self.recover_duration != Duration::default() {
-            // Hover
-            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 0.0);
+            if self.leap {
+                // Hover
+                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], data.vel.0[2] + 0.5);
+            }
 
             // Recovery
             update.character = CharacterState::RepeaterRanged(Data {
@@ -107,8 +109,10 @@ impl CharacterBehavior for Data {
                 leap: self.leap,
             });
         } else if self.reps_remaining > 0 {
-            // Hover
-            update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 0.0);
+            if self.leap {
+                // Hover
+                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], data.vel.0[2] + 0.5);
+            }
 
             // Fire
             let mut projectile = self.projectile.clone();
diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs
index 03b9125df9..fe8bd3445e 100644
--- a/voxygen/src/hud/slots.rs
+++ b/voxygen/src/hud/slots.rs
@@ -140,7 +140,7 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
                         ),
                         HotbarImage::BowJumpBurst => (
                             image_key,
-                            (energy.current() < 200).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
+                            (energy.current() < 450).then_some(Color::Rgba(0.3, 0.3, 0.3, 0.8)),
                         ),
                         _ => (
                             image_key,

From 05091687df818cf6ba8cc9fc8d06443a7ffd9cb9 Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Sun, 27 Sep 2020 20:58:49 -0500
Subject: [PATCH 07/23] Added keyframes to charged melee.

---
 common/src/comp/ability.rs             |  34 +--
 common/src/comp/inventory/item/tool.rs |   6 +-
 common/src/states/charged_melee.rs     | 291 ++++++++++++++-----------
 3 files changed, 180 insertions(+), 151 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index cae57558e5..4d44a8bb9b 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -152,11 +152,11 @@ pub enum CharacterAbility {
         max_damage: u32,
         initial_knockback: f32,
         max_knockback: f32,
-        prepare_duration: Duration,
-        charge_duration: Duration,
-        recover_duration: Duration,
         range: f32,
         max_angle: f32,
+        charge_duration: Duration,
+        swing_duration: Duration,
+        recover_duration: Duration,
     },
     ChargedRanged {
         energy_cost: u32,
@@ -526,24 +526,28 @@ impl From<&CharacterAbility> for CharacterState {
                 max_damage,
                 initial_knockback,
                 max_knockback,
-                prepare_duration,
                 charge_duration,
+                swing_duration,
                 recover_duration,
                 range,
                 max_angle,
             } => CharacterState::ChargedMelee(charged_melee::Data {
+                static_data: charged_melee::StaticData {
+                    energy_drain: *energy_drain,
+                    initial_damage: *initial_damage,
+                    max_damage: *max_damage,
+                    initial_knockback: *initial_knockback,
+                    max_knockback: *max_knockback,
+                    range: *range,
+                    max_angle: *max_angle,
+                    charge_duration: *charge_duration,
+                    swing_duration: *swing_duration,
+                    recover_duration: *recover_duration,
+                },
+                stage_section: StageSection::Buildup,
+                timer: Duration::default(),
                 exhausted: false,
-                energy_drain: *energy_drain,
-                initial_damage: *initial_damage,
-                max_damage: *max_damage,
-                initial_knockback: *initial_knockback,
-                max_knockback: *max_knockback,
-                prepare_duration: *prepare_duration,
-                charge_duration: *charge_duration,
-                charge_timer: Duration::default(),
-                recover_duration: *recover_duration,
-                range: *range,
-                max_angle: *max_angle,
+                charge_amount: 0.0,
             }),
             CharacterAbility::ChargedRanged {
                 energy_cost: _,
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index f47ea2ab7f..a7a29cba21 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -256,11 +256,11 @@ impl Tool {
                     max_damage: (170.0 * self.base_power()) as u32,
                     initial_knockback: 12.0,
                     max_knockback: 60.0,
-                    prepare_duration: Duration::from_millis(200),
-                    charge_duration: Duration::from_millis(1200),
-                    recover_duration: Duration::from_millis(500),
                     range: 3.5,
                     max_angle: 30.0,
+                    charge_duration: Duration::from_millis(1200),
+                    swing_duration: Duration::from_millis(100),
+                    recover_duration: Duration::from_millis(500),
                 },
                 LeapMelee {
                     energy_cost: 700,
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
index b7a9fce9c9..c022659254 100644
--- a/common/src/states/charged_melee.rs
+++ b/common/src/states/charged_melee.rs
@@ -1,15 +1,14 @@
 use crate::{
     comp::{Attacking, CharacterState, EnergySource, StateUpdate},
-    states::utils::*,
+    states::utils::{StageSection, *},
     sys::character_behavior::*,
 };
 use serde::{Deserialize, Serialize};
 use std::time::Duration;
 
-#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
-pub struct Data {
-    /// Whether the attack fired already
-    pub exhausted: bool,
+#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
+/// Separated out to condense update portions of character state
+pub struct StaticData {
     /// How much energy is drained per second when charging
     pub energy_drain: u32,
     /// How much damage is dealt with no charge
@@ -20,18 +19,31 @@ pub struct Data {
     pub initial_knockback: f32,
     /// How much knockback there is at max charge
     pub max_knockback: f32,
-    /// How long the weapon needs to be prepared for
-    pub prepare_duration: Duration,
-    /// How long it takes to charge the weapon to max damage and knockback
-    pub charge_duration: Duration,
-    /// How long the state has been charging
-    pub charge_timer: Duration,
-    /// How long the state has until exiting
-    pub recover_duration: Duration,
     /// Max range
     pub range: f32,
     /// Max angle (45.0 will give you a 90.0 angle window)
     pub max_angle: f32,
+    /// How long it takes to charge the weapon to max damage and knockback
+    pub charge_duration: Duration,
+    /// How long the weapon is swinging for
+    pub swing_duration: Duration,
+    /// How long the state has until exiting
+    pub recover_duration: Duration,
+}
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct Data {
+    /// Struct containing data that does not change over the course of the
+    /// character state
+    pub static_data: StaticData,
+    /// Checks what section a stage is in
+    pub stage_section: StageSection,
+    /// Timer for each stage
+    pub timer: Duration,
+    /// Whether the attack fired already
+    pub exhausted: bool,
+    /// How much the attack charged by
+    pub charge_amount: f32,
 }
 
 impl CharacterBehavior for Data {
@@ -41,129 +53,142 @@ impl CharacterBehavior for Data {
         handle_move(data, &mut update, 0.3);
         handle_jump(data, &mut update);
 
-        if self.prepare_duration != Duration::default() {
-            // Prepare (draw back weapon)
-            update.character = CharacterState::ChargedMelee(Data {
-                exhausted: self.exhausted,
-                energy_drain: self.energy_drain,
-                initial_damage: self.initial_damage,
-                max_damage: self.max_damage,
-                initial_knockback: self.initial_knockback,
-                max_knockback: self.max_knockback,
-                prepare_duration: self
-                    .prepare_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                charge_duration: self.charge_duration,
-                charge_timer: self.charge_timer,
-                recover_duration: self.recover_duration,
-                range: self.range,
-                max_angle: self.max_angle,
-            });
-        } else if data.inputs.secondary.is_pressed()
-            && self.charge_timer < self.charge_duration
-            && update.energy.current() > 0
-        {
-            // Charge the attack
-            update.character = CharacterState::ChargedMelee(Data {
-                exhausted: self.exhausted,
-                energy_drain: self.energy_drain,
-                initial_damage: self.initial_damage,
-                max_damage: self.max_damage,
-                initial_knockback: self.initial_knockback,
-                max_knockback: self.max_knockback,
-                prepare_duration: self.prepare_duration,
-                charge_timer: self
-                    .charge_timer
-                    .checked_add(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                charge_duration: self.charge_duration,
-                recover_duration: self.recover_duration,
-                range: self.range,
-                max_angle: self.max_angle,
-            });
+        match self.stage_section {
+            StageSection::Charge => {
+                if data.inputs.secondary.is_pressed()
+                    && self.timer < self.static_data.charge_duration
+                    && update.energy.current() > 0
+                {
+                    let charge = (self.timer.as_secs_f32()
+                        / self.static_data.charge_duration.as_secs_f32())
+                    .min(1.0);
 
-            // Consumes energy if there's enough left and RMB is held down
-            update.energy.change_by(
-                -(self.energy_drain as f32 * data.dt.0) as i32,
-                EnergySource::Ability,
-            );
-        } else if data.inputs.secondary.is_pressed() {
-            // Charge the attack
-            update.character = CharacterState::ChargedMelee(Data {
-                exhausted: self.exhausted,
-                energy_drain: self.energy_drain,
-                initial_damage: self.initial_damage,
-                max_damage: self.max_damage,
-                initial_knockback: self.initial_knockback,
-                max_knockback: self.max_knockback,
-                prepare_duration: self.prepare_duration,
-                charge_timer: self.charge_timer,
-                charge_duration: self.charge_duration,
-                recover_duration: self.recover_duration,
-                range: self.range,
-                max_angle: self.max_angle,
-            });
+                    // Charge the attack
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: self.stage_section,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        exhausted: self.exhausted,
+                        charge_amount: charge,
+                    });
 
-            // Consumes energy if there's enough left and RMB is held down
-            update.energy.change_by(
-                -(self.energy_drain as f32 * data.dt.0 / 5.0) as i32,
-                EnergySource::Ability,
-            );
-        } else if !self.exhausted {
-            let charge_amount =
-                (self.charge_timer.as_secs_f32() / self.charge_duration.as_secs_f32()).min(1.0);
-            let damage = self.initial_damage as f32 + (charge_amount * (self.max_damage - self.initial_damage) as f32);
-            // Hit attempt
-            data.updater.insert(data.entity, Attacking {
-                base_damage: damage as u32,
-                base_heal: 0,
-                range: self.range,
-                max_angle: self.max_angle.to_radians(),
-                applied: false,
-                hit_count: 0,
-                knockback: self.initial_knockback
-                    + charge_amount * (self.max_knockback - self.initial_knockback),
-            });
+                    // Consumes energy if there's enough left and RMB is held down
+                    update.energy.change_by(
+                        -(self.static_data.energy_drain as f32 * data.dt.0) as i32,
+                        EnergySource::Ability,
+                    );
+                } else if data.inputs.secondary.is_pressed() {
+                    // Maintains charge
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: self.stage_section,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        exhausted: self.exhausted,
+                        charge_amount: self.charge_amount,
+                    });
 
-            update.character = CharacterState::ChargedMelee(Data {
-                exhausted: true,
-                energy_drain: self.energy_drain,
-                initial_damage: self.initial_damage,
-                max_damage: self.max_damage,
-                initial_knockback: self.initial_knockback,
-                max_knockback: self.max_knockback,
-                prepare_duration: self.prepare_duration,
-                charge_timer: self.charge_timer,
-                charge_duration: self.charge_duration,
-                recover_duration: self.recover_duration,
-                range: self.range,
-                max_angle: self.max_angle,
-            });
-        } else if self.recover_duration != Duration::default() {
-            // Recovery
-            update.character = CharacterState::ChargedMelee(Data {
-                exhausted: self.exhausted,
-                energy_drain: self.energy_drain,
-                initial_damage: self.initial_damage,
-                max_damage: self.max_damage,
-                initial_knockback: self.initial_knockback,
-                max_knockback: self.max_knockback,
-                prepare_duration: self.prepare_duration,
-                charge_timer: self.charge_timer,
-                charge_duration: self.charge_duration,
-                recover_duration: self
-                    .recover_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                range: self.range,
-                max_angle: self.max_angle,
-            });
-        } else {
-            // Done
-            update.character = CharacterState::Wielding;
-            // Make sure attack component is removed
-            data.updater.remove::<Attacking>(data.entity);
+                    // Consumes energy if there's enough left and RMB is held down
+                    update.energy.change_by(
+                        -(self.static_data.energy_drain as f32 * data.dt.0 / 5.0) as i32,
+                        EnergySource::Ability,
+                    );
+                } else {
+                    // Transitions to swing
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: StageSection::Swing,
+                        timer: Duration::default(),
+                        exhausted: self.exhausted,
+                        charge_amount: self.charge_amount,
+                    });
+                }
+            },
+            StageSection::Swing => {
+                if !self.exhausted {
+                    let damage = self.static_data.initial_damage
+                        + ((self.static_data.max_damage - self.static_data.initial_damage) as f32
+                            * self.charge_amount) as u32;
+                    let knockback = self.static_data.initial_knockback
+                        + (self.static_data.max_knockback - self.static_data.initial_knockback)
+                            * self.charge_amount;
+
+                    // Hit attempt
+                    data.updater.insert(data.entity, Attacking {
+                        base_damage: damage as u32,
+                        base_heal: 0,
+                        range: self.static_data.range,
+                        max_angle: self.static_data.max_angle.to_radians(),
+                        applied: false,
+                        hit_count: 0,
+                        knockback,
+                    });
+
+                    // Starts swinging
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: self.stage_section,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        exhausted: true,
+                        charge_amount: self.charge_amount,
+                    });
+                } else if self.timer < self.static_data.swing_duration {
+                    // Swings
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: self.stage_section,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        exhausted: self.exhausted,
+                        charge_amount: self.charge_amount,
+                    });
+                } else {
+                    // Transitions to recover
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: StageSection::Recover,
+                        timer: Duration::default(),
+                        exhausted: self.exhausted,
+                        charge_amount: self.charge_amount,
+                    });
+                }
+            },
+            StageSection::Recover => {
+                if self.timer < self.static_data.recover_duration {
+                    // Recovers
+                    update.character = CharacterState::ChargedMelee(Data {
+                        static_data: self.static_data,
+                        stage_section: self.stage_section,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        exhausted: self.exhausted,
+                        charge_amount: self.charge_amount,
+                    });
+                } else {
+                    // Done
+                    update.character = CharacterState::Wielding;
+                    // Make sure attack component is removed
+                    data.updater.remove::<Attacking>(data.entity);
+                }
+            },
+            _ => {
+                // If it somehow ends up in an incorrect stage section
+                update.character = CharacterState::Wielding;
+                // Make sure attack component is removed
+                data.updater.remove::<Attacking>(data.entity);
+            },
         }
 
         update

From b2501a5b5dc0222d04ff1abe99fe59e5399d6f31 Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Sun, 27 Sep 2020 21:38:23 -0500
Subject: [PATCH 08/23] Added keyframes to repeater ranged.

---
 common/src/comp/ability.rs             |  39 ++--
 common/src/comp/inventory/item/tool.rs |   6 +-
 common/src/states/repeater_ranged.rs   | 304 ++++++++++++++-----------
 common/src/states/utils.rs             |   2 +
 4 files changed, 195 insertions(+), 156 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 4d44a8bb9b..9879bbf0de 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -74,18 +74,18 @@ pub enum CharacterAbility {
         projectile_speed: f32,
     },
     RepeaterRanged {
-        movement_duration: Duration,
         energy_cost: u32,
-        holdable: bool,
-        prepare_duration: Duration,
+        movement_duration: Duration,
+        buildup_duration: Duration,
+        shoot_duration: Duration,
         recover_duration: Duration,
+        leap: Option<f32>,
         projectile: Projectile,
         projectile_body: Body,
         projectile_light: Option<LightEmitter>,
         projectile_gravity: Option<Gravity>,
         projectile_speed: f32,
         reps_remaining: u32,
-        leap: bool,
     },
     Boost {
         duration: Duration,
@@ -584,29 +584,32 @@ impl From<&CharacterAbility> for CharacterState {
             CharacterAbility::RepeaterRanged {
                 energy_cost: _,
                 movement_duration,
-                holdable,
-                prepare_duration,
+                buildup_duration,
+                shoot_duration,
                 recover_duration,
+                leap,
                 projectile,
                 projectile_body,
                 projectile_light,
                 projectile_gravity,
                 projectile_speed,
                 reps_remaining,
-                leap,
             } => CharacterState::RepeaterRanged(repeater_ranged::Data {
-                prepare_timer: Duration::default(),
-                holdable: *holdable,
-                movement_duration: *movement_duration,
-                prepare_duration: *prepare_duration,
-                recover_duration: *recover_duration,
-                projectile: projectile.clone(),
-                projectile_body: *projectile_body,
-                projectile_light: *projectile_light,
-                projectile_gravity: *projectile_gravity,
-                projectile_speed: *projectile_speed,
+                static_data: repeater_ranged::StaticData {
+                    movement_duration: *movement_duration,
+                    buildup_duration: *buildup_duration,
+                    shoot_duration: *shoot_duration,
+                    recover_duration: *recover_duration,
+                    leap: *leap,
+                    projectile: projectile.clone(),
+                    projectile_body: *projectile_body,
+                    projectile_light: *projectile_light,
+                    projectile_gravity: *projectile_gravity,
+                    projectile_speed: *projectile_speed,
+                },
+                timer: Duration::default(),
+                stage_section: StageSection::Movement,
                 reps_remaining: *reps_remaining,
-                leap: *leap,
             }),
             CharacterAbility::GroundShockwave {
                 energy_cost: _,
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index a7a29cba21..2e00935896 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -325,10 +325,11 @@ impl Tool {
                 },
                 RepeaterRanged {
                     energy_cost: 450,
-                    holdable: true,
                     movement_duration: Duration::from_millis(200),
-                    prepare_duration: Duration::from_millis(50),
+                    buildup_duration: Duration::from_millis(100),
+                    shoot_duration: Duration::from_millis(100),
                     recover_duration: Duration::from_millis(500),
+                    leap: Some(10.0),
                     projectile: Projectile {
                         hit_solid: vec![projectile::Effect::Stick],
                         hit_entity: vec![
@@ -346,7 +347,6 @@ impl Tool {
                     projectile_gravity: Some(Gravity(0.2)),
                     projectile_speed: 100.0,
                     reps_remaining: 5,
-                    leap: true,
                 },
             ],
             Dagger(_) => vec![BasicMelee {
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index e151da3ca2..fcd7e5b119 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -1,7 +1,7 @@
 use crate::{
     comp::{Body, CharacterState, Gravity, LightEmitter, Projectile, StateUpdate},
     event::ServerEvent,
-    states::utils::*,
+    states::utils::{StageSection, *},
     sys::character_behavior::*,
     util::dir::*,
 };
@@ -10,26 +10,37 @@ use std::time::Duration;
 use vek::Vec3;
 
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
-pub struct Data {
-    /// How long the state is moving
+/// Separated out to condense update portions of character state
+pub struct StaticData {
+    /// How long the state is in movement
     pub movement_duration: Duration,
-    /// Can you hold the ability beyond the prepare duration
-    pub holdable: bool,
-    /// How long we have to prepare the weapon
-    pub prepare_duration: Duration,
-    /// How long we prepared the weapon already
-    pub prepare_timer: Duration,
+    /// How long we've readied the weapon
+    pub buildup_duration: Duration,
+    /// How long the state is shooting
+    pub shoot_duration: Duration,
     /// How long the state has until exiting
     pub recover_duration: Duration,
+    /// Whether there should be a jump and how strong the leap is
+    pub leap: Option<f32>,
+    /// Projectile options
     pub projectile: Projectile,
     pub projectile_body: Body,
     pub projectile_light: Option<LightEmitter>,
     pub projectile_gravity: Option<Gravity>,
     pub projectile_speed: f32,
+}
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct Data {
+    /// Struct containing data that does not change over the course of the
+    /// character state
+    pub static_data: StaticData,
+    /// Timer for each stage
+    pub timer: Duration,
+    /// What section the character stage is in
+    pub stage_section: StageSection,
     /// How many repetitions remaining
     pub reps_remaining: u32,
-    /// Whether there should be a jump
-    pub leap: bool,
 }
 
 impl CharacterBehavior for Data {
@@ -39,131 +50,154 @@ impl CharacterBehavior for Data {
         handle_move(data, &mut update, 1.0);
         handle_jump(data, &mut update);
 
-        if self.reps_remaining > 0
-            && if self.holdable {
-                data.inputs.holding_ability_key() || self.prepare_timer < self.prepare_duration
-            } else {
-                self.prepare_timer < self.prepare_duration
-            }
-        {
-            // Prepare (draw the bow)
-            update.character = CharacterState::RepeaterRanged(Data {
-                movement_duration: self.movement_duration,
-                prepare_timer: self.prepare_timer + Duration::from_secs_f32(data.dt.0),
-                holdable: self.holdable,
-                prepare_duration: self.prepare_duration,
-                recover_duration: self.recover_duration,
-                projectile: self.projectile.clone(),
-                projectile_body: self.projectile_body,
-                projectile_light: self.projectile_light,
-                projectile_gravity: self.projectile_gravity,
-                projectile_speed: self.projectile_speed,
-                reps_remaining: self.reps_remaining,
-                leap: self.leap,
-            });
-        } else if self.movement_duration != Duration::default() {
-            // Jumping
-            if self.leap {
-                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], 10.0);
-            }
+        match self.stage_section {
+            StageSection::Movement => {
+                // Jumping
+                if let Some(leap_strength) = self.static_data.leap {
+                    update.vel.0 = Vec3::new(data.vel.0.x, data.vel.0.y, leap_strength);
+                }
+                if self.timer < self.static_data.movement_duration {
+                    // Do movement
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
+                } else {
+                    // Transition to buildup
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: Duration::default(),
+                        stage_section: StageSection::Buildup,
+                        reps_remaining: self.reps_remaining,
+                    });
+                }
+            },
+            StageSection::Buildup => {
+                // Aim gliding
+                if self.static_data.leap.is_some() {
+                    update.vel.0 = Vec3::new(data.vel.0.x, data.vel.0.y, 0.0);
+                }
+                if self.timer < self.static_data.buildup_duration {
+                    // Buildup to attack
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
+                } else {
+                    // Transition to shoot
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: Duration::default(),
+                        stage_section: StageSection::Buildup,
+                        reps_remaining: self.reps_remaining,
+                    });
+                }
+            },
+            StageSection::Shoot => {
+                // Aim gliding
+                if self.static_data.leap.is_some() {
+                    update.vel.0 = Vec3::new(data.vel.0.x, data.vel.0.y, 0.0);
+                }
+                if self.reps_remaining > 0 {
+                    // Fire
+                    let mut projectile = self.static_data.projectile.clone();
+                    projectile.owner = Some(*data.uid);
+                    update.server_events.push_front(ServerEvent::Shoot {
+                        entity: data.entity,
+                        // Provides slight variation to projectile direction
+                        dir: Dir::from_unnormalized(Vec3::new(
+                            data.inputs.look_dir[0]
+                                + (if self.reps_remaining % 2 == 0 {
+                                    self.reps_remaining as f32 / 400.0
+                                } else {
+                                    -1.0 * self.reps_remaining as f32 / 400.0
+                                }),
+                            data.inputs.look_dir[1]
+                                + (if self.reps_remaining % 2 == 0 {
+                                    -1.0 * self.reps_remaining as f32 / 400.0
+                                } else {
+                                    self.reps_remaining as f32 / 400.0
+                                }),
+                            data.inputs.look_dir[2],
+                        ))
+                        .unwrap_or(data.inputs.look_dir),
+                        body: self.static_data.projectile_body,
+                        projectile,
+                        light: self.static_data.projectile_light,
+                        gravity: self.static_data.projectile_gravity,
+                        speed: self.static_data.projectile_speed,
+                    });
 
-            update.character = CharacterState::RepeaterRanged(Data {
-                movement_duration: self
-                    .movement_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                prepare_timer: self.prepare_timer,
-                holdable: self.holdable,
-                prepare_duration: self.prepare_duration,
-                recover_duration: self.recover_duration,
-                projectile: self.projectile.clone(),
-                projectile_body: self.projectile_body,
-                projectile_light: self.projectile_light,
-                projectile_gravity: self.projectile_gravity,
-                projectile_speed: self.projectile_speed,
-                reps_remaining: self.reps_remaining,
-                leap: self.leap,
-            });
-        } else if self.recover_duration != Duration::default() {
-            if self.leap {
-                // Hover
-                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], data.vel.0[2] + 0.5);
-            }
-
-            // Recovery
-            update.character = CharacterState::RepeaterRanged(Data {
-                movement_duration: Duration::default(),
-                prepare_timer: self.prepare_timer,
-                holdable: self.holdable,
-                prepare_duration: self.prepare_duration,
-                recover_duration: self
-                    .recover_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                projectile: self.projectile.clone(),
-                projectile_body: self.projectile_body,
-                projectile_light: self.projectile_light,
-                projectile_gravity: self.projectile_gravity,
-                projectile_speed: self.projectile_speed,
-                reps_remaining: self.reps_remaining,
-                leap: self.leap,
-            });
-        } else if self.reps_remaining > 0 {
-            if self.leap {
-                // Hover
-                update.vel.0 = Vec3::new(data.vel.0[0], data.vel.0[1], data.vel.0[2] + 0.5);
-            }
-
-            // Fire
-            let mut projectile = self.projectile.clone();
-            projectile.owner = Some(*data.uid);
-            update.server_events.push_front(ServerEvent::Shoot {
-                entity: data.entity,
-                dir: Dir::from_unnormalized(Vec3::new(
-                    data.inputs.look_dir[0]
-                        + (if self.reps_remaining % 2 == 0 {
-                            self.reps_remaining as f32 / 400.0
-                        } else {
-                            -1.0 * self.reps_remaining as f32 / 400.0
-                        }),
-                    data.inputs.look_dir[1]
-                        + (if self.reps_remaining % 2 == 0 {
-                            -1.0 * self.reps_remaining as f32 / 400.0
-                        } else {
-                            self.reps_remaining as f32 / 400.0
-                        }),
-                    data.inputs.look_dir[2],
-                ))
-                .expect("That didn't work"),
-                body: self.projectile_body,
-                projectile,
-                light: self.projectile_light,
-                gravity: self.projectile_gravity,
-                speed: self.projectile_speed,
-            });
-
-            update.character = CharacterState::RepeaterRanged(Data {
-                movement_duration: self.movement_duration,
-                prepare_timer: self.prepare_timer,
-                holdable: self.holdable,
-                prepare_duration: self.prepare_duration,
-                //recover_duration: self.recover_duration,
-                recover_duration: self
-                    .recover_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                projectile: self.projectile.clone(),
-                projectile_body: self.projectile_body,
-                projectile_light: self.projectile_light,
-                projectile_gravity: self.projectile_gravity,
-                projectile_speed: self.projectile_speed,
-                reps_remaining: self.reps_remaining - 1,
-                leap: self.leap,
-            });
-            return update;
-        } else {
-            // Done
-            update.character = CharacterState::Wielding;
+                    // Shoot projectiles
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining - 1,
+                    });
+                } else if self.timer < self.static_data.shoot_duration {
+                    // Finish shooting
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
+                } else {
+                    // Transition to recover
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: Duration::default(),
+                        stage_section: StageSection::Buildup,
+                        reps_remaining: self.reps_remaining,
+                    });
+                }
+            },
+            StageSection::Recover => {
+                if !data.physics.on_ground {
+                    // Lands
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self.timer,
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
+                } else if self.timer < self.static_data.recover_duration {
+                    // Recovers from attack
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
+                } else {
+                    // Done
+                    update.character = CharacterState::Wielding;
+                }
+            },
+            _ => {
+                // If it somehow ends up in an incorrect stage section
+                update.character = CharacterState::Wielding;
+            },
         }
 
         update
diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index a61e49c1ac..ffae9f9697 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -365,4 +365,6 @@ pub enum StageSection {
     Recover,
     Charge,
     Cast,
+    Shoot,
+    Movement,
 }

From 30b45fc079f04dfe2816f2ca892d35f917c0ddb2 Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Mon, 28 Sep 2020 18:55:38 -0500
Subject: [PATCH 09/23] Added keyframes to leap melee.

---
 common/src/comp/ability.rs             |  40 ++--
 common/src/comp/inventory/item/tool.rs |  18 +-
 common/src/states/leap_melee.rs        | 278 +++++++++++++++----------
 common/src/states/repeater_ranged.rs   |   5 +-
 4 files changed, 202 insertions(+), 139 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 9879bbf0de..0bfb26dfad 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -121,15 +121,16 @@ pub enum CharacterAbility {
     },
     LeapMelee {
         energy_cost: u32,
-        movement_duration: Duration,
         buildup_duration: Duration,
+        movement_duration: Duration,
+        swing_duration: Duration,
         recover_duration: Duration,
         base_damage: u32,
         range: f32,
         max_angle: f32,
         knockback: f32,
-        leap_speed: f32,
-        leap_vert_speed: f32,
+        forward_leap_strength: f32,
+        vertical_leap_strength: f32,
     },
     SpinMelee {
         buildup_duration: Duration,
@@ -464,27 +465,32 @@ impl From<&CharacterAbility> for CharacterState {
             }),
             CharacterAbility::LeapMelee {
                 energy_cost: _,
-                movement_duration,
                 buildup_duration,
+                movement_duration,
+                swing_duration,
                 recover_duration,
                 base_damage,
+                knockback,
                 range,
                 max_angle,
-                knockback,
-                leap_speed,
-                leap_vert_speed,
+                forward_leap_strength,
+                vertical_leap_strength,
             } => CharacterState::LeapMelee(leap_melee::Data {
-                initialize: true,
+                static_data: leap_melee::StaticData {
+                    buildup_duration: *buildup_duration,
+                    movement_duration: *movement_duration,
+                    swing_duration: *swing_duration,
+                    recover_duration: *recover_duration,
+                    base_damage: *base_damage,
+                    knockback: *knockback,
+                    range: *range,
+                    max_angle: *max_angle,
+                    forward_leap_strength: *forward_leap_strength,
+                    vertical_leap_strength: *vertical_leap_strength,
+                },
+                timer: Duration::default(),
+                stage_section: StageSection::Buildup,
                 exhausted: false,
-                movement_duration: *movement_duration,
-                buildup_duration: *buildup_duration,
-                recover_duration: *recover_duration,
-                base_damage: *base_damage,
-                range: *range,
-                max_angle: *max_angle,
-                knockback: *knockback,
-                leap_speed: *leap_speed,
-                leap_vert_speed: *leap_vert_speed,
             }),
             CharacterAbility::SpinMelee {
                 buildup_duration,
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 2e00935896..af9466e9b7 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -228,15 +228,16 @@ impl Tool {
                 },
                 LeapMelee {
                     energy_cost: 450,
+                    buildup_duration: Duration::from_millis(100),
                     movement_duration: Duration::from_millis(200),
-                    buildup_duration: Duration::from_millis(1000),
+                    swing_duration: Duration::from_millis(100),
                     recover_duration: Duration::from_millis(600),
                     base_damage: (160.0 * self.base_power()) as u32,
+                    knockback: 15.0,
                     range: 3.5,
                     max_angle: 100.0,
-                    knockback: 15.0,
-                    leap_speed: 16.0,
-                    leap_vert_speed: 6.0,
+                    forward_leap_strength: 16.0,
+                    vertical_leap_strength: 6.0,
                 },
             ],
             Hammer(_) => vec![
@@ -264,15 +265,16 @@ impl Tool {
                 },
                 LeapMelee {
                     energy_cost: 700,
+                    buildup_duration: Duration::from_millis(100),
                     movement_duration: Duration::from_millis(500),
-                    buildup_duration: Duration::from_millis(1000),
+                    swing_duration: Duration::from_millis(100),
                     recover_duration: Duration::from_millis(100),
                     base_damage: (240.0 * self.base_power()) as u32,
+                    knockback: 25.0,
                     range: 4.5,
                     max_angle: 360.0,
-                    knockback: 25.0,
-                    leap_speed: 24.0,
-                    leap_vert_speed: 4.0,
+                    forward_leap_strength: 24.0,
+                    vertical_leap_strength: 4.0,
                 },
             ],
             Farming(_) => vec![BasicMelee {
diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs
index 4eea14cef5..bbd844f630 100644
--- a/common/src/states/leap_melee.rs
+++ b/common/src/states/leap_melee.rs
@@ -1,146 +1,198 @@
 use crate::{
     comp::{Attacking, CharacterState, StateUpdate},
-    states::utils::*,
+    states::utils::{StageSection, *},
     sys::character_behavior::{CharacterBehavior, JoinData},
 };
 use serde::{Deserialize, Serialize};
 use std::time::Duration;
 use vek::Vec3;
 
+/// Separated out to condense update portions of character state
 #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
-//#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
-pub struct Data {
+pub struct StaticData {
     /// How long the state is moving
     pub movement_duration: Duration,
     /// How long until state should deal damage
     pub buildup_duration: Duration,
+    /// How long the weapon swings
+    pub swing_duration: Duration,
     /// How long the state has until exiting
     pub recover_duration: Duration,
     /// Base damage
     pub base_damage: u32,
-    /// Whether the attack can deal more damage
-    pub exhausted: bool,
+    /// Knockback
+    pub knockback: f32,
     /// Max range
     pub range: f32,
     /// Max angle (45.0 will give you a 90.0 angle window)
     pub max_angle: f32,
-    /// Knockback
-    pub knockback: f32,
-    /// Leap speed
-    pub leap_speed: f32,
-    /// Leap vertical speed?
-    pub leap_vert_speed: f32,
-    pub initialize: bool,
+    /// Affects how far forward the player leaps
+    pub forward_leap_strength: f32,
+    /// Affects how high the player leaps
+    pub vertical_leap_strength: f32,
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
+//#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
+pub struct Data {
+    /// Struct containing data that does not change over the course of the
+    /// character state
+    pub static_data: StaticData,
+    /// Timer for each stage
+    pub timer: Duration,
+    /// What section the character stage is in
+    pub stage_section: StageSection,
+    /// Whether the attack can deal more damage
+    pub exhausted: bool,
 }
 
 impl CharacterBehavior for Data {
     fn behavior(&self, data: &JoinData) -> StateUpdate {
         let mut update = StateUpdate::from(data);
 
-        if self.initialize {
-            update.vel.0 = *data.inputs.look_dir * 20.0;
-            if let Some(dir) = Vec3::from(data.inputs.look_dir.xy()).try_normalized() {
-                update.ori.0 = dir.into();
-            }
-        }
+        handle_move(data, &mut update, 0.3);
+        handle_jump(data, &mut update);
 
-        if self.movement_duration != Duration::default() {
-            // Jumping
-            update.vel.0 = Vec3::new(
-                data.inputs.look_dir.x,
-                data.inputs.look_dir.y,
-                self.leap_vert_speed,
-            ) * (2.0)
-                + (update.vel.0 * Vec3::new(2.0, 2.0, 0.0)
-                    + 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default())
-                .try_normalized()
-                .unwrap_or_default()
-                    * self.leap_speed
-                    * (1.0 - data.inputs.look_dir.z.abs());
+        match self.stage_section {
+            StageSection::Buildup => {
+                if self.timer < self.static_data.buildup_duration {
+                    // Buildup
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: self.exhausted,
+                    });
+                } else {
+                    // Transitions to leap portion of state
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: Duration::default(),
+                        stage_section: StageSection::Movement,
+                        exhausted: self.exhausted,
+                    });
+                }
+            },
+            StageSection::Movement => {
+                // Jumping
+                update.vel.0 = Vec3::new(
+                    data.inputs.look_dir.x,
+                    data.inputs.look_dir.y,
+                    self.static_data.vertical_leap_strength,
+                ) * 2.0
+                    * (1.0
+                        - self.timer.as_secs_f32()
+                            / self.static_data.movement_duration.as_secs_f32())
+                    + (update.vel.0 * Vec3::new(2.0, 2.0, 0.0)
+                        + 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default())
+                    .try_normalized()
+                    .unwrap_or_default()
+                        * self.static_data.forward_leap_strength
+                        * (1.0 - data.inputs.look_dir.z.abs());
 
-            update.character = CharacterState::LeapMelee(Data {
-                movement_duration: self
-                    .movement_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                buildup_duration: self.buildup_duration,
-                recover_duration: self.recover_duration,
-                base_damage: self.base_damage,
-                exhausted: false,
-                range: self.range,
-                max_angle: self.max_angle,
-                knockback: self.knockback,
-                leap_speed: self.leap_speed,
-                leap_vert_speed: self.leap_vert_speed,
-                initialize: false,
-            });
-        } else if self.buildup_duration != Duration::default() && !data.physics.on_ground {
-            // Falling
-            update.character = CharacterState::LeapMelee(Data {
-                movement_duration: Duration::default(),
-                buildup_duration: self
-                    .buildup_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                recover_duration: self.recover_duration,
-                base_damage: self.base_damage,
-                exhausted: false,
-                range: self.range,
-                max_angle: self.max_angle,
-                knockback: self.knockback,
-                leap_speed: self.leap_speed,
-                leap_vert_speed: self.leap_vert_speed,
-                initialize: false,
-            });
-        } else if !self.exhausted {
-            // Hit attempt
-            data.updater.insert(data.entity, Attacking {
-                base_damage: self.base_damage,
-                base_heal: 0,
-                range: self.range,
-                max_angle: self.max_angle.to_radians(),
-                applied: false,
-                hit_count: 0,
-                knockback: self.knockback,
-            });
+                if self.timer < self.static_data.movement_duration {
+                    // Movement duration
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: self.exhausted,
+                    });
+                } else {
+                    // Transitions to swing portion of state
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: Duration::default(),
+                        stage_section: StageSection::Swing,
+                        exhausted: self.exhausted,
+                    });
+                }
+            },
+            StageSection::Swing => {
+                if self.timer < self.static_data.swing_duration {
+                    // Swings weapons
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: self.exhausted,
+                    });
+                } else {
+                    // Transitions to recover portion
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: Duration::default(),
+                        stage_section: StageSection::Recover,
+                        exhausted: self.exhausted,
+                    });
+                }
+            },
+            StageSection::Recover => {
+                if !data.physics.on_ground {
+                    // Falls
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: self.exhausted,
+                    });
+                } else if !self.exhausted {
+                    // Hit attempt
+                    data.updater.insert(data.entity, Attacking {
+                        base_damage: self.static_data.base_damage,
+                        base_heal: 0,
+                        range: self.static_data.range,
+                        max_angle: self.static_data.max_angle.to_radians(),
+                        applied: false,
+                        hit_count: 0,
+                        knockback: self.static_data.knockback,
+                    });
 
-            update.character = CharacterState::LeapMelee(Data {
-                movement_duration: self.movement_duration,
-                buildup_duration: Duration::default(),
-                recover_duration: self.recover_duration,
-                base_damage: self.base_damage,
-                exhausted: true,
-                range: self.range,
-                max_angle: self.max_angle,
-                knockback: self.knockback,
-                leap_speed: self.leap_speed,
-                leap_vert_speed: self.leap_vert_speed,
-                initialize: false,
-            });
-        } else if self.recover_duration != Duration::default() {
-            // Recovery
-            handle_move(data, &mut update, 0.7);
-            update.character = CharacterState::LeapMelee(Data {
-                movement_duration: self.movement_duration,
-                buildup_duration: self.buildup_duration,
-                recover_duration: self
-                    .recover_duration
-                    .checked_sub(Duration::from_secs_f32(data.dt.0))
-                    .unwrap_or_default(),
-                base_damage: self.base_damage,
-                exhausted: true,
-                range: self.range,
-                max_angle: self.max_angle,
-                knockback: self.knockback,
-                leap_speed: self.leap_speed,
-                leap_vert_speed: self.leap_vert_speed,
-                initialize: false,
-            });
-        } else {
-            // Done
-            update.character = CharacterState::Wielding;
-            // Make sure attack component is removed
-            data.updater.remove::<Attacking>(data.entity);
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: true,
+                    });
+                } else if self.timer < self.static_data.recover_duration {
+                    // Recovers
+                    update.character = CharacterState::LeapMelee(Data {
+                        static_data: self.static_data,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        exhausted: self.exhausted,
+                    });
+                } else {
+                    // Done
+                    update.character = CharacterState::Wielding;
+                    // Make sure attack component is removed
+                    data.updater.remove::<Attacking>(data.entity);
+                }
+            },
+            _ => {
+                // If it somehow ends up in an incorrect stage section
+                update.character = CharacterState::Wielding;
+                // Make sure attack component is removed
+                data.updater.remove::<Attacking>(data.entity);
+            },
         }
 
         update
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index fcd7e5b119..85768cb17f 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -174,7 +174,10 @@ impl CharacterBehavior for Data {
                     // Lands
                     update.character = CharacterState::RepeaterRanged(Data {
                         static_data: self.static_data.clone(),
-                        timer: self.timer,
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
                         stage_section: self.stage_section,
                         reps_remaining: self.reps_remaining,
                     });

From 197755c2333883c6abf080ae1e4edab04b5a66ce Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Mon, 28 Sep 2020 19:38:35 -0500
Subject: [PATCH 10/23] Fixed errors from transitioning some states to
 keyframes.

---
 common/src/comp/ability.rs           | 2 +-
 common/src/states/repeater_ranged.rs | 4 ++--
 common/src/states/wielding.rs        | 1 +
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 0bfb26dfad..10b4e4a25b 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -550,7 +550,7 @@ impl From<&CharacterAbility> for CharacterState {
                     swing_duration: *swing_duration,
                     recover_duration: *recover_duration,
                 },
-                stage_section: StageSection::Buildup,
+                stage_section: StageSection::Charge,
                 timer: Duration::default(),
                 exhausted: false,
                 charge_amount: 0.0,
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index 85768cb17f..a95f860c51 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -98,7 +98,7 @@ impl CharacterBehavior for Data {
                     update.character = CharacterState::RepeaterRanged(Data {
                         static_data: self.static_data.clone(),
                         timer: Duration::default(),
-                        stage_section: StageSection::Buildup,
+                        stage_section: StageSection::Shoot,
                         reps_remaining: self.reps_remaining,
                     });
                 }
@@ -164,7 +164,7 @@ impl CharacterBehavior for Data {
                     update.character = CharacterState::RepeaterRanged(Data {
                         static_data: self.static_data.clone(),
                         timer: Duration::default(),
-                        stage_section: StageSection::Buildup,
+                        stage_section: StageSection::Recover,
                         reps_remaining: self.reps_remaining,
                     });
                 }
diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs
index f64ae9c77f..e1d5e64e97 100644
--- a/common/src/states/wielding.rs
+++ b/common/src/states/wielding.rs
@@ -18,6 +18,7 @@ impl CharacterBehavior for Data {
         handle_ability3_input(&data, &mut update);
         handle_dodge_input(&data, &mut update);
 
+
         update
     }
 

From b5d3cd09e68bf0b632d22f2b8934758dc7bd792f Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Tue, 29 Sep 2020 02:16:52 -0400
Subject: [PATCH 11/23] hammer leap melee anim

---
 common/src/comp/inventory/item/tool.rs      |  10 +-
 voxygen/src/anim/src/character/leapmelee.rs | 276 ++++++++++++++------
 voxygen/src/scene/figure/mod.rs             |  37 ++-
 3 files changed, 236 insertions(+), 87 deletions(-)

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index af9466e9b7..c47c997fa5 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -230,7 +230,7 @@ impl Tool {
                     energy_cost: 450,
                     buildup_duration: Duration::from_millis(100),
                     movement_duration: Duration::from_millis(200),
-                    swing_duration: Duration::from_millis(100),
+                    swing_duration: Duration::from_millis(300),
                     recover_duration: Duration::from_millis(600),
                     base_damage: (160.0 * self.base_power()) as u32,
                     knockback: 15.0,
@@ -264,10 +264,10 @@ impl Tool {
                     recover_duration: Duration::from_millis(500),
                 },
                 LeapMelee {
-                    energy_cost: 700,
-                    buildup_duration: Duration::from_millis(100),
+                    energy_cost: 0,
+                    buildup_duration: Duration::from_millis(200),
                     movement_duration: Duration::from_millis(500),
-                    swing_duration: Duration::from_millis(100),
+                    swing_duration: Duration::from_millis(150),
                     recover_duration: Duration::from_millis(100),
                     base_damage: (240.0 * self.base_power()) as u32,
                     knockback: 25.0,
@@ -326,7 +326,7 @@ impl Tool {
                     max_projectile_speed: 500.0,
                 },
                 RepeaterRanged {
-                    energy_cost: 450,
+                    energy_cost: 0,
                     movement_duration: Duration::from_millis(200),
                     buildup_duration: Duration::from_millis(100),
                     shoot_duration: Duration::from_millis(100),
diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index 41d0739138..e79f6c23de 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -1,13 +1,22 @@
-use super::{super::Animation, CharacterSkeleton, SkeletonAttr};
-use common::comp::item::{Hands, ToolKind};
-/* use std::f32::consts::PI; */
-use super::super::vek::*;
+use super::{
+    super::{vek::*, Animation},
+    CharacterSkeleton, SkeletonAttr,
+};
+use common::{
+    comp::item::{Hands, ToolKind},
+    states::utils::StageSection,
+};
 use std::f32::consts::PI;
-
 pub struct LeapAnimation;
 
 impl Animation for LeapAnimation {
-    type Dependency = (Option<ToolKind>, Option<ToolKind>, Vec3<f32>, f64);
+    type Dependency = (
+        Option<ToolKind>,
+        Option<ToolKind>,
+        Vec3<f32>,
+        f64,
+        Option<StageSection>,
+    );
     type Skeleton = CharacterSkeleton;
 
     #[cfg(feature = "use-dyn-lib")]
@@ -17,7 +26,7 @@ impl Animation for LeapAnimation {
     #[allow(clippy::approx_constant)] // TODO: Pending review in #587
     fn update_skeleton_inner(
         skeleton: &Self::Skeleton,
-        (active_tool_kind, second_tool_kind, _velocity, _global_time): Self::Dependency,
+        (active_tool_kind, second_tool_kind, _velocity, _global_time, stage_section): Self::Dependency,
         anim_time: f64,
         rate: &mut f32,
         skeleton_attr: &SkeletonAttr,
@@ -26,11 +35,6 @@ impl Animation for LeapAnimation {
         let mut next = (*skeleton).clone();
 
         let lab = 1.0;
-        let slowersmooth = (anim_time as f32 * lab as f32 * 4.0).sin();
-        let slower = (((1.0)
-            / (0.0001 + 0.999 * ((anim_time as f32 * lab as f32 * 4.0).sin()).powf(2.0 as f32)))
-        .sqrt())
-            * ((anim_time as f32 * lab as f32 * 4.0).sin());
 
         // Spin stuff here
         let foot = (((5.0)
@@ -45,83 +49,197 @@ impl Animation for LeapAnimation {
 
         // end spin stuff
 
+        let movement = (anim_time as f32 * 1.0).min(1.0);
+
         if let Some(ToolKind::Hammer(_)) = active_tool_kind {
             next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
-            next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+            next.l_hand.orientation = Quaternion::rotation_x(PI) * Quaternion::rotation_y(0.0);
             next.l_hand.scale = Vec3::one() * 1.08;
-            next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
-            next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+            next.r_hand.position = Vec3::new(2.0, 0.0, 0.0);
+            next.r_hand.orientation = Quaternion::rotation_x(PI) * Quaternion::rotation_y(0.0);
             next.r_hand.scale = Vec3::one() * 1.06;
             next.main.position = Vec3::new(0.0, 0.0, 0.0);
-            next.main.orientation = Quaternion::rotation_x(0.0)
-                * Quaternion::rotation_y(-1.57)
-                * Quaternion::rotation_z(1.57);
+            next.main.orientation = Quaternion::rotation_y(-1.57) * Quaternion::rotation_z(1.57);
 
-            next.head.position = Vec3::new(
-                0.0,
-                -2.0 + skeleton_attr.head.0 + slower * -1.0,
-                skeleton_attr.head.1,
-            );
-            next.head.orientation = Quaternion::rotation_z(slower * 0.05)
-                * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
-                * Quaternion::rotation_y(slower * 0.05);
-            next.head.scale = Vec3::one() * skeleton_attr.head_scale;
-
-            next.chest.position = Vec3::new(0.0, 0.0, 7.0);
-            next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
-                * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
-                * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
-
-            next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
-            next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
-                * Quaternion::rotation_x(0.0 + slower * -0.06)
-                * Quaternion::rotation_y(slower * -0.05);
-
-            next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
-            next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
-                * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
-                * Quaternion::rotation_y(slower * -0.07);
-
-            next.lantern.orientation =
-                Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
-            next.hold.scale = Vec3::one() * 0.0;
-
-            next.l_foot.position = Vec3::new(
-                -skeleton_attr.foot.0,
-                slower * 3.0 + slowersmooth * -6.0 - 2.0,
-                skeleton_attr.foot.2,
-            );
-            next.l_foot.orientation =
-                Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
-
-            next.r_foot.position = Vec3::new(
-                skeleton_attr.foot.0,
-                slower * 2.0 + slowersmooth * -4.0 - 1.0,
-                -2.0 + skeleton_attr.foot.2,
-            );
-            next.r_foot.orientation =
-                Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
-
-            next.control.scale = Vec3::one();
-            next.control.position = Vec3::new(-7.0, 7.0, 1.0);
-            next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
+            next.control.position = Vec3::new(6.0, 7.0, 1.0);
+            next.control.orientation = Quaternion::rotation_x(0.3)
                 * Quaternion::rotation_y(0.0)
-                * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
+                * Quaternion::rotation_z(0.0);
             next.control.scale = Vec3::one();
 
-            next.lantern.position = Vec3::new(
-                skeleton_attr.lantern.0,
-                skeleton_attr.lantern.1,
-                skeleton_attr.lantern.2,
-            );
-            next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-            next.glider.scale = Vec3::one() * 0.0;
-            next.l_control.scale = Vec3::one();
-            next.r_control.scale = Vec3::one();
+            next.head.position = Vec3::new(0.0, -2.0 + skeleton_attr.head.0, skeleton_attr.head.1);
 
-            next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-            next.torso.orientation = Quaternion::rotation_z(0.0);
-            next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+            if let Some(stage_section) = stage_section {
+                match stage_section {
+                    StageSection::Buildup => {
+                        next.control.position = Vec3::new(6.0, 7.0, 1.0);
+                        next.control.orientation = Quaternion::rotation_x(0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(movement * 0.5);
+                        next.chest.orientation = Quaternion::rotation_x(movement * 0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(movement * 0.5);
+
+                        next.head.orientation = Quaternion::rotation_x(0.0)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(movement * -0.4);
+                    },
+
+                    StageSection::Movement => {
+                        next.control.position = Vec3::new(
+                            6.0 + movement * -10.0,
+                            7.0 + movement * 5.0,
+                            1.0 + movement * 5.0,
+                        );
+                        next.control.orientation = Quaternion::rotation_x(0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.5 + movement * 0.5);
+                        next.chest.orientation = Quaternion::rotation_x(0.3 + movement * 0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.5 + movement * 0.2);
+                        next.head.orientation = Quaternion::rotation_x(0.0)
+                            * Quaternion::rotation_y(movement * -0.1)
+                            * Quaternion::rotation_z(-0.4 + movement * -0.2);
+
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 - 5.0,
+                            skeleton_attr.foot.2,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(-0.8);
+
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(0.9);
+                    },
+                    StageSection::Swing => {
+                        next.control.position =
+                            Vec3::new(-4.0, 12.0 + movement * 13.0, 6.0 + movement * -7.0);
+                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -3.0)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(1.0 + movement * 0.5);
+                        next.chest.orientation = Quaternion::rotation_x(0.6 + movement * -0.9)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.7 + movement * -0.7);
+                        next.head.orientation = Quaternion::rotation_x(movement * 0.2)
+                            * Quaternion::rotation_y(-0.1)
+                            * Quaternion::rotation_z(-0.6 + movement * 0.6);
+
+                        next.l_hand.position = Vec3::new(-12.0 + movement * 10.0, 0.0, 0.0);
+
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 - 5.0,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(0.9);
+
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 - 5.0,
+                            skeleton_attr.foot.2,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(-0.8);
+                    },
+                    StageSection::Recover => {
+                        next.control.position = Vec3::new(-4.0, 25.0, -1.0);
+                        next.control.orientation = Quaternion::rotation_x(-2.7)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(1.5);
+                        next.chest.orientation = Quaternion::rotation_x(-0.3 + movement * 0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.0);
+                        next.head.orientation = Quaternion::rotation_x(0.2)
+                            * Quaternion::rotation_y(-0.1)
+                            * Quaternion::rotation_z(0.0);
+
+                        next.l_hand.position = Vec3::new(-2.0, 0.0, 0.0);
+                    },
+                    _ => {},
+                }
+            }
+
+        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
+                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
+                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+                    next.l_hand.scale = Vec3::one() * 1.08;
+                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
+                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+                    next.r_hand.scale = Vec3::one() * 1.06;
+                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
+                    next.main.orientation = Quaternion::rotation_x(0.0)
+                        * Quaternion::rotation_y(-1.57)
+                        * Quaternion::rotation_z(1.57);
+
+                    next.head.position = Vec3::new(
+                        0.0,
+                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
+                        skeleton_attr.head.1,
+                    );
+                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
+                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
+                        * Quaternion::rotation_y(slower * 0.05);
+                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
+
+                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
+                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
+                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
+                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
+
+                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
+                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
+                        * Quaternion::rotation_x(0.0 + slower * -0.06)
+                        * Quaternion::rotation_y(slower * -0.05);
+
+                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
+                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_y(slower * -0.07);
+
+                    next.lantern.orientation =
+                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
+                    next.hold.scale = Vec3::one() * 0.0;
+
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0,
+                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
+                        skeleton_attr.foot.2,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0,
+                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
+                        -2.0 + skeleton_attr.foot.2,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
+
+                    next.control.scale = Vec3::one();
+                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
+                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
+                        * Quaternion::rotation_y(0.0)
+                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
+                    next.control.scale = Vec3::one();
+
+                    next.lantern.position = Vec3::new(
+                        skeleton_attr.lantern.0,
+                        skeleton_attr.lantern.1,
+                        skeleton_attr.lantern.2,
+                    );
+                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+                    next.glider.scale = Vec3::one() * 0.0;
+                    next.l_control.scale = Vec3::one();
+                    next.r_control.scale = Vec3::one();
+
+                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+                    next.torso.orientation = Quaternion::rotation_z(0.0);
+                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        */
         } else if let Some(ToolKind::Axe(_)) = active_tool_kind {
             //INTENTION: SWORD
             next.l_hand.position = Vec3::new(-0.75, -1.0, -2.5);
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index 98b9099f78..b516c56b47 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -986,11 +986,42 @@ impl FigureMgr {
                                 skeleton_attr,
                             )
                         },
-                        CharacterState::LeapMelee(_) => {
+                        CharacterState::LeapMelee(s) => {
+                            let stage_progress = match active_tool_kind {
+                                Some(ToolKind::Axe(_) | ToolKind::Hammer(_)) => {
+                                    let stage_time = s.timer.as_secs_f64();
+                                    match s.stage_section {
+                                        StageSection::Buildup => {
+                                            stage_time
+                                                / s.static_data.buildup_duration.as_secs_f64()
+                                        },
+                                        StageSection::Movement => {
+                                            stage_time
+                                                / s.static_data.movement_duration.as_secs_f64()
+                                        },
+                                        StageSection::Swing => {
+                                            stage_time / s.static_data.swing_duration.as_secs_f64()
+                                        },
+                                        StageSection::Recover => {
+                                            stage_time
+                                                / s.static_data.recover_duration.as_secs_f64()
+                                        },
+                                        _ => 0.0,
+                                    }
+                                },
+                                _ => state.state_time,
+                            };
+
                             anim::character::LeapAnimation::update_skeleton(
                                 &target_base,
-                                (active_tool_kind, second_tool_kind, vel.0, time),
-                                state.state_time,
+                                (
+                                    active_tool_kind,
+                                    second_tool_kind,
+                                    vel.0,
+                                    time,
+                                    Some(s.stage_section),
+                                ),
+                                stage_progress,
                                 &mut state_animation_rate,
                                 skeleton_attr,
                             )

From 1f02048058faed4dd1e2906f1fd52a5fcdda0470 Mon Sep 17 00:00:00 2001
From: Sam <samuelkeiffer@gmail.com>
Date: Wed, 30 Sep 2020 13:20:50 -0500
Subject: [PATCH 12/23] Slight tweaks to leap

---
 common/src/comp/inventory/item/tool.rs | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index c47c997fa5..198a294621 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -227,17 +227,17 @@ impl Tool {
                     num_spins: 1,
                 },
                 LeapMelee {
-                    energy_cost: 450,
+                    energy_cost: 600,
                     buildup_duration: Duration::from_millis(100),
-                    movement_duration: Duration::from_millis(200),
-                    swing_duration: Duration::from_millis(300),
-                    recover_duration: Duration::from_millis(600),
-                    base_damage: (160.0 * self.base_power()) as u32,
-                    knockback: 15.0,
-                    range: 3.5,
-                    max_angle: 100.0,
-                    forward_leap_strength: 16.0,
-                    vertical_leap_strength: 6.0,
+                    movement_duration: Duration::from_millis(600),
+                    swing_duration: Duration::from_millis(100),
+                    recover_duration: Duration::from_millis(100),
+                    base_damage: (240.0 * self.base_power()) as u32,
+                    knockback: 12.0,
+                    range: 4.5,
+                    max_angle: 30.0,
+                    forward_leap_strength: 20.0,
+                    vertical_leap_strength: 8.0,
                 },
             ],
             Hammer(_) => vec![
@@ -266,15 +266,15 @@ impl Tool {
                 LeapMelee {
                     energy_cost: 0,
                     buildup_duration: Duration::from_millis(200),
-                    movement_duration: Duration::from_millis(500),
+                    movement_duration: Duration::from_millis(650),
                     swing_duration: Duration::from_millis(150),
                     recover_duration: Duration::from_millis(100),
                     base_damage: (240.0 * self.base_power()) as u32,
                     knockback: 25.0,
                     range: 4.5,
                     max_angle: 360.0,
-                    forward_leap_strength: 24.0,
-                    vertical_leap_strength: 4.0,
+                    forward_leap_strength: 28.0,
+                    vertical_leap_strength: 8.0,
                 },
             ],
             Farming(_) => vec![BasicMelee {

From 46508875ea770e225a1046e4f21dd9cac053fa80 Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Sat, 3 Oct 2020 01:43:34 -0400
Subject: [PATCH 13/23] anims

---
 common/src/comp/inventory/item/tool.rs        |  12 +-
 common/src/states/utils.rs                    |   2 +-
 voxygen/src/anim/src/character/chargeswing.rs | 288 ++++++++++++++++
 voxygen/src/anim/src/character/mod.rs         |   6 +-
 voxygen/src/anim/src/character/repeater.rs    | 318 ++++++++++++++++++
 voxygen/src/scene/figure/mod.rs               | 124 ++++---
 6 files changed, 685 insertions(+), 65 deletions(-)
 create mode 100644 voxygen/src/anim/src/character/chargeswing.rs
 create mode 100644 voxygen/src/anim/src/character/repeater.rs

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 198a294621..3f63d2ac2a 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -260,8 +260,8 @@ impl Tool {
                     range: 3.5,
                     max_angle: 30.0,
                     charge_duration: Duration::from_millis(1200),
-                    swing_duration: Duration::from_millis(100),
-                    recover_duration: Duration::from_millis(500),
+                    swing_duration: Duration::from_millis(400),
+                    recover_duration: Duration::from_millis(600),
                 },
                 LeapMelee {
                     energy_cost: 0,
@@ -327,10 +327,10 @@ impl Tool {
                 },
                 RepeaterRanged {
                     energy_cost: 0,
-                    movement_duration: Duration::from_millis(200),
-                    buildup_duration: Duration::from_millis(100),
-                    shoot_duration: Duration::from_millis(100),
-                    recover_duration: Duration::from_millis(500),
+                    movement_duration: Duration::from_millis(300),
+                    buildup_duration: Duration::from_millis(200),
+                    shoot_duration: Duration::from_millis(200),
+                    recover_duration: Duration::from_millis(800),
                     leap: Some(10.0),
                     projectile: Projectile {
                         hit_solid: vec![projectile::Effect::Stick],
diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index ffae9f9697..afaf37f25d 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -107,7 +107,7 @@ pub fn forward_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32,
 
 pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) {
     // Set direction based on move direction
-    let ori_dir = if update.character.is_attack() | update.character.is_block() {
+    let ori_dir = if update.character.is_block() {
         data.inputs.look_dir.xy()
     } else if !data.inputs.move_dir.is_approx_zero() {
         data.inputs.move_dir
diff --git a/voxygen/src/anim/src/character/chargeswing.rs b/voxygen/src/anim/src/character/chargeswing.rs
new file mode 100644
index 0000000000..b995fb1496
--- /dev/null
+++ b/voxygen/src/anim/src/character/chargeswing.rs
@@ -0,0 +1,288 @@
+use super::{
+    super::{vek::*, Animation},
+    CharacterSkeleton, SkeletonAttr,
+};
+use common::{
+    comp::item::{Hands, ToolKind},
+    states::utils::StageSection,
+};
+use std::f32::consts::PI;
+pub struct ChargeswingAnimation;
+
+impl Animation for ChargeswingAnimation {
+    type Dependency = (
+        Option<ToolKind>,
+        Option<ToolKind>,
+        Vec3<f32>,
+        f64,
+        Option<StageSection>,
+    );
+    type Skeleton = CharacterSkeleton;
+
+    #[cfg(feature = "use-dyn-lib")]
+    const UPDATE_FN: &'static [u8] = b"character_chargeswing\0";
+
+    #[cfg_attr(feature = "be-dyn-lib", export_name = "character_chargeswing")]
+    #[allow(clippy::approx_constant)] // TODO: Pending review in #587
+    fn update_skeleton_inner(
+        skeleton: &Self::Skeleton,
+        (active_tool_kind, second_tool_kind, velocity, _global_time, stage_section): Self::Dependency,
+        anim_time: f64,
+        rate: &mut f32,
+        skeleton_attr: &SkeletonAttr,
+    ) -> Self::Skeleton {
+        *rate = 1.0;
+        let mut next = (*skeleton).clone();
+        let speed = Vec2::<f32>::from(velocity).magnitude();
+
+        let lab = 1.0;
+
+        // Spin stuff here
+        let foot = (((5.0)
+            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * lab as f32 * 10.32).sin());
+
+        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
+
+        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
+        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
+        let short = (((5.0)
+            / (1.5
+                + 3.5 * ((anim_time as f32 * lab as f32 * 8.0).sin()).powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * lab as f32 * 8.0).sin());
+        // end spin stuff
+
+        let movement = (anim_time as f32 * 1.0);
+        let fire = (anim_time as f32 * 18.0 * lab as f32).sin();
+
+        let foothoril = (anim_time as f32 * 8.0 * lab as f32 + PI * 1.45).sin();
+        let foothorir = (anim_time as f32 * 8.0 * lab as f32 + PI * (0.45)).sin();
+
+        let footvertl = (anim_time as f32 * 8.0 * lab as f32).sin();
+        let footvertr = (anim_time as f32 * 8.0 * lab as f32 + PI).sin();
+        let footrotl = (((1.0)
+            / (0.5
+                + (0.5)
+                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 1.4).sin())
+                        .powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * 8.0 * lab as f32 + PI * 1.4).sin());
+
+        let footrotr = (((1.0)
+            / (0.5
+                + (0.5)
+                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 0.4).sin())
+                        .powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * 8.0* lab as f32 + PI * 0.4).sin());
+        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
+                next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
+                next.l_hand.orientation =
+                    Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+                next.l_hand.scale = Vec3::one() * 1.08;
+                next.r_hand.position = Vec3::new(2.0, 0.0, 0.0);
+                next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+                next.r_hand.scale = Vec3::one() * 1.06;
+                next.main.position = Vec3::new(0.0, 0.0, 0.0);
+                next.main.orientation =
+                    Quaternion::rotation_y(-1.57) * Quaternion::rotation_z(1.57);
+
+                next.control.position = Vec3::new(6.0, 7.0, 1.0);
+                next.control.orientation = Quaternion::rotation_x(0.3)
+                    * Quaternion::rotation_y(0.0)
+                    * Quaternion::rotation_z(0.0);
+                next.control.scale = Vec3::one();
+            if let Some(stage_section) = stage_section {
+                match stage_section {
+                    StageSection::Charge => {
+                next.control.position = Vec3::new(6.0+(movement*-4.0).max(-8.0), 7.0+(movement*2.0).min(2.0), 1.0);
+                next.control.orientation = Quaternion::rotation_x(0.3)
+                    * Quaternion::rotation_y(0.0+(movement*0.7).min(0.7)+fire*0.1*(anim_time as f32).min(2.0))
+                    * Quaternion::rotation_z(0.0+(movement*0.2).min(0.5));    
+
+                next.chest.position = Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1);
+                next.chest.orientation = Quaternion::rotation_z((movement*2.0).min(PI/2.0));  
+                next.shorts.orientation = Quaternion::rotation_z((short*0.25+movement*-1.0).max(-PI/4.0));  
+
+                next.head.position = Vec3::new(0.0, skeleton_attr.head.0-2.0+(movement*2.0).min(2.0), skeleton_attr.head.1);
+
+                next.head.orientation = Quaternion::rotation_z((movement*-1.8).max(PI/-2.0));   
+        next.shorts.orientation =
+            Quaternion::rotation_z(short * 0.25);
+                    //next.l_foot.orientation =
+                        //Quaternion::rotation_x((movement*-0.2).max(-0.5))*Quaternion::rotation_z((movement*0.7).min(0.7));
+                    //next.r_foot.orientation =
+                        //Quaternion::rotation_x((movement*-0.2).max(-0.5))*Quaternion::rotation_z((movement*0.7).min(0.7)); 
+if speed > 0.5{
+
+            next.l_foot.position = Vec3::new(
+            -skeleton_attr.foot.0,
+            -1.5 + skeleton_attr.foot.1 + foothoril * -3.5-2.0,
+            2.0 + skeleton_attr.foot.2 + ((footvertl * -1.7).max(-1.0)),
+        );        
+
+        next.r_foot.position = Vec3::new(
+            skeleton_attr.foot.0,
+            -1.5 + skeleton_attr.foot.1 + foothorir * -3.5+5.0,
+            2.0 + skeleton_attr.foot.2 + ((footvertr * -1.7).max(-1.0)),
+        );
+
+        next.l_foot.orientation = Quaternion::rotation_x(-0.4 + footrotl * -0.2)
+            * Quaternion::rotation_z((movement*0.5).min(0.5));
+        next.l_foot.scale = Vec3::one();
+
+        next.r_foot.orientation = Quaternion::rotation_x(-0.4 + footrotr * -0.2)
+            * Quaternion::rotation_z((movement*0.5).min(0.5));
+}
+else{
+
+            next.l_foot.position = Vec3::new(
+            -skeleton_attr.foot.0,
+            skeleton_attr.foot.1-5.0,
+            skeleton_attr.foot.2,
+        );        
+
+        next.r_foot.position = Vec3::new(
+            skeleton_attr.foot.0,
+            skeleton_attr.foot.1+7.0,
+            skeleton_attr.foot.2,
+        );
+
+        next.l_foot.orientation = Quaternion::rotation_x(-0.2);
+
+        next.r_foot.orientation = Quaternion::rotation_x(0.2);
+
+
+};
+
+                    },
+
+                    StageSection::Swing => {
+                next.chest.orientation = Quaternion::rotation_z(-0.5);  
+                next.control.position = Vec3::new(6.0, 7.0, 1.0+3.0);
+                next.control.orientation = Quaternion::rotation_x(PI/2.0)
+                    * Quaternion::rotation_y(-1.6)
+                    * Quaternion::rotation_z(-0.1);    
+                next.head.orientation = Quaternion::rotation_z(0.4);   
+
+                    },
+                    StageSection::Recover => {
+                next.chest.orientation = Quaternion::rotation_z(-0.5+movement*0.5);  
+                next.control.position = Vec3::new(6.0, 7.0, 1.0+3.0+movement*-3.0);
+                next.control.orientation = Quaternion::rotation_x(PI/2.0)
+                    * Quaternion::rotation_y(-1.6+movement*1.6)
+                    * Quaternion::rotation_z(-0.1+movement*0.1); 
+                next.head.orientation = Quaternion::rotation_z(0.4+movement*-0.4);   
+
+                    },
+                    _ => {},
+                }
+            }
+        }
+
+        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
+                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
+                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+                    next.l_hand.scale = Vec3::one() * 1.08;
+                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
+                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+                    next.r_hand.scale = Vec3::one() * 1.06;
+                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
+                    next.main.orientation = Quaternion::rotation_x(0.0)
+                        * Quaternion::rotation_y(-1.57)
+                        * Quaternion::rotation_z(1.57);
+
+                    next.head.position = Vec3::new(
+                        0.0,
+                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
+                        skeleton_attr.head.1,
+                    );
+                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
+                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
+                        * Quaternion::rotation_y(slower * 0.05);
+                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
+
+                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
+                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
+                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
+                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
+
+                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
+                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
+                        * Quaternion::rotation_x(0.0 + slower * -0.06)
+                        * Quaternion::rotation_y(slower * -0.05);
+
+                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
+                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_y(slower * -0.07);
+
+                    next.lantern.orientation =
+                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
+                    next.hold.scale = Vec3::one() * 0.0;
+
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0,
+                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
+                        skeleton_attr.foot.2,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0,
+                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
+                        -2.0 + skeleton_attr.foot.2,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
+
+                    next.control.scale = Vec3::one();
+                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
+                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
+                        * Quaternion::rotation_y(0.0)
+                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
+                    next.control.scale = Vec3::one();
+
+                    next.lantern.position = Vec3::new(
+                        skeleton_attr.lantern.0,
+                        skeleton_attr.lantern.1,
+                        skeleton_attr.lantern.2,
+                    );
+                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+                    next.glider.scale = Vec3::one() * 0.0;
+                    next.l_control.scale = Vec3::one();
+                    next.r_control.scale = Vec3::one();
+
+                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+                    next.torso.orientation = Quaternion::rotation_z(0.0);
+                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        */
+
+
+        //next.lantern.position = Vec3::new(
+        //    skeleton_attr.lantern.0,
+        //    skeleton_attr.lantern.1,
+        //    skeleton_attr.lantern.2,
+        //);
+        //next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+        //next.glider.scale = Vec3::one() * 0.0;
+        //next.l_control.scale = Vec3::one();
+        //next.r_control.scale = Vec3::one();
+
+        next.second.scale = match (
+            active_tool_kind.map(|tk| tk.hands()),
+            second_tool_kind.map(|tk| tk.hands()),
+        ) {
+            (Some(Hands::OneHand), Some(Hands::OneHand)) => Vec3::one(),
+            (_, _) => Vec3::zero(),
+        };
+
+        //next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+        //next.torso.orientation = Quaternion::rotation_z(0.0);
+        //next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        next
+    }
+}
diff --git a/voxygen/src/anim/src/character/mod.rs b/voxygen/src/anim/src/character/mod.rs
index b6ef304af9..18751b0d62 100644
--- a/voxygen/src/anim/src/character/mod.rs
+++ b/voxygen/src/anim/src/character/mod.rs
@@ -3,6 +3,7 @@ pub mod beta;
 pub mod block;
 pub mod blockidle;
 pub mod charge;
+pub mod chargeswing;
 pub mod climb;
 pub mod dance;
 pub mod dash;
@@ -12,6 +13,7 @@ pub mod gliding;
 pub mod idle;
 pub mod jump;
 pub mod leapmelee;
+pub mod repeater;
 pub mod roll;
 pub mod run;
 pub mod shoot;
@@ -27,10 +29,10 @@ pub mod wield;
 // Reexports
 pub use self::{
     alpha::AlphaAnimation, beta::BetaAnimation, block::BlockAnimation,
-    blockidle::BlockIdleAnimation, charge::ChargeAnimation, climb::ClimbAnimation,
+    blockidle::BlockIdleAnimation, charge::ChargeAnimation, chargeswing::ChargeswingAnimation, climb::ClimbAnimation,
     dance::DanceAnimation, dash::DashAnimation, equip::EquipAnimation,
     glidewield::GlideWieldAnimation, gliding::GlidingAnimation, idle::IdleAnimation,
-    jump::JumpAnimation, leapmelee::LeapAnimation, roll::RollAnimation, run::RunAnimation,
+    jump::JumpAnimation, leapmelee::LeapAnimation, repeater::RepeaterAnimation, roll::RollAnimation, run::RunAnimation,
     shoot::ShootAnimation, sit::SitAnimation, sneak::SneakAnimation, spin::SpinAnimation,
     spinmelee::SpinMeleeAnimation, stand::StandAnimation, swim::SwimAnimation,
     swimwield::SwimWieldAnimation, wield::WieldAnimation,
diff --git a/voxygen/src/anim/src/character/repeater.rs b/voxygen/src/anim/src/character/repeater.rs
new file mode 100644
index 0000000000..22e6500ff5
--- /dev/null
+++ b/voxygen/src/anim/src/character/repeater.rs
@@ -0,0 +1,318 @@
+use super::{
+    super::{vek::*, Animation},
+    CharacterSkeleton, SkeletonAttr,
+};
+use common::{
+    comp::item::{Hands, ToolKind},
+    states::utils::StageSection,
+};
+use std::f32::consts::PI;
+pub struct RepeaterAnimation;
+
+impl Animation for RepeaterAnimation {
+    type Dependency = (
+        Option<ToolKind>,
+        Option<ToolKind>,
+        Vec3<f32>,
+        f64,
+        Option<StageSection>,
+    );
+    type Skeleton = CharacterSkeleton;
+
+    #[cfg(feature = "use-dyn-lib")]
+    const UPDATE_FN: &'static [u8] = b"character_repeater\0";
+
+    #[cfg_attr(feature = "be-dyn-lib", export_name = "character_repeater")]
+    #[allow(clippy::approx_constant)] // TODO: Pending review in #587
+    fn update_skeleton_inner(
+        skeleton: &Self::Skeleton,
+        (active_tool_kind, second_tool_kind, _velocity, _global_time, stage_section): Self::Dependency,
+        anim_time: f64,
+        rate: &mut f32,
+        skeleton_attr: &SkeletonAttr,
+    ) -> Self::Skeleton {
+        *rate = 1.0;
+        let mut next = (*skeleton).clone();
+
+        let lab = 1.0;
+
+        // Spin stuff here
+        let foot = (((5.0)
+            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
+        .sqrt())
+            * ((anim_time as f32 * lab as f32 * 10.32).sin());
+
+        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
+
+        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
+        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
+
+        // end spin stuff
+
+        let movement = (anim_time as f32 * 1.0).min(1.0);
+        let fire = (anim_time as f32 * 18.0 * lab as f32).sin();
+
+
+        if let Some(ToolKind::Bow(_)) = active_tool_kind {
+                next.l_hand.position = Vec3::new(2.0, 1.5, 0.0);
+                next.l_hand.orientation = Quaternion::rotation_x(1.20)
+                    * Quaternion::rotation_y(-0.6)
+                    * Quaternion::rotation_z(-0.3);
+                next.l_hand.scale = Vec3::one() * 1.05;
+                next.r_hand.position = Vec3::new(5.9, 4.5, -5.0);
+                next.r_hand.orientation = Quaternion::rotation_x(1.20)
+                    * Quaternion::rotation_y(-0.6)
+                    * Quaternion::rotation_z(-0.3);
+                next.r_hand.scale = Vec3::one() * 1.05;
+                next.main.position = Vec3::new(3.0, 2.0, -13.0);
+                next.main.orientation = Quaternion::rotation_x(-0.3)
+                    * Quaternion::rotation_y(0.3)
+                    * Quaternion::rotation_z(-0.6);
+
+                next.hold.position = Vec3::new(1.2, -1.0, -5.2);
+                next.hold.orientation = Quaternion::rotation_x(-1.7)
+                    * Quaternion::rotation_y(0.0)
+                    * Quaternion::rotation_z(-0.1);
+                next.hold.scale = Vec3::one() * 1.0;
+
+                next.control.position = Vec3::new(-7.0, 6.0, 6.0);
+                next.control.orientation =
+                    Quaternion::rotation_x(0.0) * Quaternion::rotation_z(0.0);
+                next.control.scale = Vec3::one();
+            if let Some(stage_section) = stage_section {
+                match stage_section {
+                    StageSection::Movement => {
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0+movement*-1.5-1.5,
+                        skeleton_attr.foot.1+movement*4.0+4.0,
+                        skeleton_attr.foot.2+movement*2.5+2.5,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(movement*0.75+0.75)*Quaternion::rotation_z(movement*0.3+0.3);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0+movement*1.5+1.5,
+                        skeleton_attr.foot.1+movement*4.0+4.0,
+                        skeleton_attr.foot.2+movement*2.5+2.5,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(movement*0.75+0.75)*Quaternion::rotation_z(movement*-0.3-0.3);
+                    next.shorts.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.shorts.0+movement*4.0,
+                        skeleton_attr.shorts.1+movement*1.0,
+                    );
+                    next.shorts.orientation =
+                        Quaternion::rotation_x(movement*0.6);
+                    next.belt.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.belt.0+movement*2.0,
+                        skeleton_attr.belt.1,
+                    );
+                    next.belt.orientation =
+                        Quaternion::rotation_x(movement*0.2);
+                next.control.position = Vec3::new(-7.0+movement*5.0, 6.0+movement*3.0, 6.0+movement*1.0);
+                next.control.orientation =
+                    Quaternion::rotation_x(movement*0.4)*Quaternion::rotation_y(movement*0.8);
+                next.head.orientation =
+                    Quaternion::rotation_y(movement*0.15);
+                    next.torso.orientation =
+                        Quaternion::rotation_x(movement*0.1)
+                    },
+
+                    StageSection::Buildup => {
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0-3.0,
+                        skeleton_attr.foot.1+8.0,
+                        skeleton_attr.foot.2+5.0,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(1.5+movement*-0.2)*Quaternion::rotation_z(0.6);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0+3.0,
+                        skeleton_attr.foot.1+8.0,
+                        skeleton_attr.foot.2+5.0,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(1.5+movement*-0.2)*Quaternion::rotation_z(-0.6);
+                    next.shorts.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.shorts.0+4.0,
+                        skeleton_attr.shorts.1+1.0,
+                    );
+                    next.shorts.orientation =
+                        Quaternion::rotation_x(0.6);
+                    next.belt.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.belt.0+2.0,
+                        skeleton_attr.belt.1,
+                    );
+                    next.belt.orientation =
+                        Quaternion::rotation_x(0.2);
+                next.control.position = Vec3::new(-2.0, 9.0, 7.0);
+                next.control.orientation =
+                    Quaternion::rotation_x(0.4)*Quaternion::rotation_y(0.8);
+                next.head.orientation =
+                    Quaternion::rotation_y(0.15+movement*0.05);
+                    next.torso.orientation =
+                        Quaternion::rotation_x(0.1+movement*0.1);
+                    },
+
+                    StageSection::Shoot => {
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0-3.0,
+                        skeleton_attr.foot.1+8.0,
+                        skeleton_attr.foot.2+5.0,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(1.3)*Quaternion::rotation_z(0.6);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0+3.0,
+                        skeleton_attr.foot.1+8.0,
+                        skeleton_attr.foot.2+5.0,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(1.3)*Quaternion::rotation_z(-0.6);
+                    next.shorts.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.shorts.0+4.0,
+                        skeleton_attr.shorts.1+1.0,
+                    );
+                    next.shorts.orientation =
+                        Quaternion::rotation_x(0.6);
+                    next.belt.position = Vec3::new(
+                        0.0,
+                        skeleton_attr.belt.0+2.0,
+                        skeleton_attr.belt.1,
+                    );
+                    next.belt.orientation =
+                        Quaternion::rotation_x(0.2);
+                next.control.position = Vec3::new(-2.0, 9.0, 7.0);
+                next.control.orientation =
+                    Quaternion::rotation_x(0.4)*Quaternion::rotation_y(0.8);
+                next.head.orientation =
+                    Quaternion::rotation_y(0.2);
+                    next.torso.orientation =
+                        Quaternion::rotation_x(0.2+movement*0.15);
+
+
+                next.l_hand.position = Vec3::new(2.0+fire*-6.0-3.0, 1.5+fire*-6.0-3.0, 0.0);
+                next.l_hand.orientation = Quaternion::rotation_x(1.20)
+                    * Quaternion::rotation_y(-0.6)
+                    * Quaternion::rotation_z(-0.3);
+                next.hold.scale = Vec3::one() * 0.0;
+
+                    },
+                    StageSection::Recover => {
+                    },
+                    _ => {},
+                }
+            }
+        }
+
+        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
+                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
+                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+                    next.l_hand.scale = Vec3::one() * 1.08;
+                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
+                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+                    next.r_hand.scale = Vec3::one() * 1.06;
+                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
+                    next.main.orientation = Quaternion::rotation_x(0.0)
+                        * Quaternion::rotation_y(-1.57)
+                        * Quaternion::rotation_z(1.57);
+
+                    next.head.position = Vec3::new(
+                        0.0,
+                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
+                        skeleton_attr.head.1,
+                    );
+                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
+                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
+                        * Quaternion::rotation_y(slower * 0.05);
+                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
+
+                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
+                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
+                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
+                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
+
+                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
+                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
+                        * Quaternion::rotation_x(0.0 + slower * -0.06)
+                        * Quaternion::rotation_y(slower * -0.05);
+
+                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
+                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
+                        * Quaternion::rotation_y(slower * -0.07);
+
+                    next.lantern.orientation =
+                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
+                    next.hold.scale = Vec3::one() * 0.0;
+
+                    next.l_foot.position = Vec3::new(
+                        -skeleton_attr.foot.0,
+                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
+                        skeleton_attr.foot.2,
+                    );
+                    next.l_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
+
+                    next.r_foot.position = Vec3::new(
+                        skeleton_attr.foot.0,
+                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
+                        -2.0 + skeleton_attr.foot.2,
+                    );
+                    next.r_foot.orientation =
+                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
+
+                    next.control.scale = Vec3::one();
+                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
+                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
+                        * Quaternion::rotation_y(0.0)
+                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
+                    next.control.scale = Vec3::one();
+
+                    next.lantern.position = Vec3::new(
+                        skeleton_attr.lantern.0,
+                        skeleton_attr.lantern.1,
+                        skeleton_attr.lantern.2,
+                    );
+                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+                    next.glider.scale = Vec3::one() * 0.0;
+                    next.l_control.scale = Vec3::one();
+                    next.r_control.scale = Vec3::one();
+
+                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+                    next.torso.orientation = Quaternion::rotation_z(0.0);
+                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        */
+
+
+        //next.lantern.position = Vec3::new(
+        //    skeleton_attr.lantern.0,
+        //    skeleton_attr.lantern.1,
+        //    skeleton_attr.lantern.2,
+        //);
+        //next.glider.position = Vec3::new(0.0, 0.0, 10.0);
+        //next.glider.scale = Vec3::one() * 0.0;
+        //next.l_control.scale = Vec3::one();
+        //next.r_control.scale = Vec3::one();
+
+        next.second.scale = match (
+            active_tool_kind.map(|tk| tk.hands()),
+            second_tool_kind.map(|tk| tk.hands()),
+        ) {
+            (Some(Hands::OneHand), Some(Hands::OneHand)) => Vec3::one(),
+            (_, _) => Vec3::zero(),
+        };
+
+        //next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+        //next.torso.orientation = Quaternion::rotation_z(0.0);
+        //next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+        next
+    }
+}
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index b516c56b47..062a977092 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -848,37 +848,38 @@ impl FigureMgr {
                                 )
                             }
                         },
-                        CharacterState::ChargedMelee(data) => {
-                            if data.exhausted {
-                                anim::character::AlphaAnimation::update_skeleton(
-                                    &target_base,
-                                    (
-                                        active_tool_kind,
-                                        second_tool_kind,
-                                        vel.0.magnitude(),
-                                        time,
-                                        None,
-                                    ),
-                                    state.state_time,
-                                    &mut state_animation_rate,
-                                    skeleton_attr,
-                                )
-                            } else {
-                                anim::character::ChargeAnimation::update_skeleton(
-                                    &target_base,
-                                    (
-                                        active_tool_kind,
-                                        second_tool_kind,
-                                        vel.0.magnitude(),
-                                        ori,
-                                        state.last_ori,
-                                        time,
-                                    ),
-                                    state.state_time,
-                                    &mut state_animation_rate,
-                                    skeleton_attr,
-                                )
-                            }
+                        CharacterState::ChargedMelee(s) => {
+                            let stage_time = s.timer.as_secs_f64();
+
+                            let stage_progress = match s.stage_section {
+                                        StageSection::Charge => {
+                                            stage_time
+                                                / s.static_data.charge_duration.as_secs_f64()
+                                        },
+                                        StageSection::Swing => {
+                                            stage_time
+                                                / s.static_data.swing_duration.as_secs_f64()
+                                        },
+                                        StageSection::Recover => {
+                                            stage_time / s.static_data.recover_duration.as_secs_f64()
+                                        },
+                                        _ => 0.0,
+                                _ => state.state_time,
+                            };
+
+                            anim::character::ChargeswingAnimation::update_skeleton(
+                                &target_base,
+                                (
+                                    active_tool_kind,
+                                    second_tool_kind,
+                                    vel.0,
+                                    time,
+                                    Some(s.stage_section),
+                                ),
+                                stage_progress,
+                                &mut state_animation_rate,
+                                skeleton_attr,
+                            )
                         },
                         CharacterState::ChargedRanged(data) => {
                             if data.exhausted {
@@ -906,31 +907,42 @@ impl FigureMgr {
                                 )
                             }
                         },
-                        CharacterState::RepeaterRanged(data) => {
-                            if data.reps_remaining > 0 {
-                                anim::character::ShootAnimation::update_skeleton(
-                                    &target_base,
-                                    (active_tool_kind, second_tool_kind, vel.0.magnitude(), time),
-                                    state.state_time,
-                                    &mut state_animation_rate,
-                                    skeleton_attr,
-                                )
-                            } else {
-                                anim::character::ChargeAnimation::update_skeleton(
-                                    &target_base,
-                                    (
-                                        active_tool_kind,
-                                        second_tool_kind,
-                                        vel.0.magnitude(),
-                                        ori,
-                                        state.last_ori,
-                                        time,
-                                    ),
-                                    state.state_time,
-                                    &mut state_animation_rate,
-                                    skeleton_attr,
-                                )
-                            }
+                        CharacterState::RepeaterRanged(s) => {
+                            let stage_time = s.timer.as_secs_f64();
+
+                            let stage_progress = match s.stage_section {
+                                        StageSection::Buildup => {
+                                            stage_time
+                                                / s.static_data.buildup_duration.as_secs_f64()
+                                        },
+                                        StageSection::Movement => {
+                                            stage_time
+                                                / s.static_data.movement_duration.as_secs_f64()
+                                        },
+                                        StageSection::Shoot => {
+                                            stage_time / s.static_data.shoot_duration.as_secs_f64()
+                                        },
+                                        StageSection::Recover => {
+                                            stage_time
+                                                / s.static_data.recover_duration.as_secs_f64()
+                                        },
+                                        _ => 0.0,
+                                _ => state.state_time,
+                            };
+
+                            anim::character::RepeaterAnimation::update_skeleton(
+                                &target_base,
+                                (
+                                    active_tool_kind,
+                                    second_tool_kind,
+                                    vel.0,
+                                    time,
+                                    Some(s.stage_section),
+                                ),
+                                stage_progress,
+                                &mut state_animation_rate,
+                                skeleton_attr,
+                            )
                         },
                         CharacterState::Sneak { .. } => {
                             anim::character::SneakAnimation::update_skeleton(

From 296037d2342ccdaec0fe98c02bd495840c0b8288 Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Sat, 3 Oct 2020 02:19:43 -0400
Subject: [PATCH 14/23] cleanup

---
 common/src/states/utils.rs                    |   2 +-
 voxygen/src/anim/src/character/chargeswing.rs | 281 +++++---------
 voxygen/src/anim/src/character/leapmelee.rs   |  79 ----
 voxygen/src/anim/src/character/mod.rs         |  13 +-
 voxygen/src/anim/src/character/repeater.rs    | 360 ++++++------------
 voxygen/src/scene/figure/mod.rs               |  53 ++-
 6 files changed, 245 insertions(+), 543 deletions(-)

diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index afaf37f25d..ffae9f9697 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -107,7 +107,7 @@ pub fn forward_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32,
 
 pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) {
     // Set direction based on move direction
-    let ori_dir = if update.character.is_block() {
+    let ori_dir = if update.character.is_attack() | update.character.is_block() {
         data.inputs.look_dir.xy()
     } else if !data.inputs.move_dir.is_approx_zero() {
         data.inputs.move_dir
diff --git a/voxygen/src/anim/src/character/chargeswing.rs b/voxygen/src/anim/src/character/chargeswing.rs
index b995fb1496..ce7d30cdd6 100644
--- a/voxygen/src/anim/src/character/chargeswing.rs
+++ b/voxygen/src/anim/src/character/chargeswing.rs
@@ -37,24 +37,13 @@ impl Animation for ChargeswingAnimation {
 
         let lab = 1.0;
 
-        // Spin stuff here
-        let foot = (((5.0)
-            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
-        .sqrt())
-            * ((anim_time as f32 * lab as f32 * 10.32).sin());
-
-        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
-
-        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
-        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
         let short = (((5.0)
-            / (1.5
-                + 3.5 * ((anim_time as f32 * lab as f32 * 8.0).sin()).powf(2.0 as f32)))
+            / (1.5 + 3.5 * ((anim_time as f32 * lab as f32 * 8.0).sin()).powf(2.0 as f32)))
         .sqrt())
             * ((anim_time as f32 * lab as f32 * 8.0).sin());
         // end spin stuff
 
-        let movement = (anim_time as f32 * 1.0);
+        let movement = anim_time as f32 * 1.0;
         let fire = (anim_time as f32 * 18.0 * lab as f32).sin();
 
         let foothoril = (anim_time as f32 * 8.0 * lab as f32 + PI * 1.45).sin();
@@ -65,213 +54,131 @@ impl Animation for ChargeswingAnimation {
         let footrotl = (((1.0)
             / (0.5
                 + (0.5)
-                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 1.4).sin())
-                        .powf(2.0 as f32)))
+                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 1.4).sin()).powf(2.0 as f32)))
         .sqrt())
             * ((anim_time as f32 * 8.0 * lab as f32 + PI * 1.4).sin());
 
         let footrotr = (((1.0)
             / (0.5
                 + (0.5)
-                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 0.4).sin())
-                        .powf(2.0 as f32)))
+                    * ((anim_time as f32 * 8.0 * lab as f32 + PI * 0.4).sin()).powf(2.0 as f32)))
         .sqrt())
-            * ((anim_time as f32 * 8.0* lab as f32 + PI * 0.4).sin());
+            * ((anim_time as f32 * 8.0 * lab as f32 + PI * 0.4).sin());
         if let Some(ToolKind::Hammer(_)) = active_tool_kind {
-                next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
-                next.l_hand.orientation =
-                    Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
-                next.l_hand.scale = Vec3::one() * 1.08;
-                next.r_hand.position = Vec3::new(2.0, 0.0, 0.0);
-                next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
-                next.r_hand.scale = Vec3::one() * 1.06;
-                next.main.position = Vec3::new(0.0, 0.0, 0.0);
-                next.main.orientation =
-                    Quaternion::rotation_y(-1.57) * Quaternion::rotation_z(1.57);
+            next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
+            next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
+            next.l_hand.scale = Vec3::one() * 1.08;
+            next.r_hand.position = Vec3::new(2.0, 0.0, 0.0);
+            next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
+            next.r_hand.scale = Vec3::one() * 1.06;
+            next.main.position = Vec3::new(0.0, 0.0, 0.0);
+            next.main.orientation = Quaternion::rotation_y(-1.57) * Quaternion::rotation_z(1.57);
 
-                next.control.position = Vec3::new(6.0, 7.0, 1.0);
-                next.control.orientation = Quaternion::rotation_x(0.3)
-                    * Quaternion::rotation_y(0.0)
-                    * Quaternion::rotation_z(0.0);
-                next.control.scale = Vec3::one();
+            next.control.position = Vec3::new(6.0, 7.0, 1.0);
+            next.control.orientation = Quaternion::rotation_x(0.3)
+                * Quaternion::rotation_y(0.0)
+                * Quaternion::rotation_z(0.0);
+            next.control.scale = Vec3::one();
             if let Some(stage_section) = stage_section {
                 match stage_section {
                     StageSection::Charge => {
-                next.control.position = Vec3::new(6.0+(movement*-4.0).max(-8.0), 7.0+(movement*2.0).min(2.0), 1.0);
-                next.control.orientation = Quaternion::rotation_x(0.3)
-                    * Quaternion::rotation_y(0.0+(movement*0.7).min(0.7)+fire*0.1*(anim_time as f32).min(2.0))
-                    * Quaternion::rotation_z(0.0+(movement*0.2).min(0.5));    
+                        next.control.position = Vec3::new(
+                            6.0 + (movement * -4.0).max(-8.0),
+                            7.0 + (movement * 2.0).min(2.0),
+                            1.0,
+                        );
+                        next.control.orientation = Quaternion::rotation_x(0.3)
+                            * Quaternion::rotation_y(
+                                0.0 + (movement * 0.7).min(0.7)
+                                    + fire * 0.1 * (anim_time as f32).min(2.0),
+                            )
+                            * Quaternion::rotation_z(0.0 + (movement * 0.2).min(0.5));
 
-                next.chest.position = Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1);
-                next.chest.orientation = Quaternion::rotation_z((movement*2.0).min(PI/2.0));  
-                next.shorts.orientation = Quaternion::rotation_z((short*0.25+movement*-1.0).max(-PI/4.0));  
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1);
+                        next.chest.orientation =
+                            Quaternion::rotation_z((movement * 2.0).min(PI / 2.0));
+                        next.belt.orientation =
+                            Quaternion::rotation_z((short * 0.08 + movement * -1.0).max(-PI / 5.0));
+                        next.shorts.orientation =
+                            Quaternion::rotation_z((short * 0.15 + movement * -1.0).max(-PI / 4.0));
 
-                next.head.position = Vec3::new(0.0, skeleton_attr.head.0-2.0+(movement*2.0).min(2.0), skeleton_attr.head.1);
+                        next.head.position = Vec3::new(
+                            0.0,
+                            skeleton_attr.head.0 - 2.0 + (movement * 2.0).min(2.0),
+                            skeleton_attr.head.1,
+                        );
 
-                next.head.orientation = Quaternion::rotation_z((movement*-1.8).max(PI/-2.0));   
-        next.shorts.orientation =
-            Quaternion::rotation_z(short * 0.25);
-                    //next.l_foot.orientation =
-                        //Quaternion::rotation_x((movement*-0.2).max(-0.5))*Quaternion::rotation_z((movement*0.7).min(0.7));
-                    //next.r_foot.orientation =
-                        //Quaternion::rotation_x((movement*-0.2).max(-0.5))*Quaternion::rotation_z((movement*0.7).min(0.7)); 
-if speed > 0.5{
+                        next.head.orientation =
+                            Quaternion::rotation_z((movement * -1.8).max(PI / -2.0));
+                        next.belt.orientation = Quaternion::rotation_z(short * 0.05);
 
-            next.l_foot.position = Vec3::new(
-            -skeleton_attr.foot.0,
-            -1.5 + skeleton_attr.foot.1 + foothoril * -3.5-2.0,
-            2.0 + skeleton_attr.foot.2 + ((footvertl * -1.7).max(-1.0)),
-        );        
+                        next.shorts.orientation = Quaternion::rotation_z(short * 0.15);
+                        if speed > 0.5 {
+                            next.l_foot.position = Vec3::new(
+                                -skeleton_attr.foot.0,
+                                skeleton_attr.foot.1 + foothoril * -2.5 - 3.5,
+                                2.0 + skeleton_attr.foot.2 + ((footvertl * -1.2).max(-1.0)),
+                            );
 
-        next.r_foot.position = Vec3::new(
-            skeleton_attr.foot.0,
-            -1.5 + skeleton_attr.foot.1 + foothorir * -3.5+5.0,
-            2.0 + skeleton_attr.foot.2 + ((footvertr * -1.7).max(-1.0)),
-        );
+                            next.r_foot.position = Vec3::new(
+                                skeleton_attr.foot.0,
+                                skeleton_attr.foot.1 + foothorir * -2.5 + 6.0,
+                                2.0 + skeleton_attr.foot.2 + ((footvertr * -1.2).max(-1.0)),
+                            );
 
-        next.l_foot.orientation = Quaternion::rotation_x(-0.4 + footrotl * -0.2)
-            * Quaternion::rotation_z((movement*0.5).min(0.5));
-        next.l_foot.scale = Vec3::one();
+                            next.l_foot.orientation =
+                                Quaternion::rotation_x(-0.4 + footrotl * -0.2)
+                                    * Quaternion::rotation_z((movement * 0.5).min(0.5));
+                            next.l_foot.scale = Vec3::one();
 
-        next.r_foot.orientation = Quaternion::rotation_x(-0.4 + footrotr * -0.2)
-            * Quaternion::rotation_z((movement*0.5).min(0.5));
-}
-else{
+                            next.r_foot.orientation =
+                                Quaternion::rotation_x(-0.4 + footrotr * -0.2)
+                                    * Quaternion::rotation_z((movement * 0.5).min(0.5));
+                        } else {
+                            next.l_foot.position = Vec3::new(
+                                -skeleton_attr.foot.0,
+                                skeleton_attr.foot.1 - 5.0,
+                                skeleton_attr.foot.2,
+                            );
 
-            next.l_foot.position = Vec3::new(
-            -skeleton_attr.foot.0,
-            skeleton_attr.foot.1-5.0,
-            skeleton_attr.foot.2,
-        );        
+                            next.r_foot.position = Vec3::new(
+                                skeleton_attr.foot.0,
+                                skeleton_attr.foot.1 + 7.0,
+                                skeleton_attr.foot.2,
+                            );
 
-        next.r_foot.position = Vec3::new(
-            skeleton_attr.foot.0,
-            skeleton_attr.foot.1+7.0,
-            skeleton_attr.foot.2,
-        );
-
-        next.l_foot.orientation = Quaternion::rotation_x(-0.2);
-
-        next.r_foot.orientation = Quaternion::rotation_x(0.2);
-
-
-};
+                            next.l_foot.orientation =
+                                Quaternion::rotation_x(-0.2) * Quaternion::rotation_z(0.5);
 
+                            next.r_foot.orientation =
+                                Quaternion::rotation_x(0.2) * Quaternion::rotation_z(0.5);
+                        };
                     },
 
                     StageSection::Swing => {
-                next.chest.orientation = Quaternion::rotation_z(-0.5);  
-                next.control.position = Vec3::new(6.0, 7.0, 1.0+3.0);
-                next.control.orientation = Quaternion::rotation_x(PI/2.0)
-                    * Quaternion::rotation_y(-1.6)
-                    * Quaternion::rotation_z(-0.1);    
-                next.head.orientation = Quaternion::rotation_z(0.4);   
-
+                        next.chest.orientation = Quaternion::rotation_z(-0.5);
+                        next.control.position = Vec3::new(6.0, 7.0, 1.0 + 3.0);
+                        next.control.orientation = Quaternion::rotation_x(PI / 2.0)
+                            * Quaternion::rotation_y(-1.6)
+                            * Quaternion::rotation_z(-0.1);
+                        next.head.orientation = Quaternion::rotation_z(0.8);
+                        next.l_hand.position = Vec3::new(-3.0, 0.0, 0.0);
                     },
                     StageSection::Recover => {
-                next.chest.orientation = Quaternion::rotation_z(-0.5+movement*0.5);  
-                next.control.position = Vec3::new(6.0, 7.0, 1.0+3.0+movement*-3.0);
-                next.control.orientation = Quaternion::rotation_x(PI/2.0)
-                    * Quaternion::rotation_y(-1.6+movement*1.6)
-                    * Quaternion::rotation_z(-0.1+movement*0.1); 
-                next.head.orientation = Quaternion::rotation_z(0.4+movement*-0.4);   
-
+                        next.chest.orientation = Quaternion::rotation_z(-0.5 + movement * 0.5);
+                        next.control.position = Vec3::new(6.0, 7.0, 1.0 + 3.0 + movement * -3.0);
+                        next.control.orientation = Quaternion::rotation_x(PI / 2.0)
+                            * Quaternion::rotation_y(-1.6 + movement * 1.6)
+                            * Quaternion::rotation_z(-0.1 + movement * 0.1);
+                        next.head.orientation = Quaternion::rotation_z(0.8 + movement * -0.8);
+                        next.l_hand.position = Vec3::new(-3.0 + movement * -9.0, 0.0, 0.0);
                     },
                     _ => {},
                 }
             }
         }
 
-        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
-                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
-                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
-                    next.l_hand.scale = Vec3::one() * 1.08;
-                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
-                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
-                    next.r_hand.scale = Vec3::one() * 1.06;
-                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
-                    next.main.orientation = Quaternion::rotation_x(0.0)
-                        * Quaternion::rotation_y(-1.57)
-                        * Quaternion::rotation_z(1.57);
-
-                    next.head.position = Vec3::new(
-                        0.0,
-                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
-                        skeleton_attr.head.1,
-                    );
-                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
-                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
-                        * Quaternion::rotation_y(slower * 0.05);
-                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
-
-                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
-                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
-                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
-                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
-
-                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
-                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
-                        * Quaternion::rotation_x(0.0 + slower * -0.06)
-                        * Quaternion::rotation_y(slower * -0.05);
-
-                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
-                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_y(slower * -0.07);
-
-                    next.lantern.orientation =
-                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
-                    next.hold.scale = Vec3::one() * 0.0;
-
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0,
-                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
-                        skeleton_attr.foot.2,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
-
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0,
-                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
-                        -2.0 + skeleton_attr.foot.2,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
-
-                    next.control.scale = Vec3::one();
-                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
-                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
-                        * Quaternion::rotation_y(0.0)
-                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
-                    next.control.scale = Vec3::one();
-
-                    next.lantern.position = Vec3::new(
-                        skeleton_attr.lantern.0,
-                        skeleton_attr.lantern.1,
-                        skeleton_attr.lantern.2,
-                    );
-                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-                    next.glider.scale = Vec3::one() * 0.0;
-                    next.l_control.scale = Vec3::one();
-                    next.r_control.scale = Vec3::one();
-
-                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-                    next.torso.orientation = Quaternion::rotation_z(0.0);
-                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
-        */
-
-
-        //next.lantern.position = Vec3::new(
-        //    skeleton_attr.lantern.0,
-        //    skeleton_attr.lantern.1,
-        //    skeleton_attr.lantern.2,
-        //);
-        //next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-        //next.glider.scale = Vec3::one() * 0.0;
-        //next.l_control.scale = Vec3::one();
-        //next.r_control.scale = Vec3::one();
-
         next.second.scale = match (
             active_tool_kind.map(|tk| tk.hands()),
             second_tool_kind.map(|tk| tk.hands()),
diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index e79f6c23de..1c3a90efe3 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -161,85 +161,6 @@ impl Animation for LeapAnimation {
                     _ => {},
                 }
             }
-
-        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
-                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
-                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
-                    next.l_hand.scale = Vec3::one() * 1.08;
-                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
-                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
-                    next.r_hand.scale = Vec3::one() * 1.06;
-                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
-                    next.main.orientation = Quaternion::rotation_x(0.0)
-                        * Quaternion::rotation_y(-1.57)
-                        * Quaternion::rotation_z(1.57);
-
-                    next.head.position = Vec3::new(
-                        0.0,
-                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
-                        skeleton_attr.head.1,
-                    );
-                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
-                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
-                        * Quaternion::rotation_y(slower * 0.05);
-                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
-
-                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
-                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
-                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
-                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
-
-                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
-                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
-                        * Quaternion::rotation_x(0.0 + slower * -0.06)
-                        * Quaternion::rotation_y(slower * -0.05);
-
-                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
-                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_y(slower * -0.07);
-
-                    next.lantern.orientation =
-                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
-                    next.hold.scale = Vec3::one() * 0.0;
-
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0,
-                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
-                        skeleton_attr.foot.2,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
-
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0,
-                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
-                        -2.0 + skeleton_attr.foot.2,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
-
-                    next.control.scale = Vec3::one();
-                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
-                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
-                        * Quaternion::rotation_y(0.0)
-                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
-                    next.control.scale = Vec3::one();
-
-                    next.lantern.position = Vec3::new(
-                        skeleton_attr.lantern.0,
-                        skeleton_attr.lantern.1,
-                        skeleton_attr.lantern.2,
-                    );
-                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-                    next.glider.scale = Vec3::one() * 0.0;
-                    next.l_control.scale = Vec3::one();
-                    next.r_control.scale = Vec3::one();
-
-                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-                    next.torso.orientation = Quaternion::rotation_z(0.0);
-                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
-        */
         } else if let Some(ToolKind::Axe(_)) = active_tool_kind {
             //INTENTION: SWORD
             next.l_hand.position = Vec3::new(-0.75, -1.0, -2.5);
diff --git a/voxygen/src/anim/src/character/mod.rs b/voxygen/src/anim/src/character/mod.rs
index 18751b0d62..e10c3aeb4e 100644
--- a/voxygen/src/anim/src/character/mod.rs
+++ b/voxygen/src/anim/src/character/mod.rs
@@ -29,13 +29,14 @@ pub mod wield;
 // Reexports
 pub use self::{
     alpha::AlphaAnimation, beta::BetaAnimation, block::BlockAnimation,
-    blockidle::BlockIdleAnimation, charge::ChargeAnimation, chargeswing::ChargeswingAnimation, climb::ClimbAnimation,
-    dance::DanceAnimation, dash::DashAnimation, equip::EquipAnimation,
+    blockidle::BlockIdleAnimation, charge::ChargeAnimation, chargeswing::ChargeswingAnimation,
+    climb::ClimbAnimation, dance::DanceAnimation, dash::DashAnimation, equip::EquipAnimation,
     glidewield::GlideWieldAnimation, gliding::GlidingAnimation, idle::IdleAnimation,
-    jump::JumpAnimation, leapmelee::LeapAnimation, repeater::RepeaterAnimation, roll::RollAnimation, run::RunAnimation,
-    shoot::ShootAnimation, sit::SitAnimation, sneak::SneakAnimation, spin::SpinAnimation,
-    spinmelee::SpinMeleeAnimation, stand::StandAnimation, swim::SwimAnimation,
-    swimwield::SwimWieldAnimation, wield::WieldAnimation,
+    jump::JumpAnimation, leapmelee::LeapAnimation, repeater::RepeaterAnimation,
+    roll::RollAnimation, run::RunAnimation, shoot::ShootAnimation, sit::SitAnimation,
+    sneak::SneakAnimation, spin::SpinAnimation, spinmelee::SpinMeleeAnimation,
+    stand::StandAnimation, swim::SwimAnimation, swimwield::SwimWieldAnimation,
+    wield::WieldAnimation,
 };
 
 use super::{make_bone, vek::*, FigureBoneData, Skeleton};
diff --git a/voxygen/src/anim/src/character/repeater.rs b/voxygen/src/anim/src/character/repeater.rs
index 22e6500ff5..227e5610ee 100644
--- a/voxygen/src/anim/src/character/repeater.rs
+++ b/voxygen/src/anim/src/character/repeater.rs
@@ -6,7 +6,6 @@ use common::{
     comp::item::{Hands, ToolKind},
     states::utils::StageSection,
 };
-use std::f32::consts::PI;
 pub struct RepeaterAnimation;
 
 impl Animation for RepeaterAnimation {
@@ -36,272 +35,153 @@ impl Animation for RepeaterAnimation {
 
         let lab = 1.0;
 
-        // Spin stuff here
-        let foot = (((5.0)
-            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
-        .sqrt())
-            * ((anim_time as f32 * lab as f32 * 10.32).sin());
-
-        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
-
-        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
-        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
-
         // end spin stuff
 
         let movement = (anim_time as f32 * 1.0).min(1.0);
         let fire = (anim_time as f32 * 18.0 * lab as f32).sin();
 
-
         if let Some(ToolKind::Bow(_)) = active_tool_kind {
-                next.l_hand.position = Vec3::new(2.0, 1.5, 0.0);
-                next.l_hand.orientation = Quaternion::rotation_x(1.20)
-                    * Quaternion::rotation_y(-0.6)
-                    * Quaternion::rotation_z(-0.3);
-                next.l_hand.scale = Vec3::one() * 1.05;
-                next.r_hand.position = Vec3::new(5.9, 4.5, -5.0);
-                next.r_hand.orientation = Quaternion::rotation_x(1.20)
-                    * Quaternion::rotation_y(-0.6)
-                    * Quaternion::rotation_z(-0.3);
-                next.r_hand.scale = Vec3::one() * 1.05;
-                next.main.position = Vec3::new(3.0, 2.0, -13.0);
-                next.main.orientation = Quaternion::rotation_x(-0.3)
-                    * Quaternion::rotation_y(0.3)
-                    * Quaternion::rotation_z(-0.6);
+            next.l_hand.position = Vec3::new(2.0, 1.5, 0.0);
+            next.l_hand.orientation = Quaternion::rotation_x(1.20)
+                * Quaternion::rotation_y(-0.6)
+                * Quaternion::rotation_z(-0.3);
+            next.l_hand.scale = Vec3::one() * 1.05;
+            next.r_hand.position = Vec3::new(5.9, 4.5, -5.0);
+            next.r_hand.orientation = Quaternion::rotation_x(1.20)
+                * Quaternion::rotation_y(-0.6)
+                * Quaternion::rotation_z(-0.3);
+            next.r_hand.scale = Vec3::one() * 1.05;
+            next.main.position = Vec3::new(3.0, 2.0, -13.0);
+            next.main.orientation = Quaternion::rotation_x(-0.3)
+                * Quaternion::rotation_y(0.3)
+                * Quaternion::rotation_z(-0.6);
 
-                next.hold.position = Vec3::new(1.2, -1.0, -5.2);
-                next.hold.orientation = Quaternion::rotation_x(-1.7)
-                    * Quaternion::rotation_y(0.0)
-                    * Quaternion::rotation_z(-0.1);
-                next.hold.scale = Vec3::one() * 1.0;
+            next.hold.position = Vec3::new(1.2, -1.0, -5.2);
+            next.hold.orientation = Quaternion::rotation_x(-1.7)
+                * Quaternion::rotation_y(0.0)
+                * Quaternion::rotation_z(-0.1);
+            next.hold.scale = Vec3::one() * 1.0;
 
-                next.control.position = Vec3::new(-7.0, 6.0, 6.0);
-                next.control.orientation =
-                    Quaternion::rotation_x(0.0) * Quaternion::rotation_z(0.0);
-                next.control.scale = Vec3::one();
+            next.control.position = Vec3::new(-7.0, 6.0, 6.0);
+            next.control.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_z(0.0);
+            next.control.scale = Vec3::one();
             if let Some(stage_section) = stage_section {
                 match stage_section {
                     StageSection::Movement => {
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0+movement*-1.5-1.5,
-                        skeleton_attr.foot.1+movement*4.0+4.0,
-                        skeleton_attr.foot.2+movement*2.5+2.5,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(movement*0.75+0.75)*Quaternion::rotation_z(movement*0.3+0.3);
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0 + movement * -1.5 - 1.5,
+                            skeleton_attr.foot.1 + movement * 4.0 + 4.0,
+                            skeleton_attr.foot.2 + movement * 2.5 + 2.5,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(movement * 0.75 + 0.75)
+                            * Quaternion::rotation_z(movement * 0.3 + 0.3);
 
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0+movement*1.5+1.5,
-                        skeleton_attr.foot.1+movement*4.0+4.0,
-                        skeleton_attr.foot.2+movement*2.5+2.5,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(movement*0.75+0.75)*Quaternion::rotation_z(movement*-0.3-0.3);
-                    next.shorts.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.shorts.0+movement*4.0,
-                        skeleton_attr.shorts.1+movement*1.0,
-                    );
-                    next.shorts.orientation =
-                        Quaternion::rotation_x(movement*0.6);
-                    next.belt.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.belt.0+movement*2.0,
-                        skeleton_attr.belt.1,
-                    );
-                    next.belt.orientation =
-                        Quaternion::rotation_x(movement*0.2);
-                next.control.position = Vec3::new(-7.0+movement*5.0, 6.0+movement*3.0, 6.0+movement*1.0);
-                next.control.orientation =
-                    Quaternion::rotation_x(movement*0.4)*Quaternion::rotation_y(movement*0.8);
-                next.head.orientation =
-                    Quaternion::rotation_y(movement*0.15);
-                    next.torso.orientation =
-                        Quaternion::rotation_x(movement*0.1)
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0 + movement * 1.5 + 1.5,
+                            skeleton_attr.foot.1 + movement * 4.0 + 4.0,
+                            skeleton_attr.foot.2 + movement * 2.5 + 2.5,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(movement * 0.75 + 0.75)
+                            * Quaternion::rotation_z(movement * -0.3 - 0.3);
+                        next.shorts.position = Vec3::new(
+                            0.0,
+                            skeleton_attr.shorts.0 + movement * 4.0,
+                            skeleton_attr.shorts.1 + movement * 1.0,
+                        );
+                        next.shorts.orientation = Quaternion::rotation_x(movement * 0.6);
+                        next.belt.position = Vec3::new(
+                            0.0,
+                            skeleton_attr.belt.0 + movement * 2.0,
+                            skeleton_attr.belt.1,
+                        );
+                        next.belt.orientation = Quaternion::rotation_x(movement * 0.2);
+                        next.control.position = Vec3::new(
+                            -7.0 + movement * 5.0,
+                            6.0 + movement * 3.0,
+                            6.0 + movement * 1.0,
+                        );
+                        next.control.orientation = Quaternion::rotation_x(movement * 0.4)
+                            * Quaternion::rotation_y(movement * 0.8);
+                        next.head.orientation = Quaternion::rotation_y(movement * 0.15);
+                        next.torso.orientation = Quaternion::rotation_x(movement * 0.1)
                     },
 
                     StageSection::Buildup => {
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0-3.0,
-                        skeleton_attr.foot.1+8.0,
-                        skeleton_attr.foot.2+5.0,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(1.5+movement*-0.2)*Quaternion::rotation_z(0.6);
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0 - 3.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(1.5 + movement * -0.2)
+                            * Quaternion::rotation_z(0.6);
 
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0+3.0,
-                        skeleton_attr.foot.1+8.0,
-                        skeleton_attr.foot.2+5.0,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(1.5+movement*-0.2)*Quaternion::rotation_z(-0.6);
-                    next.shorts.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.shorts.0+4.0,
-                        skeleton_attr.shorts.1+1.0,
-                    );
-                    next.shorts.orientation =
-                        Quaternion::rotation_x(0.6);
-                    next.belt.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.belt.0+2.0,
-                        skeleton_attr.belt.1,
-                    );
-                    next.belt.orientation =
-                        Quaternion::rotation_x(0.2);
-                next.control.position = Vec3::new(-2.0, 9.0, 7.0);
-                next.control.orientation =
-                    Quaternion::rotation_x(0.4)*Quaternion::rotation_y(0.8);
-                next.head.orientation =
-                    Quaternion::rotation_y(0.15+movement*0.05);
-                    next.torso.orientation =
-                        Quaternion::rotation_x(0.1+movement*0.1);
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0 + 3.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(1.5 + movement * -0.2)
+                            * Quaternion::rotation_z(-0.6);
+                        next.shorts.position = Vec3::new(
+                            0.0,
+                            skeleton_attr.shorts.0 + 4.0,
+                            skeleton_attr.shorts.1 + 1.0,
+                        );
+                        next.shorts.orientation = Quaternion::rotation_x(0.6);
+                        next.belt.position =
+                            Vec3::new(0.0, skeleton_attr.belt.0 + 2.0, skeleton_attr.belt.1);
+                        next.belt.orientation = Quaternion::rotation_x(0.2);
+                        next.control.position = Vec3::new(-2.0, 9.0, 7.0);
+                        next.control.orientation =
+                            Quaternion::rotation_x(0.4) * Quaternion::rotation_y(0.8);
+                        next.head.orientation = Quaternion::rotation_y(0.15 + movement * 0.05);
+                        next.torso.orientation = Quaternion::rotation_x(0.1 + movement * 0.1);
                     },
 
                     StageSection::Shoot => {
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0-3.0,
-                        skeleton_attr.foot.1+8.0,
-                        skeleton_attr.foot.2+5.0,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(1.3)*Quaternion::rotation_z(0.6);
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0 - 3.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.l_foot.orientation =
+                            Quaternion::rotation_x(1.3) * Quaternion::rotation_z(0.6);
 
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0+3.0,
-                        skeleton_attr.foot.1+8.0,
-                        skeleton_attr.foot.2+5.0,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(1.3)*Quaternion::rotation_z(-0.6);
-                    next.shorts.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.shorts.0+4.0,
-                        skeleton_attr.shorts.1+1.0,
-                    );
-                    next.shorts.orientation =
-                        Quaternion::rotation_x(0.6);
-                    next.belt.position = Vec3::new(
-                        0.0,
-                        skeleton_attr.belt.0+2.0,
-                        skeleton_attr.belt.1,
-                    );
-                    next.belt.orientation =
-                        Quaternion::rotation_x(0.2);
-                next.control.position = Vec3::new(-2.0, 9.0, 7.0);
-                next.control.orientation =
-                    Quaternion::rotation_x(0.4)*Quaternion::rotation_y(0.8);
-                next.head.orientation =
-                    Quaternion::rotation_y(0.2);
-                    next.torso.orientation =
-                        Quaternion::rotation_x(0.2+movement*0.15);
-
-
-                next.l_hand.position = Vec3::new(2.0+fire*-6.0-3.0, 1.5+fire*-6.0-3.0, 0.0);
-                next.l_hand.orientation = Quaternion::rotation_x(1.20)
-                    * Quaternion::rotation_y(-0.6)
-                    * Quaternion::rotation_z(-0.3);
-                next.hold.scale = Vec3::one() * 0.0;
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0 + 3.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.r_foot.orientation =
+                            Quaternion::rotation_x(1.3) * Quaternion::rotation_z(-0.6);
+                        next.shorts.position = Vec3::new(
+                            0.0,
+                            skeleton_attr.shorts.0 + 4.0,
+                            skeleton_attr.shorts.1 + 1.0,
+                        );
+                        next.shorts.orientation = Quaternion::rotation_x(0.6);
+                        next.belt.position =
+                            Vec3::new(0.0, skeleton_attr.belt.0 + 2.0, skeleton_attr.belt.1);
+                        next.belt.orientation = Quaternion::rotation_x(0.2);
+                        next.control.position = Vec3::new(-2.0, 9.0, 7.0);
+                        next.control.orientation =
+                            Quaternion::rotation_x(0.4) * Quaternion::rotation_y(0.8);
+                        next.head.orientation = Quaternion::rotation_y(0.2);
+                        next.torso.orientation = Quaternion::rotation_x(0.2 + movement * 0.15);
 
+                        next.l_hand.position =
+                            Vec3::new(2.0 + fire * -6.0 - 3.0, 1.5 + fire * -6.0 - 3.0, 0.0);
+                        next.l_hand.orientation = Quaternion::rotation_x(1.20)
+                            * Quaternion::rotation_y(-0.6)
+                            * Quaternion::rotation_z(-0.3);
+                        next.hold.scale = Vec3::one() * 0.0;
                     },
-                    StageSection::Recover => {
-                    },
+                    StageSection::Recover => {},
                     _ => {},
                 }
             }
         }
 
-        /*        if let Some(ToolKind::Hammer(_)) = active_tool_kind {
-                    next.l_hand.position = Vec3::new(-12.0, 0.0, 0.0);
-                    next.l_hand.orientation = Quaternion::rotation_x(-0.0) * Quaternion::rotation_y(0.0);
-                    next.l_hand.scale = Vec3::one() * 1.08;
-                    next.r_hand.position = Vec3::new(3.0, 0.0, 0.0);
-                    next.r_hand.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0);
-                    next.r_hand.scale = Vec3::one() * 1.06;
-                    next.main.position = Vec3::new(0.0, 0.0, 0.0);
-                    next.main.orientation = Quaternion::rotation_x(0.0)
-                        * Quaternion::rotation_y(-1.57)
-                        * Quaternion::rotation_z(1.57);
-
-                    next.head.position = Vec3::new(
-                        0.0,
-                        -2.0 + skeleton_attr.head.0 + slower * -1.0,
-                        skeleton_attr.head.1,
-                    );
-                    next.head.orientation = Quaternion::rotation_z(slower * 0.05)
-                        * Quaternion::rotation_x((slowersmooth * -0.25 + slower * 0.55).max(-0.2))
-                        * Quaternion::rotation_y(slower * 0.05);
-                    next.head.scale = Vec3::one() * skeleton_attr.head_scale;
-
-                    next.chest.position = Vec3::new(0.0, 0.0, 7.0);
-                    next.chest.orientation = Quaternion::rotation_z(slower * 0.08 + slowersmooth * 0.15)
-                        * Quaternion::rotation_x(-0.3 + slower * 0.45 + slowersmooth * 0.26)
-                        * Quaternion::rotation_y(slower * 0.18 + slowersmooth * 0.15);
-
-                    next.belt.position = Vec3::new(0.0, 0.0, -2.0 + slower * -0.7);
-                    next.belt.orientation = Quaternion::rotation_z(slower * -0.16 + slowersmooth * -0.12)
-                        * Quaternion::rotation_x(0.0 + slower * -0.06)
-                        * Quaternion::rotation_y(slower * -0.05);
-
-                    next.shorts.position = Vec3::new(0.0, 0.0, -5.0 + slower * -0.7);
-                    next.shorts.orientation = Quaternion::rotation_z(slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_x(0.0 + slower * -0.08 + slowersmooth * -0.08)
-                        * Quaternion::rotation_y(slower * -0.07);
-
-                    next.lantern.orientation =
-                        Quaternion::rotation_x(slower * -0.7 + 0.4) * Quaternion::rotation_y(slower * 0.4);
-                    next.hold.scale = Vec3::one() * 0.0;
-
-                    next.l_foot.position = Vec3::new(
-                        -skeleton_attr.foot.0,
-                        slower * 3.0 + slowersmooth * -6.0 - 2.0,
-                        skeleton_attr.foot.2,
-                    );
-                    next.l_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.2 + slowersmooth * -0.3 - 0.2);
-
-                    next.r_foot.position = Vec3::new(
-                        skeleton_attr.foot.0,
-                        slower * 2.0 + slowersmooth * -4.0 - 1.0,
-                        -2.0 + skeleton_attr.foot.2,
-                    );
-                    next.r_foot.orientation =
-                        Quaternion::rotation_x(slower * -0.4 + slowersmooth * -0.6 - 1.0);
-
-                    next.control.scale = Vec3::one();
-                    next.control.position = Vec3::new(-7.0, 7.0, 1.0);
-                    next.control.orientation = Quaternion::rotation_x(-0.7 + slower * 1.5)
-                        * Quaternion::rotation_y(0.0)
-                        * Quaternion::rotation_z(1.4 + slowersmooth * -0.4 + slower * 0.2);
-                    next.control.scale = Vec3::one();
-
-                    next.lantern.position = Vec3::new(
-                        skeleton_attr.lantern.0,
-                        skeleton_attr.lantern.1,
-                        skeleton_attr.lantern.2,
-                    );
-                    next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-                    next.glider.scale = Vec3::one() * 0.0;
-                    next.l_control.scale = Vec3::one();
-                    next.r_control.scale = Vec3::one();
-
-                    next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-                    next.torso.orientation = Quaternion::rotation_z(0.0);
-                    next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
-        */
-
-
-        //next.lantern.position = Vec3::new(
-        //    skeleton_attr.lantern.0,
-        //    skeleton_attr.lantern.1,
-        //    skeleton_attr.lantern.2,
-        //);
-        //next.glider.position = Vec3::new(0.0, 0.0, 10.0);
-        //next.glider.scale = Vec3::one() * 0.0;
-        //next.l_control.scale = Vec3::one();
-        //next.r_control.scale = Vec3::one();
-
         next.second.scale = match (
             active_tool_kind.map(|tk| tk.hands()),
             second_tool_kind.map(|tk| tk.hands()),
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index 062a977092..bf1d0b21a1 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -852,19 +852,16 @@ impl FigureMgr {
                             let stage_time = s.timer.as_secs_f64();
 
                             let stage_progress = match s.stage_section {
-                                        StageSection::Charge => {
-                                            stage_time
-                                                / s.static_data.charge_duration.as_secs_f64()
-                                        },
-                                        StageSection::Swing => {
-                                            stage_time
-                                                / s.static_data.swing_duration.as_secs_f64()
-                                        },
-                                        StageSection::Recover => {
-                                            stage_time / s.static_data.recover_duration.as_secs_f64()
-                                        },
-                                        _ => 0.0,
-                                _ => state.state_time,
+                                StageSection::Charge => {
+                                    stage_time / s.static_data.charge_duration.as_secs_f64()
+                                },
+                                StageSection::Swing => {
+                                    stage_time / s.static_data.swing_duration.as_secs_f64()
+                                },
+                                StageSection::Recover => {
+                                    stage_time / s.static_data.recover_duration.as_secs_f64()
+                                },
+                                _ => 0.0,
                             };
 
                             anim::character::ChargeswingAnimation::update_skeleton(
@@ -911,23 +908,19 @@ impl FigureMgr {
                             let stage_time = s.timer.as_secs_f64();
 
                             let stage_progress = match s.stage_section {
-                                        StageSection::Buildup => {
-                                            stage_time
-                                                / s.static_data.buildup_duration.as_secs_f64()
-                                        },
-                                        StageSection::Movement => {
-                                            stage_time
-                                                / s.static_data.movement_duration.as_secs_f64()
-                                        },
-                                        StageSection::Shoot => {
-                                            stage_time / s.static_data.shoot_duration.as_secs_f64()
-                                        },
-                                        StageSection::Recover => {
-                                            stage_time
-                                                / s.static_data.recover_duration.as_secs_f64()
-                                        },
-                                        _ => 0.0,
-                                _ => state.state_time,
+                                StageSection::Buildup => {
+                                    stage_time / s.static_data.buildup_duration.as_secs_f64()
+                                },
+                                StageSection::Movement => {
+                                    stage_time / s.static_data.movement_duration.as_secs_f64()
+                                },
+                                StageSection::Shoot => {
+                                    stage_time / s.static_data.shoot_duration.as_secs_f64()
+                                },
+                                StageSection::Recover => {
+                                    stage_time / s.static_data.recover_duration.as_secs_f64()
+                                },
+                                _ => 0.0,
                             };
 
                             anim::character::RepeaterAnimation::update_skeleton(

From 163e76ac37eadcff2a9e11bf5037abbfb581053e Mon Sep 17 00:00:00 2001
From: Snowram <robin.gilh@gmail.com>
Date: Sat, 3 Oct 2020 16:33:09 +0200
Subject: [PATCH 15/23] Axe MeleeLeap character animation

---
 voxygen/src/anim/src/character/leapmelee.rs | 212 ++++++++++++--------
 1 file changed, 124 insertions(+), 88 deletions(-)

diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index 1c3a90efe3..6bb76d6bf1 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -34,21 +34,6 @@ impl Animation for LeapAnimation {
         *rate = 1.0;
         let mut next = (*skeleton).clone();
 
-        let lab = 1.0;
-
-        // Spin stuff here
-        let foot = (((5.0)
-            / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 10.32).sin()).powf(2.0 as f32)))
-        .sqrt())
-            * ((anim_time as f32 * lab as f32 * 10.32).sin());
-
-        let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin();
-
-        let spin = (anim_time as f32 * 2.8 * lab as f32).sin();
-        let spinhalf = (anim_time as f32 * 1.4 * lab as f32).sin();
-
-        // end spin stuff
-
         let movement = (anim_time as f32 * 1.0).min(1.0);
 
         if let Some(ToolKind::Hammer(_)) = active_tool_kind {
@@ -162,93 +147,144 @@ impl Animation for LeapAnimation {
                 }
             }
         } else if let Some(ToolKind::Axe(_)) = active_tool_kind {
-            //INTENTION: SWORD
-            next.l_hand.position = Vec3::new(-0.75, -1.0, -2.5);
-            next.l_hand.orientation = Quaternion::rotation_x(1.27);
-            next.l_hand.scale = Vec3::one() * 1.04;
-            next.r_hand.position = Vec3::new(0.75, -1.5, -5.5);
-            next.r_hand.orientation = Quaternion::rotation_x(1.27);
-            next.r_hand.scale = Vec3::one() * 1.05;
-            //next.main.position = Vec3::new(0.0, 0.0, 10.0);
-            next.main.position = Vec3::new(0.0, 0.0, -5.0);
-            next.main.orientation = Quaternion::rotation_x(1.6)
+            next.l_hand.position = Vec3::new(-0.5, 0.0, 4.0);
+            next.l_hand.orientation = Quaternion::rotation_x(PI / 2.0)
+                * Quaternion::rotation_z(0.0)
+                * Quaternion::rotation_y(0.0);
+            next.l_hand.scale = Vec3::one() * 1.08;
+            next.r_hand.position = Vec3::new(0.5, 0.0, -2.5);
+            next.r_hand.orientation = Quaternion::rotation_x(PI / 2.0)
+                * Quaternion::rotation_z(0.0)
+                * Quaternion::rotation_y(0.0);
+            next.r_hand.scale = Vec3::one() * 1.06;
+            next.main.position = Vec3::new(-0.0, -2.0, -1.0);
+            next.main.orientation = Quaternion::rotation_x(0.0)
                 * Quaternion::rotation_y(0.0)
-                * Quaternion::rotation_z(-0.4);
-            next.main.scale = Vec3::one();
+                * Quaternion::rotation_z(0.0);
 
-            next.control.position = Vec3::new(-4.5 + spinhalf * 4.0, 11.0, 8.0);
-            next.control.orientation = Quaternion::rotation_x(0.6 + spinhalf * -3.3)
-                * Quaternion::rotation_y(0.2 + spin * -2.0)
-                * Quaternion::rotation_z(1.4 + spin * 0.1);
+            next.control.position = Vec3::new(-3.0, 11.0, 3.0);
+            next.control.orientation = Quaternion::rotation_x(1.8)
+            * Quaternion::rotation_y(-0.5)
+            * Quaternion::rotation_z(PI - 0.2);
             next.control.scale = Vec3::one();
-            next.head.position = Vec3::new(
-                0.0,
-                -2.0 + skeleton_attr.head.0 + spin * -0.8,
-                skeleton_attr.head.1,
-            );
-            next.head.orientation = Quaternion::rotation_z(spin * -0.25)
-                * Quaternion::rotation_x(0.0 + spin * -0.1)
-                * Quaternion::rotation_y(spin * -0.2);
-            next.chest.position = Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1);
-            next.chest.orientation = Quaternion::rotation_z(spin * 0.1)
-                * Quaternion::rotation_x(0.0 + spin * 0.1)
-                * Quaternion::rotation_y(decel * -0.2);
-            next.chest.scale = Vec3::one();
 
-            next.belt.position = Vec3::new(0.0, 0.0, -2.0);
-            next.belt.orientation = next.chest.orientation * -0.1;
-            next.belt.scale = Vec3::one();
+            next.head.position = Vec3::new(0.0, -2.0 + skeleton_attr.head.0, skeleton_attr.head.1);
 
-            next.shorts.position = Vec3::new(0.0, 0.0, -5.0);
-            next.belt.orientation = next.chest.orientation * -0.08;
-            next.shorts.scale = Vec3::one();
-            next.torso.position = Vec3::new(0.0, 0.0, 0.1) * skeleton_attr.scaler;
-            next.torso.orientation = Quaternion::rotation_z((spin * 7.0).max(0.3))
-                * Quaternion::rotation_x(0.0)
-                * Quaternion::rotation_y(0.3);
-            next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
+            if let Some(stage_section) = stage_section {
+                match stage_section {
+                    StageSection::Buildup => {
+                        next.control.position = Vec3::new(
+                            - 10.0 + movement * 5.0,
+                            11.0 + movement * - 26.0,
+                            3.0 + movement * 6.0
+                        );
+                        next.control.orientation = Quaternion::rotation_x(1.8 + movement * -1.4)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(PI);
+                        next.chest.orientation = Quaternion::rotation_x(movement * -0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(movement * 0.5);
 
-            // Stuff after the branch in the spin animation file
+                        next.head.orientation = Quaternion::rotation_x(0.0 + movement * -0.4)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(movement * -0.4);
 
-            next.l_foot.position =
-                Vec3::new(-skeleton_attr.foot.0, foot * 1.0, skeleton_attr.foot.2);
-            next.l_foot.orientation = Quaternion::rotation_x(foot * -1.2);
-            next.l_foot.scale = Vec3::one();
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0 - movement * 6.0,
+                            skeleton_attr.foot.2 + 6.0 - movement * 6.0,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(0.6 + movement * -0.4);
 
-            next.r_foot.position =
-                Vec3::new(skeleton_attr.foot.0, foot * -1.0, skeleton_attr.foot.2);
-            next.r_foot.orientation = Quaternion::rotation_x(foot * 1.2);
-            next.r_foot.scale = Vec3::one();
+                        next.belt.orientation = Quaternion::rotation_x(movement * 0.22);
+                        next.shorts.orientation = Quaternion::rotation_x(movement * 0.3);
+                    },
 
-            next.l_shoulder.position = Vec3::new(-5.0, 0.0, 4.7);
-            next.l_shoulder.orientation = Quaternion::rotation_x(0.0);
-            next.l_shoulder.scale = Vec3::one() * 1.1;
+                    StageSection::Movement => {
+                        next.control.position = Vec3::new(
+                            0.0,
+                            -15.0 + movement * 5.0, //11
+                            9.0 - movement * 5.0,
+                        );
+                        next.control.orientation = Quaternion::rotation_x(0.4)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(PI);
+                        next.chest.orientation = Quaternion::rotation_x((-0.3 + movement * 6.0).min(0.3))
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.0);
+                        next.head.orientation = Quaternion::rotation_x(-0.4 + movement * 0.4)
+                            * Quaternion::rotation_y(movement * -0.1)
+                            * Quaternion::rotation_z(movement * 0.4);
 
-            next.r_shoulder.position = Vec3::new(5.0, 0.0, 4.7);
-            next.r_shoulder.orientation = Quaternion::rotation_x(0.0);
-            next.r_shoulder.scale = Vec3::one() * 1.1;
+                        next.l_foot.position = Vec3::new(
+                                - skeleton_attr.foot.0,
+                                skeleton_attr.foot.1 + 8.0,
+                                skeleton_attr.foot.2 + 5.0,
+                            );
+                            next.l_foot.orientation = Quaternion::rotation_x(0.9);
 
-            next.glider.position = Vec3::new(0.0, 5.0, 0.0);
-            next.glider.orientation = Quaternion::rotation_y(0.0);
-            next.glider.scale = Vec3::one() * 0.0;
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(0.9);
 
-            next.lantern.position = Vec3::new(
-                skeleton_attr.lantern.0,
-                skeleton_attr.lantern.1,
-                skeleton_attr.lantern.2,
-            );
-            next.lantern.orientation =
-                Quaternion::rotation_x(spin * -0.7 + 0.4) * Quaternion::rotation_y(spin * 0.4);
-            next.lantern.scale = Vec3::one() * 0.65;
-            next.hold.scale = Vec3::one() * 0.0;
+                        next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+                        next.torso.orientation = Quaternion::rotation_x(movement * - 1.8 * PI);
+                        next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
 
-            next.l_control.position = Vec3::new(0.0, 0.0, 0.0);
-            next.l_control.orientation = Quaternion::rotation_x(0.0);
-            next.l_control.scale = Vec3::one();
+                        next.belt.orientation = Quaternion::rotation_x(0.22 + movement * 0.1);
+                        next.shorts.orientation = Quaternion::rotation_x(0.3 + movement * 0.1);
+                    },
+                    StageSection::Swing => {
+                        next.control.position =
+                            Vec3::new(0.0, 12.0 + movement * 8.0, 6.0 + movement * -6.0);
+                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -3.0)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(PI);
+                        next.chest.orientation = Quaternion::rotation_x(0.6 + movement * -0.9)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.7 + movement * -0.7);
+                        next.head.orientation = Quaternion::rotation_x(movement * 0.2)
+                            * Quaternion::rotation_y(-0.1)
+                            * Quaternion::rotation_z(-0.6 + movement * 0.6);
 
-            next.r_control.position = Vec3::new(0.0, 0.0, 0.0);
-            next.r_control.orientation = Quaternion::rotation_x(0.0);
-            next.r_control.scale = Vec3::one();
+                        next.l_hand.position = Vec3::new(-12.0 + movement * 8.0, 0.0, 0.0);
+
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 - 5.0,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(0.9);
+
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 - 5.0,
+                            skeleton_attr.foot.2,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(-0.8);
+
+                        next.torso.orientation = Quaternion::rotation_x(-1.9 * PI - movement * 0.3 * PI);
+                    },
+                    StageSection::Recover => {
+                        next.control.position = Vec3::new(-4.0, 20.0, 0.0);
+                        next.control.orientation = Quaternion::rotation_x(-2.7)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(PI);
+                        next.chest.orientation = Quaternion::rotation_x(-0.3 + movement * 0.3)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.0);
+                        next.head.orientation = Quaternion::rotation_x(0.2)
+                            * Quaternion::rotation_y(-0.1)
+                            * Quaternion::rotation_z(0.0);
+
+                        next.l_hand.position = Vec3::new(-2.0, 0.0, 0.0);
+                    },
+                    _ => {},
+                }
+            }
         }
 
         //next.lantern.position = Vec3::new(

From 4093d4f8086b1570cb0572023cc84a369017a4c2 Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Sat, 3 Oct 2020 17:54:40 -0400
Subject: [PATCH 16/23] adjustments to chargedmelee, repeater

---
 common/src/comp/inventory/item/tool.rs        |  6 +--
 common/src/states/utils.rs                    |  2 +-
 voxygen/src/anim/src/character/chargeswing.rs |  4 +-
 voxygen/src/anim/src/character/leapmelee.rs   | 53 ++++++++++---------
 voxygen/src/anim/src/character/repeater.rs    | 24 ++++-----
 5 files changed, 45 insertions(+), 44 deletions(-)

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 3f63d2ac2a..f8fcfc9a7f 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -227,10 +227,10 @@ impl Tool {
                     num_spins: 1,
                 },
                 LeapMelee {
-                    energy_cost: 600,
+                    energy_cost: 0,
                     buildup_duration: Duration::from_millis(100),
-                    movement_duration: Duration::from_millis(600),
-                    swing_duration: Duration::from_millis(100),
+                    movement_duration: Duration::from_millis(900),
+                    swing_duration: Duration::from_millis(200),
                     recover_duration: Duration::from_millis(100),
                     base_damage: (240.0 * self.base_power()) as u32,
                     knockback: 12.0,
diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index ffae9f9697..afaf37f25d 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -107,7 +107,7 @@ pub fn forward_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32,
 
 pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) {
     // Set direction based on move direction
-    let ori_dir = if update.character.is_attack() | update.character.is_block() {
+    let ori_dir = if update.character.is_block() {
         data.inputs.look_dir.xy()
     } else if !data.inputs.move_dir.is_approx_zero() {
         data.inputs.move_dir
diff --git a/voxygen/src/anim/src/character/chargeswing.rs b/voxygen/src/anim/src/character/chargeswing.rs
index ce7d30cdd6..e98b5c0e03 100644
--- a/voxygen/src/anim/src/character/chargeswing.rs
+++ b/voxygen/src/anim/src/character/chargeswing.rs
@@ -161,7 +161,7 @@ impl Animation for ChargeswingAnimation {
                         next.control.position = Vec3::new(6.0, 7.0, 1.0 + 3.0);
                         next.control.orientation = Quaternion::rotation_x(PI / 2.0)
                             * Quaternion::rotation_y(-1.6)
-                            * Quaternion::rotation_z(-0.1);
+                            * Quaternion::rotation_z(0.3 - movement * 2.5);
                         next.head.orientation = Quaternion::rotation_z(0.8);
                         next.l_hand.position = Vec3::new(-3.0, 0.0, 0.0);
                     },
@@ -170,7 +170,7 @@ impl Animation for ChargeswingAnimation {
                         next.control.position = Vec3::new(6.0, 7.0, 1.0 + 3.0 + movement * -3.0);
                         next.control.orientation = Quaternion::rotation_x(PI / 2.0)
                             * Quaternion::rotation_y(-1.6 + movement * 1.6)
-                            * Quaternion::rotation_z(-0.1 + movement * 0.1);
+                            * Quaternion::rotation_z(-2.2 + movement * 2.2);
                         next.head.orientation = Quaternion::rotation_z(0.8 + movement * -0.8);
                         next.l_hand.position = Vec3::new(-3.0 + movement * -9.0, 0.0, 0.0);
                     },
diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index 6bb76d6bf1..bbb97ced74 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -164,8 +164,8 @@ impl Animation for LeapAnimation {
 
             next.control.position = Vec3::new(-3.0, 11.0, 3.0);
             next.control.orientation = Quaternion::rotation_x(1.8)
-            * Quaternion::rotation_y(-0.5)
-            * Quaternion::rotation_z(PI - 0.2);
+                * Quaternion::rotation_y(-0.5)
+                * Quaternion::rotation_z(PI - 0.2);
             next.control.scale = Vec3::one();
 
             next.head.position = Vec3::new(0.0, -2.0 + skeleton_attr.head.0, skeleton_attr.head.1);
@@ -174,13 +174,13 @@ impl Animation for LeapAnimation {
                 match stage_section {
                     StageSection::Buildup => {
                         next.control.position = Vec3::new(
-                            - 10.0 + movement * 5.0,
-                            11.0 + movement * - 26.0,
-                            3.0 + movement * 6.0
+                            -3.0 + movement * 3.0,
+                            11.0 + movement * 1.0,
+                            3.0 + movement * 12.0,
                         );
-                        next.control.orientation = Quaternion::rotation_x(1.8 + movement * -1.4)
-                            * Quaternion::rotation_y(0.0)
-                            * Quaternion::rotation_z(PI);
+                        next.control.orientation = Quaternion::rotation_x(1.8 + movement * -1.0)
+                            * Quaternion::rotation_y(-0.5 + movement * 0.5)
+                            * Quaternion::rotation_z(PI + 0.2 - movement * 0.2);
                         next.chest.orientation = Quaternion::rotation_x(movement * -0.3)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(movement * 0.5);
@@ -202,26 +202,26 @@ impl Animation for LeapAnimation {
 
                     StageSection::Movement => {
                         next.control.position = Vec3::new(
-                            0.0,
-                            -15.0 + movement * 5.0, //11
-                            9.0 - movement * 5.0,
+                            0.0, 12.0, //11
+                            15.0,
                         );
-                        next.control.orientation = Quaternion::rotation_x(0.4)
+                        next.control.orientation = Quaternion::rotation_x(0.8 + movement * -0.5)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
-                        next.chest.orientation = Quaternion::rotation_x((-0.3 + movement * 6.0).min(0.3))
-                            * Quaternion::rotation_y(0.0)
-                            * Quaternion::rotation_z(0.0);
+                        next.chest.orientation =
+                            Quaternion::rotation_x((-0.3 + movement * 6.0).min(0.3))
+                                * Quaternion::rotation_y(0.0)
+                                * Quaternion::rotation_z(0.0);
                         next.head.orientation = Quaternion::rotation_x(-0.4 + movement * 0.4)
                             * Quaternion::rotation_y(movement * -0.1)
                             * Quaternion::rotation_z(movement * 0.4);
 
                         next.l_foot.position = Vec3::new(
-                                - skeleton_attr.foot.0,
-                                skeleton_attr.foot.1 + 8.0,
-                                skeleton_attr.foot.2 + 5.0,
-                            );
-                            next.l_foot.orientation = Quaternion::rotation_x(0.9);
+                            -skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 + 8.0,
+                            skeleton_attr.foot.2 + 5.0,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(0.9);
 
                         next.r_foot.position = Vec3::new(
                             skeleton_attr.foot.0,
@@ -231,7 +231,7 @@ impl Animation for LeapAnimation {
                         next.r_foot.orientation = Quaternion::rotation_x(0.9);
 
                         next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
-                        next.torso.orientation = Quaternion::rotation_x(movement * - 1.8 * PI);
+                        next.torso.orientation = Quaternion::rotation_x(movement * -1.8 * PI);
                         next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
 
                         next.belt.orientation = Quaternion::rotation_x(0.22 + movement * 0.1);
@@ -239,11 +239,11 @@ impl Animation for LeapAnimation {
                     },
                     StageSection::Swing => {
                         next.control.position =
-                            Vec3::new(0.0, 12.0 + movement * 8.0, 6.0 + movement * -6.0);
-                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -3.0)
+                            Vec3::new(0.0, 12.0 + movement * 3.0, 15.0 + movement * -15.0);
+                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -1.2)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
-                        next.chest.orientation = Quaternion::rotation_x(0.6 + movement * -0.9)
+                        next.chest.orientation = Quaternion::rotation_x(0.6 + movement * -0.2)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(0.7 + movement * -0.7);
                         next.head.orientation = Quaternion::rotation_x(movement * 0.2)
@@ -266,11 +266,12 @@ impl Animation for LeapAnimation {
                         );
                         next.r_foot.orientation = Quaternion::rotation_x(-0.8);
 
-                        next.torso.orientation = Quaternion::rotation_x(-1.9 * PI - movement * 0.3 * PI);
+                        next.torso.orientation =
+                            Quaternion::rotation_x(-1.9 * PI - movement * 0.3 * PI);
                     },
                     StageSection::Recover => {
                         next.control.position = Vec3::new(-4.0, 20.0, 0.0);
-                        next.control.orientation = Quaternion::rotation_x(-2.7)
+                        next.control.orientation = Quaternion::rotation_x(-0.9)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
                         next.chest.orientation = Quaternion::rotation_x(-0.3 + movement * 0.3)
diff --git a/voxygen/src/anim/src/character/repeater.rs b/voxygen/src/anim/src/character/repeater.rs
index 227e5610ee..8fe7adf235 100644
--- a/voxygen/src/anim/src/character/repeater.rs
+++ b/voxygen/src/anim/src/character/repeater.rs
@@ -69,19 +69,19 @@ impl Animation for RepeaterAnimation {
                 match stage_section {
                     StageSection::Movement => {
                         next.l_foot.position = Vec3::new(
-                            -skeleton_attr.foot.0 + movement * -1.5 - 1.5,
+                            -skeleton_attr.foot.0 + movement * -0.75 - 0.75,
                             skeleton_attr.foot.1 + movement * 4.0 + 4.0,
                             skeleton_attr.foot.2 + movement * 2.5 + 2.5,
                         );
-                        next.l_foot.orientation = Quaternion::rotation_x(movement * 0.75 + 0.75)
+                        next.l_foot.orientation = Quaternion::rotation_x(movement * 0.6 + 0.6)
                             * Quaternion::rotation_z(movement * 0.3 + 0.3);
 
                         next.r_foot.position = Vec3::new(
-                            skeleton_attr.foot.0 + movement * 1.5 + 1.5,
+                            skeleton_attr.foot.0 + movement * 0.75 + 0.75,
                             skeleton_attr.foot.1 + movement * 4.0 + 4.0,
                             skeleton_attr.foot.2 + movement * 2.5 + 2.5,
                         );
-                        next.r_foot.orientation = Quaternion::rotation_x(movement * 0.75 + 0.75)
+                        next.r_foot.orientation = Quaternion::rotation_x(movement * 0.6 + 0.6)
                             * Quaternion::rotation_z(movement * -0.3 - 0.3);
                         next.shorts.position = Vec3::new(
                             0.0,
@@ -108,19 +108,19 @@ impl Animation for RepeaterAnimation {
 
                     StageSection::Buildup => {
                         next.l_foot.position = Vec3::new(
-                            -skeleton_attr.foot.0 - 3.0,
+                            -skeleton_attr.foot.0 - 1.5,
                             skeleton_attr.foot.1 + 8.0,
                             skeleton_attr.foot.2 + 5.0,
                         );
-                        next.l_foot.orientation = Quaternion::rotation_x(1.5 + movement * -0.2)
+                        next.l_foot.orientation = Quaternion::rotation_x(1.2 + movement * -0.2)
                             * Quaternion::rotation_z(0.6);
 
                         next.r_foot.position = Vec3::new(
-                            skeleton_attr.foot.0 + 3.0,
+                            skeleton_attr.foot.0 + 1.5,
                             skeleton_attr.foot.1 + 8.0,
                             skeleton_attr.foot.2 + 5.0,
                         );
-                        next.r_foot.orientation = Quaternion::rotation_x(1.5 + movement * -0.2)
+                        next.r_foot.orientation = Quaternion::rotation_x(1.2 + movement * -0.2)
                             * Quaternion::rotation_z(-0.6);
                         next.shorts.position = Vec3::new(
                             0.0,
@@ -140,20 +140,20 @@ impl Animation for RepeaterAnimation {
 
                     StageSection::Shoot => {
                         next.l_foot.position = Vec3::new(
-                            -skeleton_attr.foot.0 - 3.0,
+                            -skeleton_attr.foot.0 - 1.5,
                             skeleton_attr.foot.1 + 8.0,
                             skeleton_attr.foot.2 + 5.0,
                         );
                         next.l_foot.orientation =
-                            Quaternion::rotation_x(1.3) * Quaternion::rotation_z(0.6);
+                            Quaternion::rotation_x(1.0) * Quaternion::rotation_z(0.6);
 
                         next.r_foot.position = Vec3::new(
-                            skeleton_attr.foot.0 + 3.0,
+                            skeleton_attr.foot.0 + 1.5,
                             skeleton_attr.foot.1 + 8.0,
                             skeleton_attr.foot.2 + 5.0,
                         );
                         next.r_foot.orientation =
-                            Quaternion::rotation_x(1.3) * Quaternion::rotation_z(-0.6);
+                            Quaternion::rotation_x(1.0) * Quaternion::rotation_z(-0.6);
                         next.shorts.position = Vec3::new(
                             0.0,
                             skeleton_attr.shorts.0 + 4.0,

From bdf7d96833d49cecbc429b8420b634a125d3653f Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Sat, 3 Oct 2020 19:06:31 -0700
Subject: [PATCH 17/23] Smoother leap and recovery leap handling

---
 common/src/states/repeater_ranged.rs | 78 +++++++++++++++++++---------
 common/src/states/utils.rs           |  2 +-
 2 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index a95f860c51..1c33566075 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -54,7 +54,14 @@ impl CharacterBehavior for Data {
             StageSection::Movement => {
                 // Jumping
                 if let Some(leap_strength) = self.static_data.leap {
-                    update.vel.0 = Vec3::new(data.vel.0.x, data.vel.0.y, leap_strength);
+                    update.vel.0 = Vec3::new(
+                        data.vel.0.x,
+                        data.vel.0.y,
+                        leap_strength
+                            * (1.0
+                                - self.timer.as_secs_f32()
+                                    / self.static_data.movement_duration.as_secs_f32()),
+                    );
                 }
                 if self.timer < self.static_data.movement_duration {
                     // Do movement
@@ -170,31 +177,52 @@ impl CharacterBehavior for Data {
                 }
             },
             StageSection::Recover => {
-                if !data.physics.on_ground {
-                    // Lands
-                    update.character = CharacterState::RepeaterRanged(Data {
-                        static_data: self.static_data.clone(),
-                        timer: self
-                            .timer
-                            .checked_add(Duration::from_secs_f32(data.dt.0))
-                            .unwrap_or_default(),
-                        stage_section: self.stage_section,
-                        reps_remaining: self.reps_remaining,
-                    });
-                } else if self.timer < self.static_data.recover_duration {
-                    // Recovers from attack
-                    update.character = CharacterState::RepeaterRanged(Data {
-                        static_data: self.static_data.clone(),
-                        timer: self
-                            .timer
-                            .checked_add(Duration::from_secs_f32(data.dt.0))
-                            .unwrap_or_default(),
-                        stage_section: self.stage_section,
-                        reps_remaining: self.reps_remaining,
-                    });
+                if self.static_data.leap == None {
+                    if !data.physics.on_ground {
+                        // Lands
+                        update.character = CharacterState::RepeaterRanged(Data {
+                            static_data: self.static_data.clone(),
+                            timer: self
+                                .timer
+                                .checked_add(Duration::from_secs_f32(data.dt.0))
+                                .unwrap_or_default(),
+                            stage_section: self.stage_section,
+                            reps_remaining: self.reps_remaining,
+                        });
+                    } else if self.timer < self.static_data.recover_duration {
+                        // Recovers from attack
+                        update.character = CharacterState::RepeaterRanged(Data {
+                            static_data: self.static_data.clone(),
+                            timer: self
+                                .timer
+                                .checked_add(Duration::from_secs_f32(data.dt.0))
+                                .unwrap_or_default(),
+                            stage_section: self.stage_section,
+                            reps_remaining: self.reps_remaining,
+                        });
+                    } else {
+                        // Done
+                        update.character = CharacterState::Wielding;
+                    }
                 } else {
-                    // Done
-                    update.character = CharacterState::Wielding;
+                    if data.physics.on_ground {
+                        // Done
+                        update.character = CharacterState::Wielding;
+                    } else if self.timer < self.static_data.recover_duration {
+                        // Recovers from attack
+                        update.character = CharacterState::RepeaterRanged(Data {
+                            static_data: self.static_data.clone(),
+                            timer: self
+                                .timer
+                                .checked_add(Duration::from_secs_f32(data.dt.0))
+                                .unwrap_or_default(),
+                            stage_section: self.stage_section,
+                            reps_remaining: self.reps_remaining,
+                        });
+                    } else {
+                        // Done
+                        update.character = CharacterState::Wielding;
+                    }
                 }
             },
             _ => {
diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index afaf37f25d..4578548d5d 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -107,7 +107,7 @@ pub fn forward_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32,
 
 pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) {
     // Set direction based on move direction
-    let ori_dir = if update.character.is_block() {
+    let ori_dir = if update.character.is_block() || update.character.is_attack() {
         data.inputs.look_dir.xy()
     } else if !data.inputs.move_dir.is_approx_zero() {
         data.inputs.move_dir

From 724331a6fdf148d247edeed14d33e9b296af33c1 Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Sun, 4 Oct 2020 01:42:44 -0400
Subject: [PATCH 18/23] axeleap tweaks

---
 common/src/states/wielding.rs                 |   1 -
 voxygen/src/anim/src/character/chargeswing.rs |   4 +-
 voxygen/src/anim/src/character/leapmelee.rs   | 127 +++++++++++-------
 3 files changed, 84 insertions(+), 48 deletions(-)

diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs
index e1d5e64e97..f64ae9c77f 100644
--- a/common/src/states/wielding.rs
+++ b/common/src/states/wielding.rs
@@ -18,7 +18,6 @@ impl CharacterBehavior for Data {
         handle_ability3_input(&data, &mut update);
         handle_dodge_input(&data, &mut update);
 
-
         update
     }
 
diff --git a/voxygen/src/anim/src/character/chargeswing.rs b/voxygen/src/anim/src/character/chargeswing.rs
index e98b5c0e03..7f719b4f10 100644
--- a/voxygen/src/anim/src/character/chargeswing.rs
+++ b/voxygen/src/anim/src/character/chargeswing.rs
@@ -118,13 +118,13 @@ impl Animation for ChargeswingAnimation {
                             next.l_foot.position = Vec3::new(
                                 -skeleton_attr.foot.0,
                                 skeleton_attr.foot.1 + foothoril * -2.5 - 3.5,
-                                2.0 + skeleton_attr.foot.2 + ((footvertl * -1.2).max(-1.0)),
+                                skeleton_attr.foot.2 + ((footvertl * -1.2).max(-1.0)),
                             );
 
                             next.r_foot.position = Vec3::new(
                                 skeleton_attr.foot.0,
                                 skeleton_attr.foot.1 + foothorir * -2.5 + 6.0,
-                                2.0 + skeleton_attr.foot.2 + ((footvertr * -1.2).max(-1.0)),
+                                skeleton_attr.foot.2 + ((footvertr * -1.2).max(-1.0)),
                             );
 
                             next.l_foot.orientation =
diff --git a/voxygen/src/anim/src/character/leapmelee.rs b/voxygen/src/anim/src/character/leapmelee.rs
index bbb97ced74..3f96bfe8e2 100644
--- a/voxygen/src/anim/src/character/leapmelee.rs
+++ b/voxygen/src/anim/src/character/leapmelee.rs
@@ -102,7 +102,7 @@ impl Animation for LeapAnimation {
                     },
                     StageSection::Swing => {
                         next.control.position =
-                            Vec3::new(-4.0, 12.0 + movement * 13.0, 6.0 + movement * -7.0);
+                            Vec3::new(-4.0, 12.0 + movement * 5.0, 6.0 + movement * -7.0);
                         next.control.orientation = Quaternion::rotation_x(0.3 + movement * -3.0)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(1.0 + movement * 0.5);
@@ -130,7 +130,7 @@ impl Animation for LeapAnimation {
                         next.r_foot.orientation = Quaternion::rotation_x(-0.8);
                     },
                     StageSection::Recover => {
-                        next.control.position = Vec3::new(-4.0, 25.0, -1.0);
+                        next.control.position = Vec3::new(-4.0, 17.0, -1.0);
                         next.control.orientation = Quaternion::rotation_x(-2.7)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(1.5);
@@ -185,19 +185,31 @@ impl Animation for LeapAnimation {
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(movement * 0.5);
 
-                        next.head.orientation = Quaternion::rotation_x(0.0 + movement * -0.4)
-                            * Quaternion::rotation_y(0.0)
-                            * Quaternion::rotation_z(movement * -0.4);
+                        next.head.orientation = Quaternion::rotation_x(0.0 + movement * -0.4);
+
+                        next.l_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1,
+                            skeleton_attr.foot.2 - 8.0,
+                        );
 
                         next.r_foot.position = Vec3::new(
                             skeleton_attr.foot.0,
-                            skeleton_attr.foot.1 + 8.0 - movement * 6.0,
-                            skeleton_attr.foot.2 + 6.0 - movement * 6.0,
+                            skeleton_attr.foot.1,
+                            skeleton_attr.foot.2 - 8.0,
                         );
-                        next.r_foot.orientation = Quaternion::rotation_x(0.6 + movement * -0.4);
+
+                        next.l_foot.orientation = Quaternion::rotation_x(movement * 0.9);
+
+                        next.r_foot.orientation = Quaternion::rotation_x(movement * 0.9);
 
                         next.belt.orientation = Quaternion::rotation_x(movement * 0.22);
                         next.shorts.orientation = Quaternion::rotation_x(movement * 0.3);
+
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position =
+                            Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler / 11.0;
                     },
 
                     StageSection::Movement => {
@@ -205,83 +217,108 @@ impl Animation for LeapAnimation {
                             0.0, 12.0, //11
                             15.0,
                         );
+
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position = Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler;
                         next.control.orientation = Quaternion::rotation_x(0.8 + movement * -0.5)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
-                        next.chest.orientation =
-                            Quaternion::rotation_x((-0.3 + movement * 6.0).min(0.3))
-                                * Quaternion::rotation_y(0.0)
-                                * Quaternion::rotation_z(0.0);
-                        next.head.orientation = Quaternion::rotation_x(-0.4 + movement * 0.4)
-                            * Quaternion::rotation_y(movement * -0.1)
-                            * Quaternion::rotation_z(movement * 0.4);
+                        next.torso.orientation = Quaternion::rotation_x(-0.3 + movement * 6.0)
+                            * Quaternion::rotation_y(0.0)
+                            * Quaternion::rotation_z(0.0);
+                        next.head.orientation = Quaternion::rotation_x(-0.4 + movement * 0.4);
 
                         next.l_foot.position = Vec3::new(
                             -skeleton_attr.foot.0,
-                            skeleton_attr.foot.1 + 8.0,
-                            skeleton_attr.foot.2 + 5.0,
+                            skeleton_attr.foot.1 + movement * 4.0,
+                            skeleton_attr.foot.2 - 8.0 + movement * 3.0,
                         );
                         next.l_foot.orientation = Quaternion::rotation_x(0.9);
 
                         next.r_foot.position = Vec3::new(
                             skeleton_attr.foot.0,
-                            skeleton_attr.foot.1 + 8.0,
-                            skeleton_attr.foot.2 + 5.0,
+                            skeleton_attr.foot.1 + movement * 4.0,
+                            skeleton_attr.foot.2 - 8.0 + movement * 3.0,
                         );
                         next.r_foot.orientation = Quaternion::rotation_x(0.9);
-
-                        next.torso.position = Vec3::new(0.0, 0.0, 0.0) * skeleton_attr.scaler;
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position =
+                            Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler / 11.0;
                         next.torso.orientation = Quaternion::rotation_x(movement * -1.8 * PI);
                         next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler;
 
                         next.belt.orientation = Quaternion::rotation_x(0.22 + movement * 0.1);
                         next.shorts.orientation = Quaternion::rotation_x(0.3 + movement * 0.1);
+
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position =
+                            Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler / 11.0;
                     },
                     StageSection::Swing => {
                         next.control.position =
                             Vec3::new(0.0, 12.0 + movement * 3.0, 15.0 + movement * -15.0);
-                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -1.2)
+                        next.control.orientation = Quaternion::rotation_x(0.3 + movement * -1.0)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
-                        next.chest.orientation = Quaternion::rotation_x(0.6 + movement * -0.2)
-                            * Quaternion::rotation_y(0.0)
-                            * Quaternion::rotation_z(0.7 + movement * -0.7);
-                        next.head.orientation = Quaternion::rotation_x(movement * 0.2)
-                            * Quaternion::rotation_y(-0.1)
-                            * Quaternion::rotation_z(-0.6 + movement * 0.6);
 
-                        next.l_hand.position = Vec3::new(-12.0 + movement * 8.0, 0.0, 0.0);
+                        next.head.orientation = Quaternion::rotation_x(movement * 0.2);
+
+                        next.l_hand.position = Vec3::new(-0.5, 0.0, 4.0);
 
                         next.l_foot.position = Vec3::new(
                             -skeleton_attr.foot.0,
-                            skeleton_attr.foot.1 + 8.0,
-                            skeleton_attr.foot.2 - 5.0,
+                            skeleton_attr.foot.1 + 4.0 + movement * -8.0,
+                            skeleton_attr.foot.2 - 5.0 + movement * -3.0,
                         );
-                        next.l_foot.orientation = Quaternion::rotation_x(0.9);
+                        next.l_foot.orientation = Quaternion::rotation_x(0.9 - movement * 1.8);
 
                         next.r_foot.position = Vec3::new(
                             skeleton_attr.foot.0,
-                            skeleton_attr.foot.1 - 5.0,
-                            skeleton_attr.foot.2,
+                            skeleton_attr.foot.1 + 4.0 + movement * -8.0,
+                            skeleton_attr.foot.2 - 5.0 + movement * -3.0,
                         );
-                        next.r_foot.orientation = Quaternion::rotation_x(-0.8);
+                        next.r_foot.orientation = Quaternion::rotation_x(0.9 - movement * 1.8);
 
                         next.torso.orientation =
-                            Quaternion::rotation_x(-1.9 * PI - movement * 0.3 * PI);
+                            Quaternion::rotation_x(-1.9 * PI - movement * 0.2 * PI);
+
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position =
+                            Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler / 11.0;
                     },
                     StageSection::Recover => {
-                        next.control.position = Vec3::new(-4.0, 20.0, 0.0);
-                        next.control.orientation = Quaternion::rotation_x(-0.9)
+                        next.control.position = Vec3::new(0.0, 15.0, 0.0);
+                        next.control.orientation = Quaternion::rotation_x(-0.7)
                             * Quaternion::rotation_y(0.0)
                             * Quaternion::rotation_z(PI);
-                        next.chest.orientation = Quaternion::rotation_x(-0.3 + movement * 0.3)
-                            * Quaternion::rotation_y(0.0)
-                            * Quaternion::rotation_z(0.0);
-                        next.head.orientation = Quaternion::rotation_x(0.2)
-                            * Quaternion::rotation_y(-0.1)
-                            * Quaternion::rotation_z(0.0);
 
-                        next.l_hand.position = Vec3::new(-2.0, 0.0, 0.0);
+                        next.head.orientation = Quaternion::rotation_x(0.2);
+
+                        next.l_hand.position = Vec3::new(-0.5, 0.0, 4.0);
+
+                        next.chest.position =
+                            Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1 - 8.0);
+                        next.torso.position =
+                            Vec3::new(0.0, 0.0, 0.0 + 8.0) * skeleton_attr.scaler / 11.0;
+                        next.torso.orientation =
+                            Quaternion::rotation_x(-6.7 + movement * -0.1 * PI);
+                        next.l_foot.position = Vec3::new(
+                            -skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 - 4.0,
+                            skeleton_attr.foot.2 - 8.0,
+                        );
+                        next.l_foot.orientation = Quaternion::rotation_x(-0.9);
+
+                        next.r_foot.position = Vec3::new(
+                            skeleton_attr.foot.0,
+                            skeleton_attr.foot.1 - 4.0,
+                            skeleton_attr.foot.2 - 8.0,
+                        );
+                        next.r_foot.orientation = Quaternion::rotation_x(-0.9);
                     },
                     _ => {},
                 }

From 40da71bfaf6aaa0b0926af89cfdbe2491f346a42 Mon Sep 17 00:00:00 2001
From: jshipsey <jshipsey18@gmail.com>
Date: Sun, 4 Oct 2020 14:09:44 -0400
Subject: [PATCH 19/23] energy values, remove hotload

---
 common/src/comp/inventory/item/tool.rs | 6 +++---
 voxygen/src/anim/Cargo.toml            | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index f8fcfc9a7f..5c49693408 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -227,7 +227,7 @@ impl Tool {
                     num_spins: 1,
                 },
                 LeapMelee {
-                    energy_cost: 0,
+                    energy_cost: 450,
                     buildup_duration: Duration::from_millis(100),
                     movement_duration: Duration::from_millis(900),
                     swing_duration: Duration::from_millis(200),
@@ -264,7 +264,7 @@ impl Tool {
                     recover_duration: Duration::from_millis(600),
                 },
                 LeapMelee {
-                    energy_cost: 0,
+                    energy_cost: 700,
                     buildup_duration: Duration::from_millis(200),
                     movement_duration: Duration::from_millis(650),
                     swing_duration: Duration::from_millis(150),
@@ -326,7 +326,7 @@ impl Tool {
                     max_projectile_speed: 500.0,
                 },
                 RepeaterRanged {
-                    energy_cost: 0,
+                    energy_cost: 450,
                     movement_duration: Duration::from_millis(300),
                     buildup_duration: Duration::from_millis(200),
                     shoot_duration: Duration::from_millis(200),
diff --git a/voxygen/src/anim/Cargo.toml b/voxygen/src/anim/Cargo.toml
index 10869c6cc3..75bb0ecbe3 100644
--- a/voxygen/src/anim/Cargo.toml
+++ b/voxygen/src/anim/Cargo.toml
@@ -8,7 +8,7 @@ version = "0.7.0"
 name = "voxygen_anim"
 # Uncomment to use animation hot reloading
 # Note: this breaks `cargo test`
-crate-type = ["lib", "cdylib"]
+# crate-type = ["lib", "cdylib"]
 
 [features]
 be-dyn-lib = []

From f6ce3f19577ba0a26fe57a3cc92748ed10488c87 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Mon, 5 Oct 2020 22:21:22 -0700
Subject: [PATCH 20/23] Responded to testing feedback

---
 common/src/comp/ability.rs             |  6 +++++-
 common/src/comp/inventory/item/tool.rs | 23 ++++++++++++-----------
 common/src/states/charged_melee.rs     | 23 ++++++++++++++++++++---
 3 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 10b4e4a25b..251570e3b2 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -158,6 +158,7 @@ pub enum CharacterAbility {
         charge_duration: Duration,
         swing_duration: Duration,
         recover_duration: Duration,
+        is_interruptible: bool,
     },
     ChargedRanged {
         energy_cost: u32,
@@ -526,7 +527,7 @@ impl From<&CharacterAbility> for CharacterState {
                 exhausted: false,
             }),
             CharacterAbility::ChargedMelee {
-                energy_cost: _,
+                energy_cost,
                 energy_drain,
                 initial_damage,
                 max_damage,
@@ -537,8 +538,10 @@ impl From<&CharacterAbility> for CharacterState {
                 recover_duration,
                 range,
                 max_angle,
+                is_interruptible,
             } => CharacterState::ChargedMelee(charged_melee::Data {
                 static_data: charged_melee::StaticData {
+                    energy_cost: *energy_cost,
                     energy_drain: *energy_drain,
                     initial_damage: *initial_damage,
                     max_damage: *max_damage,
@@ -549,6 +552,7 @@ impl From<&CharacterAbility> for CharacterState {
                     charge_duration: *charge_duration,
                     swing_duration: *swing_duration,
                     recover_duration: *recover_duration,
+                    is_interruptible: *is_interruptible,
                 },
                 stage_section: StageSection::Charge,
                 timer: Duration::default(),
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 5c49693408..9eb029f563 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -228,15 +228,15 @@ impl Tool {
                 },
                 LeapMelee {
                     energy_cost: 450,
-                    buildup_duration: Duration::from_millis(100),
-                    movement_duration: Duration::from_millis(900),
+                    buildup_duration: Duration::from_millis(200),
+                    movement_duration: Duration::from_millis(200),
                     swing_duration: Duration::from_millis(200),
-                    recover_duration: Duration::from_millis(100),
+                    recover_duration: Duration::from_millis(200),
                     base_damage: (240.0 * self.base_power()) as u32,
                     knockback: 12.0,
                     range: 4.5,
                     max_angle: 30.0,
-                    forward_leap_strength: 20.0,
+                    forward_leap_strength: 28.0,
                     vertical_leap_strength: 8.0,
                 },
             ],
@@ -251,24 +251,25 @@ impl Tool {
                     max_angle: 20.0,
                 },
                 ChargedMelee {
-                    energy_cost: 0,
+                    energy_cost: 1,
                     energy_drain: 300,
-                    initial_damage: (20.0 * self.base_power()) as u32,
+                    initial_damage: (10.0 * self.base_power()) as u32,
                     max_damage: (170.0 * self.base_power()) as u32,
-                    initial_knockback: 12.0,
+                    initial_knockback: 10.0,
                     max_knockback: 60.0,
                     range: 3.5,
                     max_angle: 30.0,
                     charge_duration: Duration::from_millis(1200),
                     swing_duration: Duration::from_millis(400),
-                    recover_duration: Duration::from_millis(600),
+                    recover_duration: Duration::from_millis(100),
+                    is_interruptible: false,
                 },
                 LeapMelee {
                     energy_cost: 700,
-                    buildup_duration: Duration::from_millis(200),
-                    movement_duration: Duration::from_millis(650),
+                    buildup_duration: Duration::from_millis(100),
+                    movement_duration: Duration::from_millis(800),
                     swing_duration: Duration::from_millis(150),
-                    recover_duration: Duration::from_millis(100),
+                    recover_duration: Duration::from_millis(200),
                     base_damage: (240.0 * self.base_power()) as u32,
                     knockback: 25.0,
                     range: 4.5,
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
index c022659254..e92e5e6b44 100644
--- a/common/src/states/charged_melee.rs
+++ b/common/src/states/charged_melee.rs
@@ -11,6 +11,8 @@ use std::time::Duration;
 pub struct StaticData {
     /// How much energy is drained per second when charging
     pub energy_drain: u32,
+    /// Energy cost per attack
+    pub energy_cost: u32,
     /// How much damage is dealt with no charge
     pub initial_damage: u32,
     /// How much damage is dealt with max charge
@@ -29,6 +31,8 @@ pub struct StaticData {
     pub swing_duration: Duration,
     /// How long the state has until exiting
     pub recover_duration: Duration,
+    /// Whether the state can be interrupted by other abilities
+    pub is_interruptible: bool,
 }
 
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
@@ -50,14 +54,25 @@ impl CharacterBehavior for Data {
     fn behavior(&self, data: &JoinData) -> StateUpdate {
         let mut update = StateUpdate::from(data);
 
-        handle_move(data, &mut update, 0.3);
+        handle_move(data, &mut update, 0.7);
         handle_jump(data, &mut update);
 
+        // Allows for other states to interrupt this state
+        if self.static_data.is_interruptible && !data.inputs.ability3.is_pressed() {
+            handle_interrupt(data, &mut update);
+            match update.character {
+                CharacterState::ChargedMelee(_) => {},
+                _ => {
+                    return update;
+                },
+            }
+        }
+
         match self.stage_section {
             StageSection::Charge => {
                 if data.inputs.secondary.is_pressed()
+                    && update.energy.current() >= self.static_data.energy_cost
                     && self.timer < self.static_data.charge_duration
-                    && update.energy.current() > 0
                 {
                     let charge = (self.timer.as_secs_f32()
                         / self.static_data.charge_duration.as_secs_f32())
@@ -80,7 +95,9 @@ impl CharacterBehavior for Data {
                         -(self.static_data.energy_drain as f32 * data.dt.0) as i32,
                         EnergySource::Ability,
                     );
-                } else if data.inputs.secondary.is_pressed() {
+                } else if data.inputs.secondary.is_pressed()
+                    && update.energy.current() >= self.static_data.energy_cost
+                {
                     // Maintains charge
                     update.character = CharacterState::ChargedMelee(Data {
                         static_data: self.static_data,

From 76e63840ec8671ccd424e007fddb6671d1bb14c5 Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Wed, 14 Oct 2020 12:46:20 -0700
Subject: [PATCH 21/23] Skill icons with proper rotation

---
 assets/voxygen/element/icons/2hhammer_m1.png  | Bin 597 -> 430 bytes
 .../element/icons/skill_axe_leap_slash.png    | Bin 789 -> 501 bytes
 .../element/icons/skill_bow_jump_burst.png    | Bin 675 -> 248 bytes
 .../element/icons/skill_hammergolf.png        | Bin 982 -> 410 bytes
 .../element/icons/skill_hammerleap.png        | Bin 1015 -> 987 bytes
 .../voxygen/element/icons/sword_whirlwind.png | Bin 533 -> 444 bytes
 common/src/comp/ability.rs                    |   3 -
 common/src/comp/inventory/item/tool.rs        |   1 -
 common/src/states/charged_melee.rs            |  13 -
 common/src/states/leap_melee.rs               |   1 -
 .../singleplayer/server_config/admins.ron     |   1 +
 .../singleplayer/server_config/banlist.ron    |   1 +
 .../server_config/description.ron             |   1 +
 .../singleplayer/server_config/whitelist.ron  |   1 +
 userdata/voxygen/logs/voxygen.log.2020-10-12  | 885 ++++++++++++++++++
 userdata/voxygen/profile.ron                  |  18 +
 16 files changed, 907 insertions(+), 18 deletions(-)
 create mode 100644 userdata/singleplayer/server_config/admins.ron
 create mode 100644 userdata/singleplayer/server_config/banlist.ron
 create mode 100644 userdata/singleplayer/server_config/description.ron
 create mode 100644 userdata/singleplayer/server_config/whitelist.ron
 create mode 100644 userdata/voxygen/logs/voxygen.log.2020-10-12
 create mode 100644 userdata/voxygen/profile.ron

diff --git a/assets/voxygen/element/icons/2hhammer_m1.png b/assets/voxygen/element/icons/2hhammer_m1.png
index 17994cdea69006877e1645b590192949239229e0..43eaf3fc2e27e23ea77ddbfd85fc818673543cd2 100644
GIT binary patch
literal 430
zcmV;f0a5;mP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00004b3#c}2nYxW
zd<bNS0004HNkl<ZIE}58v5LY#5Qe`w;%i)?ot>2+DQwi2$ODM2z2fz0Lmoiz8BQAu
zIS>x6v$MI^xWHTycin6@MvnVoAv>9T{4=vz0aR51VD?5$`*kf;)UyES0CJ}}dIH=8
z4Fj9NPe307LtqCQbg9#gHVIJ59+#SK$^~})cng~p0OeV#*W;-UegKRrWxcNu5w6FR
z4IeINyBCqND$^wqBCqs2(19H;XD0n2hs&AM$CphBf^W}8FaG3u<JiJnnOJWelOzdw
zmX=^u$CYuoUjr)u@+_q{jw@wP`a=NbizP{t5RV2G=T(PBBB(0!#nL);OE=C8EFKM7
zfU1ZHyDltWv5rE{9y%;M*rzixQ+^1x-EM<JiJ|~3{VpdcBIH?Woi@QL$EFEpdTNeH
zn=?C#T^9|({NCQT)%X7Y9Qm-qNsgf6v<(KgDTiR@gTjHf!2pEYjqSt!Dxth3{zV<&
Y7d&r62J#t+S^xk507*qoM6N<$f-Cp0O#lD@

literal 597
zcmV-b0;>IqP)<h;3K|Lk000e1NJLTq001Tc001Tk1^@s6s6FYf00001b5ch_0Itp)
z=>Px%4@pEpR9J=W);~+bKo|z_Cn6#hwHCD+OOd1C<{;wWsPqdsh(kVrD2Th8AUL`x
zet=GH>KN=`K^&x?pcE7hR7ER7=vD{0cuB5p?oXo>A1LK6DgE*0y~_cAG{$fJaltg3
z!8yxuJWs4J9_FoH_l<X4*8pOIwF9M+N#B^_`r|;f1JOBl4A<3HF$zi#4u-DP8VxRh
zhopU`3=4wt)oSP-n-CAjhJ~_?4*=4SvK8p)U^{ege(yMhYli|PDi#HlBQpSiO7+Q`
z+vVU|p#Xu3iGV1I2aJM>3}aD25Q||E!Fdr>WEhKT1)``{RTDu8!Du$tR`C2<?|dUV
zSFK(8q<_ie;j!i$vprR*KKU9yO0~4XvYE7R%r?CYN((GlEgBV+7Fafu<~~XlloV`i
zbeN0Ni2@{6<-l|vbFlIL@fo^Sye{MJyd>k0gISJa6il;e69U8F7r<JY$K=S67F1+d
z5El&ZM4=j?9<v<Bs5Kg3Ki!IOkFm|%>9nd6EgNh%@(&Y@^qIe4noW8XI@w(H=5NX`
zAhQYVpWVj0^T!pfuu8=R08FLSH(D*Q@nix3kjs64Z=GI&w-Jj(Tg51jjmk@08b;p&
zHX&F)yu?NE-g}ffqOD@f3lrY=$>u6bi<7V%2R0#1nKwl5uS(iux*n$%80|CQXJx8x
j8A>p^0NC(WXHVq|Sz;tNVXTYC00000NkvXXu0mjftq%h@

diff --git a/assets/voxygen/element/icons/skill_axe_leap_slash.png b/assets/voxygen/element/icons/skill_axe_leap_slash.png
index 4cf85d48a98b35947cfcf97a9ed51059f1477f06..f1674e15cc1b7af1e5da490a994b0a94ed34558a 100644
GIT binary patch
delta 475
zcmV<10VMvF2K57wB!9X|L_t(IPnDIiN&`U<hIbJwK@dr!wihsBm55*!t3)3mF_ogA
z4`7ulRUW`Xuu9A;NUW0HbYhC6HB}T*v=UkQ2mWI=?8S4Nz1+@z`~Nd@8*7Yl&N=hC
zerPxri!1WD-07IFc3Ym8YBkf(X5*O9!~S?|?91AL!{X}XPJf`B3B}q%xttnm-zydO
z-GB2A)KIAWs8(Yr0v{TUM5O|xJ#AatCsd~(32Ko*C<sAA_6beOsr_uV92N<MeSq|U
za^w^+4iqZ{6(ECtx?S01t@VKD0u22g@7Mv_zF5|+flb4~zyszA1^L}9<z&9RAEMU;
z2$h%#wY?~E#edPr>o-7euCHYC$=QWD+RB*ijf{DGp31x1r>Ov`ns7h`h=rYcJywNN
zX-~rdr8*5mETCxo7>Iz7QrLttDug-?q-Hapm&1cVLV0=!##A6?FTa}(h!Y88&M<3O
zDj+O}V6dYLMa##h=bl}0#-hxFF$I6wje%)kx;Ie>T~uX#tx01i+0>hKr?aJ4S#J#&
z>}&yaAl2(lZ0gX3Yn!E<oBaZ20|C`z-p!3$z~O5^!}g-c+xXuf_zU<2y@y`1)YzWq
R00000NkvXXu0mjf001a);-3Hj

delta 765
zcmV<Z0s{T@1C<7lB!7fyLqkwWLqi~Na&Km7Y-IodD3N`UJ4nM&6o&t%iVs>GEF$8N
zp*mR*6>-!m6rn<>6<T#Lx#<g<G$bi5j)H5!!N+3N!Nplu2UkH5e1JGPIw`tHiRUJT
z7BL>U+>igB|L5Lw0ij-In$<B5Xu55t5^*t;T@|}t(StAo7=Hj{W*Kvml!R}6-BTyk
zU5sb>_x)L6HD@s(AQI0q!?cMvh^IGggY!OdgcW6#_?&pmqze*1a$WKGjdQ_efoDd{
zbZVYBLM#^ASZQNcG&SNW;;5?WlrLmFRyl8R*2-1ZyeEHQD5tM1bDh>O5?I6%B#2N@
zMG0lth|#W-Vt*k;=W!qZkn5MorI4!xMvetkph0&1;D7LYwpM;}!b=LpfzB7l`4|DZ
zc7aCCalVfor*Q%VpMfjA<*(F%nNQMdEiHNk^lbwd*DX!i11@)f!6!pDWmgK)67qTA
z{fxdT3-sRty=&gwn&&uu0Maz8<PC6e2#gjed)?>V-GA+K`?se#zaQGqa%y0n&4mB}
z00v@9M??VZ02%;E3f4|D00009a7bBm001r{001r{0eGc9b^rhX2XskIMF->w4FMhj
z9RDol0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN?MXyIR5;76
zRlyCzAb$+B5ep#Y!3qqKMKWMk=l~gl4Jv+Y5c;T$tP2pT#u5@-;Osjmgo%iP&xIa{
zm>jbvJIqGwx!1V_Vxv7~HoH!y12H=yX%Vy%=`gdK*K@CH#C2l+w;^bS5l}`?%52zQ
z{F>>$#f?bZBIqSQ%=VRx#@=-s?a}A$j9(*}7<SWLmTtDlyDxT3j`g=4ljGoXiOKOo
zM8Q*8-mi)gIl9~hdJ%jsGW4?%hUbl5NQHQCgoz5ms<iYL$!M;5noZGO>I$@{y?az7
vGfF@U?w-qB2n$wq@dmtZRbDH5@)z&{e$C}2nuAt^00000NkvXXu0mjf!T3$i

diff --git a/assets/voxygen/element/icons/skill_bow_jump_burst.png b/assets/voxygen/element/icons/skill_bow_jump_burst.png
index cc77937ec3f76328e291a0b11eb44e9589289180..50466fafcc621e1c1dac8e0928e250962da76eeb 100644
GIT binary patch
delta 232
zcmZ3?`h#(TL_G^L0|P_-at1pf#aJBV?!<WWq)t7M!&%@FS<Jw|Eeyhp4727)00o5t
zd_r7-^nO*<H&UKo7A^Y!|Nr)l>-O61hyaS#d%8G=RLsdecaZal0|#pW^E=yHjpxD^
zh$$3upHTg~eUsOrd15T`hv)ZiSgEyf`r8A7%MxEVyKOK!&736>5!z|aTrKBxdFkdC
zk+O2vZ2zycUu3%_uQ_klUC{~GD@{H-bzI+5wLUF!-sJiDzK>tD70gYZ#<2U7bZbOH
f@}f|uE%l5H77Bhh7atS{x`n~h)z4*}Q$iB}NQYYQ

delta 663
zcmV;I0%-mC0iy+w7=H)`0001ui5(3900D$)LqkwWLqi~Na&Km7Y-IodD3N`UJxIeq
z9K~N#r79H%BS>+GP@OD@ia2T&iclfc3avVrkA6Xuh9t$sQE)9d__0`ZaB<ev!Br3h
zKR}!uofKW9#Q!CQ7BL<i_v78Y$K5-CtCtnc>KF$!-8NH+xPOqzt_q=7bYlQKA{dqw
z%a{|zBz(u$JpydKi?J;KbAOIrHD@V6Kp>t~4AUmwAfDc|4aWP#yi$}@;&b9LlP*a7
z$aLA`H^v2*IhM(r>C`+iPb?JLSZ-sbXlle$#8Fk#DWA)DtTNtWtd*-u^PcR5;hes*
z%ygPVNMI355Pu;+MinKLVIxMXPKt#T?Z<um5!Wx0OD0zd3ON=~fd<L-gZ;tpZms;}
zgqIYK1D!99^DzR1c7aCCalVfor*Q%VpMfjA<*(F%nNQMdEiHNk^lbwd*DX!n11@)f
z!6!p9C07d4<nnpo{fxdT3-sRtJ!@WX&3&9c0BPzfd4B^O90H>S%3k+*cUOCF|DI{~
z_XB#Oa;icfUh@C|00v@9M??VZ02%;E3f4|D00009a7bBm001r{001r{0eGc9b^rhX
z2XskIMF->w6%-s3QZOOM0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht
z7XSbNdw)qpK~y-)V_+EBKvUxVe@e|@qPC-0aJlsQ3qeL?8k;(Fx$7?k8JURj>h%|b
zjM!*&c@!_B8%j!eQX}kf8b<X<VH&jQZ}55<XQXIKy#Eiw$O@5ZY;1HxnUE7FdV<B3
x!11w}s2!0QUM5Bpx=*m_CE0aU&2IPr0L<H43lO;}!<hg8002ovPDHLkV1lvW6hr_3

diff --git a/assets/voxygen/element/icons/skill_hammergolf.png b/assets/voxygen/element/icons/skill_hammergolf.png
index 74bcf2fc32595d5584a189b6f4b628b867d25f78..af1a8499624cc4427f5b44ab186bfda03742680f 100644
GIT binary patch
delta 395
zcmV;60d)S>2bu$r8Gi-<0051N9Sr~g00eVFNmK|32nc)#WQYI&0Z~arK~y-6rIRsk
z!axv3-=Lg=f*VjGA<~hSih56Anc7_nI_g-QfSQUHx*#M<Za~2`CWY6_j=d&?e95vs
zw%@*4?+Ty*ORBsBAAqWY2<_zdR=>ifh#(4zDkAa(v>SG>fqyEfsw$vMf9xxB^$*m9
zT)R>k270%tM5fi)iO7PUEeNX0r@#FM_I_^4^$LL7?qJ|8rZMa=tp~X64s5Sy=7SOa
z+0>fK0)V&lFw$x>hCNCzS@p2G&H4<my`DoY4Cw9Bh7l~!3U0eY0G*DP@Y;MZYAzz6
zYyhJ+^Q^!*M}L1drChH}t7Z-(JKJ&uE7vQWbBrfLoO9$^5kTE38!bma;&i+)o(#ho
ztZCb>3>e$8`Ma(K&9j2JpVOvU8u$eCZkJx%Ppm@=-E5Ly+&@k3lsb*YU6s1+eg}GJ
p)BbhC7n0t3{{cR3;BOJ&2kradS_Kf*;s5{u07*qoL<FuvV1jglwPFAO

delta 971
zcmV;+12p`a1J(zS8Gix*0008(idp~w0fT8nLr_UWLm+T+Z)Rz1WdHyuk$sUpNW(xJ
z#a~lPRVohcAmWgrI$01Eanvdlp+cw?T6HkF^b498k`xz5!L{Jv$70pN#aUMeS3wZ`
z0C943Qgo3L|Cbb6#CUMrk9YSTckck9QDvIdH3n$9ZDvwQF@Kj|5yP+OK?qR@h|A0}
zW+f>N-|=;i0AKGCJj?&wpQBGLSPTe=#52q=ZQ^y}sZHD9yiXisWmzRYCmuEFg2azp
zS3G{>Tyk09nK3h)nIn!7i=_@$I+&GBjd+qcu4+2v3ptNf&Rd+dYK^t-$zK>L=*vr7
zr#XZa7O)5jB7YRrP(c+o613{1Sjf<R(#JpO`XzEH<f?#?V;&pOAiI9>Klt6PRh$_2
zk|IeU^x`-l!$5c!Xx1I)``B@sCqVESxYFDHjRr9NNqW7l#gBmgZQ$a%ttorJ<qk0L
zWXPuMN<o@Ju?W1M(KqFR=q=E@>h;#z$LRx*rLNL9z<<FZFjAuIHJ^8PclP%0nO1*4
z8-Q|zKU=Qq00009a7bBm001r{001r{0eGc9b^rhX2XskIMF->w1rr4v4B6CF0000P
zbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbO!AV3xR5;6hlRr*lF%ZUo
zj%ZhUsei%=5CuX)9AP=cYa<Ro@6_ZHv@{g-C~~@O-9(PGdjp3iB~ns+Ta2HdlSMmn
zF}7#E`TIFZILEgV0>Hxq5{m`EatRP4@9)6H_nv)UjPCD&a~pdE1d36n)RXhc)eK@(
z&f`}~7lgomUyxGb=4L=0%8_<E$ePV4$xCdvTz_2+*pgDx;h+%I_gbwa3H0$H$uHy=
zlK1jn5}oK2qnsp*<fZ`H^KTbiCqTb<fV-Ymvx&L6DcYl7TaL%l<QVZD;Bbg*04^`t
zY)(*P6rGBIQc?&CK~m{WO2x)|<!m`y+E@)%xxJdiC`nqatRr+%&hoxGOPW~xuemQt
z)_+<4#7*J$w!Z(_09Xmymx+i@{zq2MwS+b|n{d%per@u!rZpc!Dc2Ab!U)t<S9YaB
zlx5NgBrxaNj-o@eB(3CZy_NSR-8zECcrxsPD`&kfOY-^2@yK#H(qNeFs4E14-rmYo
z>^iJ|iPMtg^|k6wm8&Mt&m#w0o}2}@bVNpqwRG!yy}X=IGDdl?wnsqW${B(Gb8^<>
tqn@554XvxF^ZAKs+kAWRUUzrq{1-PG4@q#Ln~VSe002ovPDHLkV1l9}!z};+

diff --git a/assets/voxygen/element/icons/skill_hammerleap.png b/assets/voxygen/element/icons/skill_hammerleap.png
index 600bd24e66b9422216a4878bf3ed5b94211cb3eb..658625848e855324f51fe7607b4c5862f01fd826 100644
GIT binary patch
literal 987
zcmV<110?*3P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iQ;Sln4i*t{$WWau6cusQDionYs1;guFu8t0lZGV4
z#ZhoAIQX$xb#QUk)xlK|1V2EW9Gw(hq{ROvg%&X$9QWhhy~o`<KxkB$YIel{RkMs#
zA}(gKt77*ng6Km4gNVt@)aN8A3D5C$4<BFeqCCs{+@GU2mp2*U6NzV;Zdk+{#M7IW
z&Uv3W%t~^O_?&p$pbHW|a$RxxjdRgqfoFz|bZVYBOe_{VSm|I^GF0Lz;z&-_C|}69
zoa4O3S*_Gq>z@3Dp}e-T%ypV0NMI35kRU=q4P{hdAxf)8iis5M$36VRj$a~|Las6x
zITlcb3fb|4|H1EW&BEk_n-q!zffw8U7zMg_fo9#dzmILZc>?&Kfh(=;uQq_0Ptxmc
zEpi0(Zvz+CZB5w&E_Z;TCtWsVNAlAY3I*W(jJ_!g4BP_2HMh6cK29HiG<B7{0S*p<
zu_9%!d%U}+v$ucGwEFu2VOnya@WKTP00006VoOIv08juV02JiTPW1o)010qNS#tmY
zE+YT{E+YYWr9XB6000McNliru<O&W27!HUA>k|L~02y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00FZ}L_t(I%bk-wOJhM4hM#l2+a!XrNiMjt@go<O#bzZe
ztWC;nY^=q!{scRJgnz-pVt+ueGu6W4M-#BPh&Bd6jq8G@5jhq*<K%wn?hDh*ne&|Y
zoS6}TzpJYXaJ0YA|LAMI4#33Dj(7%^r$!Xfh@v;ad$pQ+W6frwQXD2Ch)62b&8cs0
z;scB|n>_CBX2RCKQ~(eWRF!TRCe9jTUa{RC*+_G_FkN9`x{~S6<QCg)yg{{vf##`q
zewDiK!UokAURp5jvUh%!aG2H!@C<Za=Cz*J>Y&;Jc)paZHryGyEyv>thiP)>8lPY8
z%&$NFP_tB3@3yy9RTaox?pal}4FC4SJ(CZ`k?JDC@xejvt(!M#?!dO}!d(42{GGX<
z6$9`~{f@0LsJ1BeI{=)Wo{Sv)zWB|8+?eaG)bHST!;nTlN(4>f%<Q~%7BAw00J>p_
z?A2;&{%w3lc{1}eGXLA((mw$FT>1>a_~ggbgt#`AmjJlCy#e6jg(EBTWt%w_lt-X%
z$-*wLUoR!lA(v9HfvKQu557k(EYKkWus&B%z=Ho(fe!66d;*Ts&~M!-7Qg@i002ov
JPDHLkV1g&<!-xO?

literal 1015
zcmV<T0|@+yP)<h;3K|Lk000e1NJLTq001Tc001Tk1^@s6s6FYf000BNNkl<ZSPAV|
zO;1xn6uoVTApr`64<n$cK_qdZ!Ng$V&IK!7Xre#Bu<#GK@)xl22k;AA=*Erii5j9r
z7fk@Gf`Y*oC=?J1F_<&$8ShNzy_N{X1(V>+J@?#m&ztv{$1@=!dm<upef`p#nZeSI
z5QZf1+r@%Byg6jJ&)=oZoLk>C^LBApUN*K?=&`nzK1rkWAO2&F`B!n2UPHaDv7<Cn
zORr;Nwd|7S9PgOkjkq<AB8(&#A#&)qCB)kg7N@Dt&HwgR*5L}YQ+@URZpK}$t_!WT
zR!GP9P!|#bMxl|Ol%b5x7c2%~XZLqhsl}-Qz}E?xvxOp(h<aB-6k@NQjT-*&-AB4^
z-)pUdi`2&a-GaE?F%UxpI-oG)gPNmyT4Pa-@@pGWsYAsbV|shp_1ESWmxnTkdSVwH
zW1-H|nRy33-QD5D>8V*KzBF*wiN7!8oVZ%RTU*swXGe>pRovON@%s-m(%RBwV=P`z
zq~+?B(&>%ZuXo5XLF~yNQ)f~%m0w*K{9q8PRvXH5w~&iHU_nSv%~_2zJ)L%q#bS0v
znp2HZUw^`!JX_m4vR2rTj&^sKzs+Zzx=^4^A#ZMF+)>fkP;Yfs@&&ubqWe_4WWFpo
zSl{_>ad~@E(!i$$j?K#9n*zf=V^QX^OL=t;YvEF(RH~tTMwfEgrPa#L7BSyFHo_ug
z3b-|fAY?ALyjJ>-vhN6W;q2q*h-(Y_n#y>TsS0B>cmKwq$YSYW&1Um|UtAO~ZI*6Z
z{s>eM&FWdD(W7^KQX%fr*)gV`j!(*H`46_O?V?B`A(_wavqWyKGoC&Dh@nT^;Pq5+
zu+13!tKeE^n~6XD$jODS4teqBqnvDZ&oGMoTw9lc-Y&x<Hj!O6OT552LZ?1+jxm}+
za%}LN;m`;RFcX8h(71K|vVqCd9F2`kezhszWMZzb-#)4|19n?egS?%dm7$C7D@J2_
zjT*!ly2j^_2hMW&zZ8IJlZX?K?+sgHFvAfiNDgM77iA7y8V+%^NpS1588*@)SYuGE
z99EsQVHiS8Ove<WX~u~s5AN6<V{@Mrg+nBiBZj=zBCav5K~u=vuOt>R>Ce8HpO1>Q
zE;TfUI^xto-Wb!w5Qzo;tm|~n*9hfMtLst2AMlfYQj2gM*NB|BS@!@>>(QX*Aa8G_
zCbNkq6XP70WAl(E>q9xMX^d4PQS4u4-IO|UeUqUi3lCz}`cdXI2R*^Fw^EzX0)7z-
lH9ra?M{7V^>xVeN{s5!)#CdcUABF$`002ovPDHLkV1i$u@V@{6

diff --git a/assets/voxygen/element/icons/sword_whirlwind.png b/assets/voxygen/element/icons/sword_whirlwind.png
index 870477f40ac041e78ee889937bcd74a66d29d6cd..bdee6f09474ba127709edef65a0aef699a7d64e4 100644
GIT binary patch
literal 444
zcmV;t0Ym<YP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0004lNkl<ZI8UvW
zy-Nc@5XEP)RJ71EYI^|@8$)`_#KK0fiHU!Wf|ZqmqE$W$!A3;OSP4R|5*0#F1hr8c
z!TRJ4&N8>Rdj@fu8}{aY`{vEEXNV~2MiC(v%VmBdMk*DXkJjrp_az@Q%e*}GdO@Ze
zMage4`M`xuzMR`7sbOHAvJgy20{s&ZAL|YNMWH~9F_a|iR%(;nmQjp>xNXDywbd0m
zJ~^fL>8c$Fk_^zD@Gwx+tj`x{VYc80hM>}(Zd=1{p5Ma2JShA_-1U02wNYhdfVFOa
zfbKce=M4v34z>oN<|@9X$A<wuowXQ-A$bqB0LR;HPF;|OA>Z8Iu|u*ztuhbfgRwGW
z7@7eB=2PT?L>XXT%_es;)@Y=GOZ`5>V73l;g@9iYXj8*v-73_uxl)Pl<CtsmV4t;G
z>Q-XE<+c$Zb_Gm8A!UI1!V5e)*vqu2Jqy8t3IWu94GZ%E5BGP21ISZmha$fK@zCcB
me7!6d?JIpD>-vdKhrR*B$Q;_EX~Mn$0000<MNUMnLSTX=?!`j@

literal 533
zcmV+w0_y#VP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T700001b5ch_0Itp)
z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0jfzvK~z{r?bpvM
z1YsP<@n<*^2V8L7Ey=~UcgN-6qFmOlzlL&hqKMP}I4Bp1BPXSHPC{)Wg$pjqdCh$1
z`KbBoX`Xr5ZJsCZTAwMJ?5mxb))PW>f|oeU<-+-Hwpf%$@%l?8c@%G;Qjteyy-zI2
zqo~oBQ`$cInc=)Zjs%gZ92ZDx<oQG%#pCC(N3d6NJT7USVAuY^P)7AR3rqSv`u_}a
zCC>|Qy}`}56T5jR&*QEj(v`%MVR>nh_Tcb{_HBHg7UA!Z{er05l4xamjCN)+T6YAI
zt|Wq}>S{(@?&|54);&R#R+5X|v|6<5tI<`=<?7eA2_jQTT`_dwU(!C@-_brE*J&Y#
zCyl#;Lyd+!ib@hgTn?>mY|`@kqkV#iOPY$IBsqNMa9&8-F9^B65<^_>vsR-;gVidn
zy@GS?HZA0I#gM5S&pttw+*F}Jd+YnO$W-p5T&7KWrrR%wcMLf$hSJLE=8oY0?lvt_
ziJ{-hA@>A(C5P-6+}qirMcukuRb^i=c+p!9B*Xb3s2k+Y^Lbic+V48U%_eQe1%>zm
XyTTZ4KjnWq00000NkvXXu0mjfKg;^{

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 251570e3b2..070c88b584 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -158,7 +158,6 @@ pub enum CharacterAbility {
         charge_duration: Duration,
         swing_duration: Duration,
         recover_duration: Duration,
-        is_interruptible: bool,
     },
     ChargedRanged {
         energy_cost: u32,
@@ -538,7 +537,6 @@ impl From<&CharacterAbility> for CharacterState {
                 recover_duration,
                 range,
                 max_angle,
-                is_interruptible,
             } => CharacterState::ChargedMelee(charged_melee::Data {
                 static_data: charged_melee::StaticData {
                     energy_cost: *energy_cost,
@@ -552,7 +550,6 @@ impl From<&CharacterAbility> for CharacterState {
                     charge_duration: *charge_duration,
                     swing_duration: *swing_duration,
                     recover_duration: *recover_duration,
-                    is_interruptible: *is_interruptible,
                 },
                 stage_section: StageSection::Charge,
                 timer: Duration::default(),
diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs
index 9eb029f563..e8b9132860 100644
--- a/common/src/comp/inventory/item/tool.rs
+++ b/common/src/comp/inventory/item/tool.rs
@@ -262,7 +262,6 @@ impl Tool {
                     charge_duration: Duration::from_millis(1200),
                     swing_duration: Duration::from_millis(400),
                     recover_duration: Duration::from_millis(100),
-                    is_interruptible: false,
                 },
                 LeapMelee {
                     energy_cost: 700,
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
index e92e5e6b44..e266fe99bf 100644
--- a/common/src/states/charged_melee.rs
+++ b/common/src/states/charged_melee.rs
@@ -31,8 +31,6 @@ pub struct StaticData {
     pub swing_duration: Duration,
     /// How long the state has until exiting
     pub recover_duration: Duration,
-    /// Whether the state can be interrupted by other abilities
-    pub is_interruptible: bool,
 }
 
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
@@ -57,17 +55,6 @@ impl CharacterBehavior for Data {
         handle_move(data, &mut update, 0.7);
         handle_jump(data, &mut update);
 
-        // Allows for other states to interrupt this state
-        if self.static_data.is_interruptible && !data.inputs.ability3.is_pressed() {
-            handle_interrupt(data, &mut update);
-            match update.character {
-                CharacterState::ChargedMelee(_) => {},
-                _ => {
-                    return update;
-                },
-            }
-        }
-
         match self.stage_section {
             StageSection::Charge => {
                 if data.inputs.secondary.is_pressed()
diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs
index bbd844f630..8505759d50 100644
--- a/common/src/states/leap_melee.rs
+++ b/common/src/states/leap_melee.rs
@@ -33,7 +33,6 @@ pub struct StaticData {
 }
 
 #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
-//#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
 pub struct Data {
     /// Struct containing data that does not change over the course of the
     /// character state
diff --git a/userdata/singleplayer/server_config/admins.ron b/userdata/singleplayer/server_config/admins.ron
new file mode 100644
index 0000000000..0637a088a0
--- /dev/null
+++ b/userdata/singleplayer/server_config/admins.ron
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/banlist.ron b/userdata/singleplayer/server_config/banlist.ron
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/userdata/singleplayer/server_config/banlist.ron
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/description.ron b/userdata/singleplayer/server_config/description.ron
new file mode 100644
index 0000000000..47474ec828
--- /dev/null
+++ b/userdata/singleplayer/server_config/description.ron
@@ -0,0 +1 @@
+"This is the best Veloren server"
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/whitelist.ron b/userdata/singleplayer/server_config/whitelist.ron
new file mode 100644
index 0000000000..0637a088a0
--- /dev/null
+++ b/userdata/singleplayer/server_config/whitelist.ron
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/userdata/voxygen/logs/voxygen.log.2020-10-12 b/userdata/voxygen/logs/voxygen.log.2020-10-12
new file mode 100644
index 0000000000..d953b35df0
--- /dev/null
+++ b/userdata/voxygen/logs/voxygen.log.2020-10-12
@@ -0,0 +1,885 @@
+Oct 11 18:00:01.436  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:00:01.996  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:00:02.329  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:00:02.427  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:00:02.968 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
+
+A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
+
+> What should I do?
+
+We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
+
+https://www.gitlab.com/veloren/veloren/issues/new
+
+If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
+            
+> What should I include?
+
+The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
+            
+Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
+            
+> Error information
+
+The information below is intended for developers and testers.
+
+Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
+PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
+Game version: 702f7e51 [2020-10-12]
+
+Backtrace:
+   0: veloren_voxygen::main::{{closure}}
+   1: std::panicking::rust_panic_with_hook
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
+   2: std::panicking::begin_panic_handler::{{closure}}
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
+   3: std::sys_common::backtrace::__rust_end_short_backtrace
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
+   4: rust_begin_unwind
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
+   5: core::panicking::panic_fmt
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
+   6: core::option::expect_none_failed
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
+   7: veloren_voxygen::main
+   8: std::sys_common::backtrace::__rust_begin_short_backtrace
+   9: std::rt::lang_start::{{closure}}
+
+Oct 11 18:04:17.781  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:04:17.977  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:04:18.008  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:04:18.130  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:04:18.313 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
+
+A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
+
+> What should I do?
+
+We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
+
+https://www.gitlab.com/veloren/veloren/issues/new
+
+If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
+            
+> What should I include?
+
+The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
+            
+Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
+            
+> Error information
+
+The information below is intended for developers and testers.
+
+Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(776) : error C0000: syntax error, unexpected \\\"<<\\\" at token \\\"<<\\\"\\n0(784) : error C0000: syntax error, unexpected \\\">>\\\" at token \\\">>\\\"\\n0(784) : error C0159: invalid char \\\'d\\\' in integer constant suffix\\n0(784) : error C0159: invalid char \\\'c\\\' in integer constant suffix\\n0(784) : error C0159: invalid char \\\'b\\\' in integer constant suffix\\n0(784) : error C0158: invalid digit \\\'8\\\' in octal constant\\n0(786) : error C1503: undefined variable \\\"wind_offset\\\"\\n0(789) : error C0000: syntax error, unexpected \\\"<<\\\" at token \\\"<<\\\"\\n0(793) : error C0159: invalid char \\\'d\\\' in integer constant suffix\\n0(793) : error C0159: invalid char \\\'c\\\' in integer constant suffix\\n0(793) : error C0159: invalid char \\\'b\\\' in integer constant suffix\\n0(793) : error C0158: invalid digit \\\'8\\\' in octal constant\\n0(796) : error C1503: undefined variable \\\"cloud\\\"\\n0(796) : error C1503: undefined variable \\\"turbulence\\\"\\n0(825) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
+PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(776) : error C0000: syntax error, unexpected \"<<\" at token \"<<\"\n0(784) : error C0000: syntax error, unexpected \">>\" at token \">>\"\n0(784) : error C0159: invalid char \'d\' in integer constant suffix\n0(784) : error C0159: invalid char \'c\' in integer constant suffix\n0(784) : error C0159: invalid char \'b\' in integer constant suffix\n0(784) : error C0158: invalid digit \'8\' in octal constant\n0(786) : error C1503: undefined variable \"wind_offset\"\n0(789) : error C0000: syntax error, unexpected \"<<\" at token \"<<\"\n0(793) : error C0159: invalid char \'d\' in integer constant suffix\n0(793) : error C0159: invalid char \'c\' in integer constant suffix\n0(793) : error C0159: invalid char \'b\' in integer constant suffix\n0(793) : error C0158: invalid digit \'8\' in octal constant\n0(796) : error C1503: undefined variable \"cloud\"\n0(796) : error C1503: undefined variable \"turbulence\"\n0(825) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
+Game version: 702f7e51 [2020-10-12]
+
+Backtrace:
+   0: veloren_voxygen::main::{{closure}}
+   1: std::panicking::rust_panic_with_hook
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
+   2: std::panicking::begin_panic_handler::{{closure}}
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
+   3: std::sys_common::backtrace::__rust_end_short_backtrace
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
+   4: rust_begin_unwind
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
+   5: core::panicking::panic_fmt
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
+   6: core::option::expect_none_failed
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
+   7: veloren_voxygen::main
+   8: std::sys_common::backtrace::__rust_begin_short_backtrace
+   9: std::rt::lang_start::{{closure}}
+
+Oct 11 18:13:02.407  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:13:02.590  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:13:02.610  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:13:02.689  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:13:02.861 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
+
+A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
+
+> What should I do?
+
+We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
+
+https://www.gitlab.com/veloren/veloren/issues/new
+
+If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
+            
+> What should I include?
+
+The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
+            
+Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
+            
+> Error information
+
+The information below is intended for developers and testers.
+
+Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
+PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
+Game version: 88d6c645 [2020-10-12]
+
+Backtrace:
+   0: veloren_voxygen::main::{{closure}}
+   1: std::panicking::rust_panic_with_hook
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
+   2: std::panicking::begin_panic_handler::{{closure}}
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
+   3: std::sys_common::backtrace::__rust_end_short_backtrace
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
+   4: rust_begin_unwind
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
+   5: core::panicking::panic_fmt
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
+   6: core::option::expect_none_failed
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
+   7: veloren_voxygen::main
+   8: std::sys_common::backtrace::__rust_begin_short_backtrace
+   9: std::rt::lang_start::{{closure}}
+
+Oct 11 18:17:38.536  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:17:38.764  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:17:38.786  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:17:38.882  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:30:57.586  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:30:57.777  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:30:57.796  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:30:57.875  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:30:58.071 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
+
+A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
+
+> What should I do?
+
+We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
+
+https://www.gitlab.com/veloren/veloren/issues/new
+
+If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
+            
+> What should I include?
+
+The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
+            
+Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
+            
+> Error information
+
+The information below is intended for developers and testers.
+
+Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
+PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
+Game version: 88d6c645 [2020-10-12]
+
+Backtrace:
+   0: veloren_voxygen::main::{{closure}}
+   1: std::panicking::rust_panic_with_hook
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
+   2: std::panicking::begin_panic_handler::{{closure}}
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
+   3: std::sys_common::backtrace::__rust_end_short_backtrace
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
+   4: rust_begin_unwind
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
+   5: core::panicking::panic_fmt
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
+   6: core::option::expect_none_failed
+             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
+   7: veloren_voxygen::main
+   8: std::sys_common::backtrace::__rust_begin_short_backtrace
+   9: std::rt::lang_start::{{closure}}
+
+Oct 11 18:43:31.798  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:43:31.981  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:43:32.010  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:43:32.094  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:45:09.368  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 18:45:09.555  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 18:45:09.575  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 18:45:09.637  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 18:45:11.166  INFO veloren_voxygen::singleplayer: Saves folder doesn't exist, but there is one in the old saves location, copying it to the new location
+Oct 11 18:45:11.267  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 11 18:45:11.267  INFO veloren_server: Authentication is disabled
+Oct 11 18:45:21.481  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 11 18:45:25.523  INFO veloren_world::civ: all sites placed cnt=192
+Oct 11 18:45:41.288  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (88d6c645)"
+Oct 11 18:45:41.288  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 11 18:45:41.292  INFO scheduler{p=sjGg8V}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:21040
+Oct 11 18:45:41.292  INFO scheduler{p=ILg9mh}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:36746
+Oct 11 18:45:41.293  INFO scheduler{p=sjGg8V}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=ILg9mh
+Oct 11 18:45:41.293  INFO scheduler{p=ILg9mh}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=sjGg8V
+Oct 11 18:45:41.492  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32401.596704352))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32409.786351744))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32410.908720815998))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32411.626319519997))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.018207839996))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.211516559997))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.303108575998))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.481935408))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.873735168))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32413.659428783998))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32414.857275551996))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32416.500438383995))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32418.522596543997))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32420.823689951998))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32423.277984528))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.771826016))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32428.216514256))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32430.538930608))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.690225568))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32434.592518416))
+Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32436.338156352))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32437.884218208))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32439.251325072))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32440.472470704))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.594921952))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32442.667095216002))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.740258960002))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32444.86450944))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32446.089736272002))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32447.442419664003))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32448.936762))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.56528152))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.310993184))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.142392864))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.022858144))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32457.918928272))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.799781056))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.636173504))
+Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32463.412895424))
+Oct 11 18:45:42.645  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 11 18:45:42.647  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 11 18:47:45.068  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
+Oct 11 18:51:46.829  INFO scheduler{p=sjGg8V}::participant{pid=ILg9mh}: veloren_network::participant: Channel got closed cid=0
+Oct 11 18:51:46.830  INFO scheduler{p=ILg9mh}::participant{pid=sjGg8V}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 11 18:51:46.830  INFO scheduler{p=ILg9mh}::participant{pid=sjGg8V}: veloren_network::participant: Channel got closed cid=0
+Oct 11 19:38:50.989  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 19:38:51.499  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 19:38:51.518  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 19:38:51.618  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 19:38:53.656  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 11 19:38:53.656  INFO veloren_server: Authentication is disabled
+Oct 11 19:39:02.245  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 11 19:39:05.658  INFO veloren_world::civ: all sites placed cnt=192
+Oct 11 19:39:18.263  INFO veloren_server: Server version version="Pre-Alpha-2020-10-11 (8bd1f763)"
+Oct 11 19:39:18.263  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 11 19:39:18.692  INFO scheduler{p=4kn15H}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:50694
+Oct 11 19:39:18.692  INFO scheduler{p=rdN34G}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:17428
+Oct 11 19:39:18.693  INFO scheduler{p=rdN34G}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=4kn15H
+Oct 11 19:39:18.693  INFO scheduler{p=4kn15H}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=rdN34G
+Oct 11 19:39:18.876  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32422.05936024))
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32429.407656144))
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32430.61712952))
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32431.47577872))
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.0034276))
+Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.35027992))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.624620128))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.996397888))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32433.541361568))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32434.400804112))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32435.642454768))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32437.270977744))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32439.234546048))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.44027032))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.783458335998))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32446.171296864))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32448.516490079997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.755642271997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.842910223997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.755747231997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.481281663997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32458.025927999995))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.408609759994))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32460.660578351995))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.827083807995))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32462.946510863996))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32464.069834463997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32465.247272591998))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32466.515769648))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32467.897204896))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32469.405831599997))
+Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32471.036367888))
+Oct 11 19:39:19.779  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 11 19:39:19.784  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 11 19:40:50.805  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
+Oct 11 19:41:48.561  INFO scheduler{p=rdN34G}::participant{pid=4kn15H}: veloren_network::participant: Channel got closed cid=0
+Oct 11 19:41:48.561  INFO scheduler{p=4kn15H}::participant{pid=rdN34G}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 11 19:41:48.561  INFO scheduler{p=4kn15H}::participant{pid=rdN34G}: veloren_network::participant: Channel got closed cid=0
+Oct 11 19:45:44.326  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 11 19:45:44.964  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 11 19:45:45.002  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 11 19:45:45.138  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 11 19:45:47.380  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 11 19:45:47.381  INFO veloren_server: Authentication is disabled
+Oct 11 19:45:57.634  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 11 19:46:01.221  INFO veloren_world::civ: all sites placed cnt=192
+Oct 11 19:46:17.198  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (88d6c645)"
+Oct 11 19:46:17.198  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 11 19:46:17.413  INFO scheduler{p=B4GN1M}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:20264
+Oct 11 19:46:17.413  INFO scheduler{p=/jADhb}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:47894
+Oct 11 19:46:17.414  INFO scheduler{p=B4GN1M}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=/jADhb
+Oct 11 19:46:17.416  INFO scheduler{p=/jADhb}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=B4GN1M
+Oct 11 19:46:17.698  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32411.063976671994))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32424.006517103993))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32424.935257583995))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.278388367995))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.368757103995))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.392961247995))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.417337663996))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.461246623996))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.533457343998))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.824586895997))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32426.486599391996))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32427.616724447995))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32429.224074431993))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32431.242758447992))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32433.56481700799))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32436.12195892799))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32438.60421983999))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.08186910399))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.43790590399))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32445.63919703999))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32447.627582207988))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32449.406751359988))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.97355751999))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.35679972799))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32453.57595835199))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.67442942399))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32455.71413510399))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.75004782399))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32457.83747951999))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.03676340799))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32460.357089999987))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.823537999986))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32463.436603103986))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32465.175466415985))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32467.012395599984))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32468.901964175984))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32470.817712767985))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32472.719038559986))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32474.578426559987))
+Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32476.372692383986))
+Oct 11 19:46:18.825  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 11 19:46:18.831  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 11 19:46:59.575  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
+Oct 11 19:53:12.266  INFO scheduler{p=B4GN1M}::participant{pid=/jADhb}: veloren_network::participant: Channel got closed cid=0
+Oct 11 19:53:12.266  INFO scheduler{p=/jADhb}::participant{pid=B4GN1M}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 11 19:53:12.266  INFO scheduler{p=/jADhb}::participant{pid=B4GN1M}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:05:28.209  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:05:28.783  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:05:28.800  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:05:28.859  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:05:46.002  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 12 12:05:46.002  INFO veloren_server: Authentication is disabled
+Oct 12 12:05:55.855  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 12 12:05:59.768  INFO veloren_world::civ: all sites placed cnt=192
+Oct 12 12:06:14.173  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
+Oct 12 12:06:14.173  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 12 12:06:16.023  INFO scheduler{p=bkeuPw}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:18291
+Oct 12 12:06:16.023  INFO scheduler{p=aQiAfK}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:47260
+Oct 12 12:06:16.024  INFO scheduler{p=bkeuPw}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=aQiAfK
+Oct 12 12:06:16.024  INFO scheduler{p=aQiAfK}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=bkeuPw
+Oct 12 12:06:16.178  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 12 12:06:17.053  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32488.92802972801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.21413668801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.40452857601))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.23670424001))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.790442368012))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.14344540801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.42639355201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.77460489601))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32500.32708067201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32501.19538987201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32502.44842488001))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32504.083048224013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32506.048014816013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32508.25465123201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32510.597602320013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32512.982084064013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32515.323684480012))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32517.55845307201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32519.640895584012))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32521.54702699201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32523.26714236801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32524.80896092801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32526.18868108801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32527.43857876801))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32528.599880640013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32529.721435056013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32530.848714144013))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32532.030462288014))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32533.304371728012))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32534.691932688012))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32536.20476419201))
+Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32537.83693339201))
+Oct 12 12:06:17.081  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 12 12:06:17.091  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 12 12:14:38.826  INFO scheduler{p=bkeuPw}::participant{pid=aQiAfK}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:14:38.826  INFO scheduler{p=aQiAfK}::participant{pid=bkeuPw}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 12 12:14:38.827  INFO scheduler{p=aQiAfK}::participant{pid=bkeuPw}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:16:48.730  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:16:49.263  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:16:49.281  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:16:49.338  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:16:50.945  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 12 12:16:50.945  INFO veloren_server: Authentication is disabled
+Oct 12 12:17:00.806  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 12 12:17:04.296  INFO veloren_world::civ: all sites placed cnt=192
+Oct 12 12:17:19.181  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
+Oct 12 12:17:19.181  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 12 12:17:20.981  INFO scheduler{p=SzLgDg}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:60422
+Oct 12 12:17:20.981  INFO scheduler{p=a9QNsC}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:23461
+Oct 12 12:17:20.982  INFO scheduler{p=a9QNsC}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=SzLgDg
+Oct 12 12:17:20.983  INFO scheduler{p=SzLgDg}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=a9QNsC
+Oct 12 12:17:21.157  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32487.031819728007))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32494.864288272005))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.008849712005))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.770821968006))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.242128448008))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.506182112007))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.716438768006))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.961612592007))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.43479976001))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.24511560001))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32500.46601105601))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32502.10729718401))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32504.107448736013))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32506.363686240013))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32508.772547568013))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32511.221176080013))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32513.622217728014))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32515.904499120013))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32518.025724576015))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32519.953731072015))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32521.684768800016))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32523.224175696017))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32524.593438528016))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32525.820961392015))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32526.954828816015))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32528.044226208014))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32529.135946080016))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32530.281263904017))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32531.524068576018))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32532.89112681602))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32534.39458708802))
+Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32536.02989121602))
+Oct 12 12:17:22.051  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 12 12:17:22.059  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 12 12:19:03.158  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
+Oct 12 12:19:48.619  INFO scheduler{p=a9QNsC}::participant{pid=SzLgDg}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:19:48.619  INFO scheduler{p=SzLgDg}::participant{pid=a9QNsC}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 12 12:19:48.619  INFO scheduler{p=SzLgDg}::participant{pid=a9QNsC}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:22:42.331  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:22:42.845  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:22:42.864  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:22:42.929  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:22:45.578  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
+Oct 12 12:22:45.579  INFO veloren_server: Authentication is disabled
+Oct 12 12:22:56.225  INFO veloren_world::civ: all civilisations created initial_civ_count=48
+Oct 12 12:22:59.711  INFO veloren_world::civ: all sites placed cnt=192
+Oct 12 12:23:16.276  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
+Oct 12 12:23:16.276  INFO veloren_voxygen::singleplayer: Starting server-cli...
+Oct 12 12:23:20.599  INFO scheduler{p=MGR054}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:24773
+Oct 12 12:23:20.599  INFO scheduler{p=dzLtmj}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:60338
+Oct 12 12:23:20.606  INFO scheduler{p=MGR054}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=dzLtmj
+Oct 12 12:23:20.606  INFO scheduler{p=dzLtmj}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=MGR054
+Oct 12 12:23:20.847  INFO veloren_voxygen::singleplayer: Client connected!
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32609.02690776))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32619.440602751998))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32620.465254095998))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32620.99991448))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.124989472))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.156733696))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.1792924))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.213735376))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.460529824002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32622.011067072002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32622.998664144))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32624.473578624))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32626.390874112003))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32628.634983696003))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32631.097510800002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32633.644413936003))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32636.172348912))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32638.59134064))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32640.85016976))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32642.90700912))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32644.742364816))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32646.35959848))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32647.773400176))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32649.018852432))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32650.134614784))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32651.174654256003))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32652.195674352002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32653.256941776002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32654.409903792002))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32655.6924924))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32657.127760992))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32658.716405952))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32660.439022176))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32662.266582336))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32664.160049664))
+Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32666.082284016))
+Oct 12 12:23:21.859  INFO veloren_server::login_provider: New User username="singleplayer"
+Oct 12 12:23:21.866  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 12 12:24:39.597  INFO scheduler{p=MGR054}::participant{pid=dzLtmj}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:24:39.597  INFO scheduler{p=dzLtmj}::participant{pid=MGR054}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
+Oct 12 12:24:39.597  INFO scheduler{p=dzLtmj}::participant{pid=MGR054}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:32:03.571  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:32:03.869  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:32:03.886  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:32:03.934  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:32:32.571  INFO scheduler{p=RTuK4S}: veloren_network::scheduler: Connecting Tcp to: 45.136.30.39:14004
+Oct 12 12:32:33.558  INFO scheduler{p=RTuK4S}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=1BNABt
+Oct 12 12:32:36.914  WARN veloren_client: Server is running b920439a[2020-10-11], you are running d4c97628[2020-10-12], versions might be incompatible!
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657619.7010520529))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657626.1632259089))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657627.3811961969))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657628.2866997329))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657628.9427667089))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657629.4497873489))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657629.9070680368))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657630.4363415729))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657631.1539781969))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657632.1483596849))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657633.4679605168))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657635.1110101648))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657637.0316239889))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657639.1548881489))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657641.3933106929))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657643.6650479248))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657645.8997357328))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657648.0416267728))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657650.0527723408))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657651.9101086769))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657653.6055620369))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657655.1461207889))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657656.5482438928))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657657.8406524848))
+Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657659.0592908368))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657660.2420117968))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657661.4340680848))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657662.6736748049))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657663.9926110768))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657665.4110306128))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657666.9339300687))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657668.5595156368))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657670.2717394767))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657672.0444828687))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657673.8490750768))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657675.6760837648))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657677.4892442607))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657679.2621059247))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657680.9951866287))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657682.6701389487))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657684.2862141808))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657685.8451280848))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657687.3544410447))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657688.8268190607))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657690.2750960847))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657691.7153319087))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657693.1644663566))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657694.6331784206))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657696.1299560847))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657697.6624086447))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657699.2316158607))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657700.8379224207))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657702.4712837967))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657704.1266022447))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657705.7952365166))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657707.4631286606))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657709.1252216366))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657710.7758955086))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657712.4061728365))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657714.0177347246))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657715.6074029485))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657717.1763028685))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657718.7280989005))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657720.2683359085))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657721.8027886285))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657723.3368426604))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657724.8745635564))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657726.4210850603))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657727.9805477003))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657729.5508296363))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657731.1329986763))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657732.7271961323))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657734.3308591883))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657735.9406951404))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657737.5555074444))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657739.1700884365))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657740.7799522765))
+Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657742.3835153485))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657743.9816595085))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657745.5743170766))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657747.1573628366))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657748.7332867887))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657750.3049619726))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657751.8731520686))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657753.4392588686))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657755.0047905325))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657756.5722847246))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657758.1435684685))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657759.7200762446))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657761.3006429486))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657762.8857623086))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657764.4756739406))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657766.0691196686))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657767.6657729966))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657769.2596039246))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657770.8546136366))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657772.4475707726))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657774.0375405326))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657775.6250918607))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657777.2097024206))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657778.7913294926))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657780.3709843406))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657781.9488363086))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657783.5260765646))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657785.1047388206))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657786.6831981806))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657788.2627197807))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657789.8430810446))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657791.4261325647))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657793.0093378767))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657794.5939802127))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657796.1802917487))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657797.7685264047))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657799.3562190927))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657800.9434188207))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657802.5308879247))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657804.1180285168))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657805.7050450288))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657807.2904491249))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657808.8740849008))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657810.4575354928))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657812.0398622608))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657813.6219509488))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657815.2035352049))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657816.7865938288))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657818.3683290929))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657819.9514061009))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657821.5364918129))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657823.1191970129))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657824.7010674449))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657826.2854745329))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657827.8700038769))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657829.4558921969))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657831.0402209968))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657832.6242198448))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657834.2080258768))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657835.7939041648))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657837.3779756369))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657838.9616118929))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657840.545986821))
+Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657842.1291984209))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657843.7131280049))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657845.2975539089))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657846.8822659889))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657848.4671737648))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657850.0504079729))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657851.6344525649))
+Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657853.2191241329))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657854.8038449009))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657856.386465477))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657857.9690923409))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657859.5529738289))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657861.1366904369))
+Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657862.7212346129))
+Oct 12 12:34:32.941  WARN veloren_voxygen::ui: Could not recache queued glyphs, skipping frame.
+Oct 12 12:35:26.888  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:35:27.076  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:35:27.103  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:35:27.181  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:36:09.402  INFO scheduler{p=a92Gg5}: veloren_network::scheduler: Connecting Tcp to: 45.136.30.39:14004
+Oct 12 12:36:10.260  INFO scheduler{p=a92Gg5}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=1BNABt
+Oct 12 12:36:12.970  WARN veloren_client: Server is running b920439a[2020-10-11], you are running d4c97628[2020-10-12], versions might be incompatible!
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668017.8865566945))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668024.6020041825))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668025.8223141346))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668026.7372351266))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668027.4015568065))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668027.9035073025))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668028.3718107585))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668028.8761426305))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668029.5329824064))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668030.4424514144))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668031.6679200224))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668033.2169719904))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668035.0545471105))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668037.1173884865))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668039.3189708865))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668041.5835229026))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668043.8302318786))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668046.0223668705))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668048.1058260705))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668050.0493997345))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668051.8326518144))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668053.4647007264))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668054.9536102784))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668056.3201565985))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668057.5853743425))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668058.7915638945))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668059.9789414785))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668061.1850277345))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668062.4425914465))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668063.7810071744))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668065.2192837824))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668066.7606956384))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668068.3981436864))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668070.1174969664))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668071.8964488223))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668073.7078929823))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668075.5278804223))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668077.3327505983))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668079.1034169343))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668080.8289830943))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668082.5008143584))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668084.1155690623))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668085.6762392384))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668087.1907122943))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668088.6688409023))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668090.1230513023))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668091.5672208703))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668093.0169525823))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668094.4851890623))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668095.9804216063))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668097.5083046623))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668099.0710720543))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668100.6683126623))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668102.2939949502))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668103.9413174143))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668105.6019580542))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668107.2672500382))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668108.9288298462))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668110.5801101022))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668112.2165521662))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668113.8338464542))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668115.4319651262))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668117.0110861182))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668118.5730076062))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668120.1222260382))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668121.6626794783))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668123.1992380543))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668124.7367757823))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668126.2800939583))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668127.8321790462))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668129.3956380222))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668130.9710609022))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668132.5580552862))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668134.1555608541))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668135.7781451261))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668137.38389335))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668138.990691382))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668140.5975937659))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668142.2013500859))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668143.7998063419))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668145.3924302618))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668146.9789265018))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668148.5595594938))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668150.1362000378))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668151.7088095897))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668153.2794335257))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668154.8497131577))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668156.4211993178))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668157.9939522458))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668159.5687793498))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668161.1467909658))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668162.7289542458))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668164.3140255098))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668165.9026227577))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668167.4928724057))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668169.0848331577))
+Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668170.6770477818))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668172.2683625978))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668173.8588223897))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668175.4482520537))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668177.0360717498))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668178.6211526138))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668180.2044065498))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668181.7861687418))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668183.3688725018))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668184.9496060058))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668186.5290285818))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668188.1084511578))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668189.6879443898))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668191.2686649818))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668192.8501765658))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668194.4341980218))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668196.0173510137))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668197.6014152378))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668199.1865764537))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668200.7738469337))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668202.3606921817))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668203.9462270777))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668205.5312464058))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668207.1163249178))
+Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668208.7005060698))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668210.2852166619))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668211.8704990299))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668213.4535659578))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668215.0372517499))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668216.6211972219))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668218.2043842939))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668219.7865523258))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668221.3710123579))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668222.9563548699))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668224.5384786939))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: Pong
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668226.1203495099))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668227.7039987259))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668229.2876383899))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668230.8714343419))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668232.4546473819))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668234.0385860859))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668235.6229211258))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668237.2075850138))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668238.7923143258))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668240.3770432058))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668241.9617908058))
+Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668243.5457199578))
+Oct 12 12:36:15.512  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668245.1295562778))
+Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668246.7135243578))
+Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668248.2982002938))
+Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668249.8829926298))
+Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668251.4673680858))
+Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668253.0516815258))
+Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668254.6354033658))
+Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668256.2192684858))
+Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668257.8027205177))
+Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668259.3862812697))
+Oct 12 12:36:15.854  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668260.9746279577))
+Oct 12 12:37:02.882  INFO scheduler{p=RTuK4S}::participant{pid=1BNABt}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Os { code: 104, kind: ConnectionReset, message: "Connection reset by peer" }
+Oct 12 12:37:02.882  INFO scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:37:02.882 ERROR veloren_voxygen::session: [session] Failed to tick the scene: ClientError(StreamErr(StreamClosed))
+Oct 12 12:37:02.883  WARN veloren_client: Error during drop of client, couldn't send disconnect package, is the connection already closed? e=StreamClosed
+Oct 12 12:37:02.884  INFO scheduler{p=a92Gg5}::participant{pid=1BNABt}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Os { code: 104, kind: ConnectionReset, message: "Connection reset by peer" }
+Oct 12 12:37:02.884  INFO scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: Channel got closed cid=0
+Oct 12 12:37:02.888 ERROR veloren_voxygen::session: [session] Failed to tick the scene: ClientError(StreamErr(StreamClosed))
+Oct 12 12:37:02.889  WARN veloren_client: Error during drop of client, couldn't send disconnect package, is the connection already closed? e=StreamClosed
+Oct 12 12:37:02.894 ERROR scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: Participant has no channel to communicate on occurrences=1 lastframe=Shutdown
+Oct 12 12:37:02.894  WARN scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: couldn't send shutdown frame, are channels already closed?
+Oct 12 12:37:02.899 ERROR scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: Participant has no channel to communicate on occurrences=1 lastframe=Shutdown
+Oct 12 12:37:02.899  WARN scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: couldn't send shutdown frame, are channels already closed?
+Oct 12 12:38:34.381  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:38:34.561  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:38:34.580  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:38:34.629  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:39:22.651  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:39:22.823  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:39:22.842  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:39:22.892  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
+Oct 12 12:46:13.416  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
+Oct 12 12:46:13.729  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
+Oct 12 12:46:13.747  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
+Oct 12 12:46:13.794  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
diff --git a/userdata/voxygen/profile.ron b/userdata/voxygen/profile.ron
new file mode 100644
index 0000000000..d89b2cfbfc
--- /dev/null
+++ b/userdata/voxygen/profile.ron
@@ -0,0 +1,18 @@
+(
+    servers: {
+        "Veloren Alpha": (
+            characters: {
+                24: (
+                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
+                ),
+            },
+        ),
+        "Singleplayer": (
+            characters: {
+                2: (
+                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
+                ),
+            },
+        ),
+    },
+)
\ No newline at end of file

From 30a01df013f284c07cc05314dad3e035d4fd0a0d Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Wed, 14 Oct 2020 15:30:58 -0700
Subject: [PATCH 22/23] Fixed clippy errors and added SFX

---
 assets/voxygen/audio/sfx.ron         | 29 ++++++++++++----
 common/src/comp/ability.rs           | 16 ++++-----
 common/src/states/repeater_ranged.rs | 49 ++++++++++------------------
 userdata/voxygen/profile.ron         | 14 ++++----
 4 files changed, 56 insertions(+), 52 deletions(-)

diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron
index 67cd263bd4..91d6b5b3ee 100644
--- a/assets/voxygen/audio/sfx.ron
+++ b/assets/voxygen/audio/sfx.ron
@@ -73,7 +73,6 @@
         ),
         GliderClose: (
             files: [
-                // Event Missing or not implemented?
                 "voxygen.audio.sfx.glider_close",
             ],
             threshold: 0.5,
@@ -112,12 +111,18 @@
             ],
             threshold: 0.7,
         ),
-        Attack(DashMelee, Sword): (
+        Attack(DashMelee(Swing), Sword): (
             files: [
                 "voxygen.audio.sfx.abilities.sword_dash",
             ],
             threshold: 0.8,
         ),
+        Attack(SpinMelee(Swing), Sword): (
+            files: [
+                "voxygen.audio.sfx.abilities.swing_sword",
+            ],
+            threshold: 0.7,
+        ),
         Inventory(CollectedTool(Sword)): (
             files: [
                 "voxygen.audio.sfx.inventory.pickup_sword",
@@ -146,9 +151,15 @@
             ],
             threshold: 0.7,
         ),
-        Attack(LeapMelee, Hammer): (
+        Attack(ChargedMelee(Swing), Hammer): (
             files: [
-                //
+                "voxygen.audio.sfx.abilities.swing",
+            ],
+            threshold: 0.7,
+        ),
+        Attack(LeapMelee(Swing), Hammer): (
+            files: [
+                "voxygen.audio.sfx.abilities.swing",
             ],
             threshold: 0.8,
         ),
@@ -180,7 +191,13 @@
             ],
             threshold: 0.7,
         ),
-        Attack(SpinMelee, Axe): (
+        Attack(SpinMelee(Swing), Axe): (
+            files: [
+                "voxygen.audio.sfx.abilities.swing",
+            ],
+            threshold: 0.8,
+        ),
+        Attack(LeapMelee(Swing), Axe): (
             files: [
                 "voxygen.audio.sfx.abilities.swing",
             ],
@@ -276,7 +293,7 @@
             ],
             threshold: 0.8,
         ),
-        Attack(DashMelee, Dagger): (
+        Attack(DashMelee(Swing), Dagger): (
             files: [
                 "voxygen.audio.sfx.abilities.sword_dash",
             ],
diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index 070c88b584..e18e09830b 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -18,13 +18,13 @@ pub enum CharacterAbilityType {
     BasicMelee,
     BasicRanged,
     Boost,
-    ChargedMelee,
+    ChargedMelee(StageSection),
     ChargedRanged,
-    DashMelee,
+    DashMelee(StageSection),
     BasicBlock,
     ComboMelee(StageSection, u32),
-    LeapMelee,
-    SpinMelee,
+    LeapMelee(StageSection),
+    SpinMelee(StageSection),
     GroundShockwave,
     BasicBeam,
     RepeaterRanged,
@@ -36,12 +36,12 @@ impl From<&CharacterState> for CharacterAbilityType {
             CharacterState::BasicMelee(_) => Self::BasicMelee,
             CharacterState::BasicRanged(_) => Self::BasicRanged,
             CharacterState::Boost(_) => Self::Boost,
-            CharacterState::DashMelee(_) => Self::DashMelee,
+            CharacterState::DashMelee(data) => Self::DashMelee(data.stage_section),
             CharacterState::BasicBlock => Self::BasicBlock,
-            CharacterState::LeapMelee(_) => Self::LeapMelee,
+            CharacterState::LeapMelee(data) => Self::LeapMelee(data.stage_section),
             CharacterState::ComboMelee(data) => Self::ComboMelee(data.stage_section, data.stage),
-            CharacterState::SpinMelee(_) => Self::SpinMelee,
-            CharacterState::ChargedMelee(_) => Self::ChargedMelee,
+            CharacterState::SpinMelee(data) => Self::SpinMelee(data.stage_section),
+            CharacterState::ChargedMelee(data) => Self::ChargedMelee(data.stage_section),
             CharacterState::ChargedRanged(_) => Self::ChargedRanged,
             CharacterState::GroundShockwave(_) => Self::ChargedRanged,
             CharacterState::BasicBeam(_) => Self::BasicBeam,
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index 1c33566075..3dabb4fedb 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -178,19 +178,8 @@ impl CharacterBehavior for Data {
             },
             StageSection::Recover => {
                 if self.static_data.leap == None {
-                    if !data.physics.on_ground {
-                        // Lands
-                        update.character = CharacterState::RepeaterRanged(Data {
-                            static_data: self.static_data.clone(),
-                            timer: self
-                                .timer
-                                .checked_add(Duration::from_secs_f32(data.dt.0))
-                                .unwrap_or_default(),
-                            stage_section: self.stage_section,
-                            reps_remaining: self.reps_remaining,
-                        });
-                    } else if self.timer < self.static_data.recover_duration {
-                        // Recovers from attack
+                    if !data.physics.on_ground || self.timer < self.static_data.recover_duration {
+                        // Lands or recovers from attack in air
                         update.character = CharacterState::RepeaterRanged(Data {
                             static_data: self.static_data.clone(),
                             timer: self
@@ -204,25 +193,23 @@ impl CharacterBehavior for Data {
                         // Done
                         update.character = CharacterState::Wielding;
                     }
+                } else if data.physics.on_ground {
+                    // Done
+                    update.character = CharacterState::Wielding;
+                } else if self.timer < self.static_data.recover_duration {
+                    // Recovers from attack
+                    update.character = CharacterState::RepeaterRanged(Data {
+                        static_data: self.static_data.clone(),
+                        timer: self
+                            .timer
+                            .checked_add(Duration::from_secs_f32(data.dt.0))
+                            .unwrap_or_default(),
+                        stage_section: self.stage_section,
+                        reps_remaining: self.reps_remaining,
+                    });
                 } else {
-                    if data.physics.on_ground {
-                        // Done
-                        update.character = CharacterState::Wielding;
-                    } else if self.timer < self.static_data.recover_duration {
-                        // Recovers from attack
-                        update.character = CharacterState::RepeaterRanged(Data {
-                            static_data: self.static_data.clone(),
-                            timer: self
-                                .timer
-                                .checked_add(Duration::from_secs_f32(data.dt.0))
-                                .unwrap_or_default(),
-                            stage_section: self.stage_section,
-                            reps_remaining: self.reps_remaining,
-                        });
-                    } else {
-                        // Done
-                        update.character = CharacterState::Wielding;
-                    }
+                    // Done
+                    update.character = CharacterState::Wielding;
                 }
             },
             _ => {
diff --git a/userdata/voxygen/profile.ron b/userdata/voxygen/profile.ron
index d89b2cfbfc..3b597fc037 100644
--- a/userdata/voxygen/profile.ron
+++ b/userdata/voxygen/profile.ron
@@ -1,12 +1,5 @@
 (
     servers: {
-        "Veloren Alpha": (
-            characters: {
-                24: (
-                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
-                ),
-            },
-        ),
         "Singleplayer": (
             characters: {
                 2: (
@@ -14,5 +7,12 @@
                 ),
             },
         ),
+        "Veloren Alpha": (
+            characters: {
+                24: (
+                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
+                ),
+            },
+        ),
     },
 )
\ No newline at end of file

From 6221245e57582d2495a2de3d6b0d42f242a6ec0c Mon Sep 17 00:00:00 2001
From: jiminycrick <jemelkonian@gmail.com>
Date: Wed, 14 Oct 2020 17:10:27 -0700
Subject: [PATCH 23/23] Consolidated recover code in repeater_ranged

---
 CHANGELOG.md                                  |   4 +
 common/src/states/repeater_ranged.rs          |  20 +-
 .../singleplayer/server_config/admins.ron     |   1 -
 .../singleplayer/server_config/banlist.ron    |   1 -
 .../server_config/description.ron             |   1 -
 .../singleplayer/server_config/whitelist.ron  |   1 -
 userdata/voxygen/logs/voxygen.log.2020-10-12  | 885 ------------------
 userdata/voxygen/profile.ron                  |  18 -
 8 files changed, 6 insertions(+), 925 deletions(-)
 delete mode 100644 userdata/singleplayer/server_config/admins.ron
 delete mode 100644 userdata/singleplayer/server_config/banlist.ron
 delete mode 100644 userdata/singleplayer/server_config/description.ron
 delete mode 100644 userdata/singleplayer/server_config/whitelist.ron
 delete mode 100644 userdata/voxygen/logs/voxygen.log.2020-10-12
 delete mode 100644 userdata/voxygen/profile.ron

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4db936c888..bdf975a3f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Theropod body
 - Several new animals
 - Item quality indicators
+- Added a jump/burst attack for the bow to the skillbar
+- Gave the axe a third attack
+- A new secondary charged melee attack for the hammer
 
 ### Changed
 
@@ -46,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Reworked healing sceptre
 - Split out the sections of the server settings that can be edited and saved by the server.
 - Revamped structure of where settings, logs, and game saves are stored so that almost everything is in one place.
+- Moved hammer leap attack to skillbar
 
 ### Removed
 
diff --git a/common/src/states/repeater_ranged.rs b/common/src/states/repeater_ranged.rs
index 3dabb4fedb..c2c4e5d81b 100644
--- a/common/src/states/repeater_ranged.rs
+++ b/common/src/states/repeater_ranged.rs
@@ -177,27 +177,11 @@ impl CharacterBehavior for Data {
                 }
             },
             StageSection::Recover => {
-                if self.static_data.leap == None {
-                    if !data.physics.on_ground || self.timer < self.static_data.recover_duration {
-                        // Lands or recovers from attack in air
-                        update.character = CharacterState::RepeaterRanged(Data {
-                            static_data: self.static_data.clone(),
-                            timer: self
-                                .timer
-                                .checked_add(Duration::from_secs_f32(data.dt.0))
-                                .unwrap_or_default(),
-                            stage_section: self.stage_section,
-                            reps_remaining: self.reps_remaining,
-                        });
-                    } else {
-                        // Done
-                        update.character = CharacterState::Wielding;
-                    }
-                } else if data.physics.on_ground {
+                if self.static_data.leap.is_some() && data.physics.on_ground {
                     // Done
                     update.character = CharacterState::Wielding;
                 } else if self.timer < self.static_data.recover_duration {
-                    // Recovers from attack
+                    // Recover from attack
                     update.character = CharacterState::RepeaterRanged(Data {
                         static_data: self.static_data.clone(),
                         timer: self
diff --git a/userdata/singleplayer/server_config/admins.ron b/userdata/singleplayer/server_config/admins.ron
deleted file mode 100644
index 0637a088a0..0000000000
--- a/userdata/singleplayer/server_config/admins.ron
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/banlist.ron b/userdata/singleplayer/server_config/banlist.ron
deleted file mode 100644
index 9e26dfeeb6..0000000000
--- a/userdata/singleplayer/server_config/banlist.ron
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/description.ron b/userdata/singleplayer/server_config/description.ron
deleted file mode 100644
index 47474ec828..0000000000
--- a/userdata/singleplayer/server_config/description.ron
+++ /dev/null
@@ -1 +0,0 @@
-"This is the best Veloren server"
\ No newline at end of file
diff --git a/userdata/singleplayer/server_config/whitelist.ron b/userdata/singleplayer/server_config/whitelist.ron
deleted file mode 100644
index 0637a088a0..0000000000
--- a/userdata/singleplayer/server_config/whitelist.ron
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/userdata/voxygen/logs/voxygen.log.2020-10-12 b/userdata/voxygen/logs/voxygen.log.2020-10-12
deleted file mode 100644
index d953b35df0..0000000000
--- a/userdata/voxygen/logs/voxygen.log.2020-10-12
+++ /dev/null
@@ -1,885 +0,0 @@
-Oct 11 18:00:01.436  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:00:01.996  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:00:02.329  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:00:02.427  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:00:02.968 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
-
-A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
-
-> What should I do?
-
-We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
-
-https://www.gitlab.com/veloren/veloren/issues/new
-
-If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
-            
-> What should I include?
-
-The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
-            
-Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
-            
-> Error information
-
-The information below is intended for developers and testers.
-
-Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
-PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
-Game version: 702f7e51 [2020-10-12]
-
-Backtrace:
-   0: veloren_voxygen::main::{{closure}}
-   1: std::panicking::rust_panic_with_hook
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
-   2: std::panicking::begin_panic_handler::{{closure}}
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
-   3: std::sys_common::backtrace::__rust_end_short_backtrace
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
-   4: rust_begin_unwind
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
-   5: core::panicking::panic_fmt
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
-   6: core::option::expect_none_failed
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
-   7: veloren_voxygen::main
-   8: std::sys_common::backtrace::__rust_begin_short_backtrace
-   9: std::rt::lang_start::{{closure}}
-
-Oct 11 18:04:17.781  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:04:17.977  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:04:18.008  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:04:18.130  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:04:18.313 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
-
-A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
-
-> What should I do?
-
-We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
-
-https://www.gitlab.com/veloren/veloren/issues/new
-
-If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
-            
-> What should I include?
-
-The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
-            
-Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
-            
-> Error information
-
-The information below is intended for developers and testers.
-
-Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(776) : error C0000: syntax error, unexpected \\\"<<\\\" at token \\\"<<\\\"\\n0(784) : error C0000: syntax error, unexpected \\\">>\\\" at token \\\">>\\\"\\n0(784) : error C0159: invalid char \\\'d\\\' in integer constant suffix\\n0(784) : error C0159: invalid char \\\'c\\\' in integer constant suffix\\n0(784) : error C0159: invalid char \\\'b\\\' in integer constant suffix\\n0(784) : error C0158: invalid digit \\\'8\\\' in octal constant\\n0(786) : error C1503: undefined variable \\\"wind_offset\\\"\\n0(789) : error C0000: syntax error, unexpected \\\"<<\\\" at token \\\"<<\\\"\\n0(793) : error C0159: invalid char \\\'d\\\' in integer constant suffix\\n0(793) : error C0159: invalid char \\\'c\\\' in integer constant suffix\\n0(793) : error C0159: invalid char \\\'b\\\' in integer constant suffix\\n0(793) : error C0158: invalid digit \\\'8\\\' in octal constant\\n0(796) : error C1503: undefined variable \\\"cloud\\\"\\n0(796) : error C1503: undefined variable \\\"turbulence\\\"\\n0(825) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
-PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(776) : error C0000: syntax error, unexpected \"<<\" at token \"<<\"\n0(784) : error C0000: syntax error, unexpected \">>\" at token \">>\"\n0(784) : error C0159: invalid char \'d\' in integer constant suffix\n0(784) : error C0159: invalid char \'c\' in integer constant suffix\n0(784) : error C0159: invalid char \'b\' in integer constant suffix\n0(784) : error C0158: invalid digit \'8\' in octal constant\n0(786) : error C1503: undefined variable \"wind_offset\"\n0(789) : error C0000: syntax error, unexpected \"<<\" at token \"<<\"\n0(793) : error C0159: invalid char \'d\' in integer constant suffix\n0(793) : error C0159: invalid char \'c\' in integer constant suffix\n0(793) : error C0159: invalid char \'b\' in integer constant suffix\n0(793) : error C0158: invalid digit \'8\' in octal constant\n0(796) : error C1503: undefined variable \"cloud\"\n0(796) : error C1503: undefined variable \"turbulence\"\n0(825) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
-Game version: 702f7e51 [2020-10-12]
-
-Backtrace:
-   0: veloren_voxygen::main::{{closure}}
-   1: std::panicking::rust_panic_with_hook
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
-   2: std::panicking::begin_panic_handler::{{closure}}
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
-   3: std::sys_common::backtrace::__rust_end_short_backtrace
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
-   4: rust_begin_unwind
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
-   5: core::panicking::panic_fmt
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
-   6: core::option::expect_none_failed
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
-   7: veloren_voxygen::main
-   8: std::sys_common::backtrace::__rust_begin_short_backtrace
-   9: std::rt::lang_start::{{closure}}
-
-Oct 11 18:13:02.407  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:13:02.590  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:13:02.610  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:13:02.689  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:13:02.861 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
-
-A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
-
-> What should I do?
-
-We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
-
-https://www.gitlab.com/veloren/veloren/issues/new
-
-If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
-            
-> What should I include?
-
-The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
-            
-Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
-            
-> Error information
-
-The information below is intended for developers and testers.
-
-Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
-PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
-Game version: 88d6c645 [2020-10-12]
-
-Backtrace:
-   0: veloren_voxygen::main::{{closure}}
-   1: std::panicking::rust_panic_with_hook
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
-   2: std::panicking::begin_panic_handler::{{closure}}
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
-   3: std::sys_common::backtrace::__rust_end_short_backtrace
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
-   4: rust_begin_unwind
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
-   5: core::panicking::panic_fmt
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
-   6: core::option::expect_none_failed
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
-   7: veloren_voxygen::main
-   8: std::sys_common::backtrace::__rust_begin_short_backtrace
-   9: std::rt::lang_start::{{closure}}
-
-Oct 11 18:17:38.536  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:17:38.764  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:17:38.786  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:17:38.882  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:30:57.586  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:30:57.777  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:30:57.796  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:30:57.875  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:30:58.071 ERROR veloren_voxygen: VOXYGEN HAS PANICKED
-
-A critical error has occurred and Voxygen has been forced to terminate in an unusual manner. Details about the error can be found below.
-
-> What should I do?
-
-We need your help to fix this! You can help by contacting us and reporting this problem. To do this, open an issue on the Veloren issue tracker:
-
-https://www.gitlab.com/veloren/veloren/issues/new
-
-If you're on the Veloren community Discord server, we'd be grateful if you could also post a message in the #support channel.
-            
-> What should I include?
-
-The error information below will be useful in finding and fixing the problem. Please include as much information about your setup and the events that led up to the panic as possible.
-            
-Voxygen has logged information about the problem (including this message) to the file /home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs/voxygen-<date>.log. Please include the contents of this file in your bug report.
-            
-> Error information
-
-The information below is intended for developers and testers.
-
-Panic Payload: "Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed(\"0(815) : error C1020: invalid operands to \\\"/\\\"\\n\")))))"
-PanicInfo: panicked at 'Failed to create window!: RenderError(PipelineError(Program(Pixel(CompilationFailed("0(815) : error C1020: invalid operands to \"/\"\n")))))', voxygen/src/main.rs:175:55
-Game version: 88d6c645 [2020-10-12]
-
-Backtrace:
-   0: veloren_voxygen::main::{{closure}}
-   1: std::panicking::rust_panic_with_hook
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:573
-   2: std::panicking::begin_panic_handler::{{closure}}
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:476
-   3: std::sys_common::backtrace::__rust_end_short_backtrace
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/sys_common/backtrace.rs:153
-   4: rust_begin_unwind
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/std/src/panicking.rs:475
-   5: core::panicking::panic_fmt
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/panicking.rs:85
-   6: core::option::expect_none_failed
-             at /rustc/8e21bd0633b8d970646ee6eb706c9e8acfad19af/library/core/src/option.rs:1274
-   7: veloren_voxygen::main
-   8: std::sys_common::backtrace::__rust_begin_short_backtrace
-   9: std::rt::lang_start::{{closure}}
-
-Oct 11 18:43:31.798  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:43:31.981  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:43:32.010  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:43:32.094  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:45:09.368  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 18:45:09.555  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 18:45:09.575  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 18:45:09.637  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 18:45:11.166  INFO veloren_voxygen::singleplayer: Saves folder doesn't exist, but there is one in the old saves location, copying it to the new location
-Oct 11 18:45:11.267  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 11 18:45:11.267  INFO veloren_server: Authentication is disabled
-Oct 11 18:45:21.481  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 11 18:45:25.523  INFO veloren_world::civ: all sites placed cnt=192
-Oct 11 18:45:41.288  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (88d6c645)"
-Oct 11 18:45:41.288  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 11 18:45:41.292  INFO scheduler{p=sjGg8V}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:21040
-Oct 11 18:45:41.292  INFO scheduler{p=ILg9mh}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:36746
-Oct 11 18:45:41.293  INFO scheduler{p=sjGg8V}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=ILg9mh
-Oct 11 18:45:41.293  INFO scheduler{p=ILg9mh}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=sjGg8V
-Oct 11 18:45:41.492  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32401.596704352))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32409.786351744))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32410.908720815998))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32411.626319519997))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.018207839996))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.211516559997))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.303108575998))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.481935408))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32412.873735168))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32413.659428783998))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32414.857275551996))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32416.500438383995))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32418.522596543997))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32420.823689951998))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32423.277984528))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.771826016))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32428.216514256))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32430.538930608))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.690225568))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32434.592518416))
-Oct 11 18:45:42.631  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32436.338156352))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32437.884218208))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32439.251325072))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32440.472470704))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.594921952))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32442.667095216002))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.740258960002))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32444.86450944))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32446.089736272002))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32447.442419664003))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32448.936762))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.56528152))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.310993184))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.142392864))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.022858144))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32457.918928272))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.799781056))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.636173504))
-Oct 11 18:45:42.632  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32463.412895424))
-Oct 11 18:45:42.645  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 11 18:45:42.647  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 11 18:47:45.068  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
-Oct 11 18:51:46.829  INFO scheduler{p=sjGg8V}::participant{pid=ILg9mh}: veloren_network::participant: Channel got closed cid=0
-Oct 11 18:51:46.830  INFO scheduler{p=ILg9mh}::participant{pid=sjGg8V}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 11 18:51:46.830  INFO scheduler{p=ILg9mh}::participant{pid=sjGg8V}: veloren_network::participant: Channel got closed cid=0
-Oct 11 19:38:50.989  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 19:38:51.499  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 19:38:51.518  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 19:38:51.618  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 19:38:53.656  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 11 19:38:53.656  INFO veloren_server: Authentication is disabled
-Oct 11 19:39:02.245  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 11 19:39:05.658  INFO veloren_world::civ: all sites placed cnt=192
-Oct 11 19:39:18.263  INFO veloren_server: Server version version="Pre-Alpha-2020-10-11 (8bd1f763)"
-Oct 11 19:39:18.263  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 11 19:39:18.692  INFO scheduler{p=4kn15H}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:50694
-Oct 11 19:39:18.692  INFO scheduler{p=rdN34G}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:17428
-Oct 11 19:39:18.693  INFO scheduler{p=rdN34G}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=4kn15H
-Oct 11 19:39:18.693  INFO scheduler{p=4kn15H}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=rdN34G
-Oct 11 19:39:18.876  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32422.05936024))
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32429.407656144))
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32430.61712952))
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32431.47577872))
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.0034276))
-Oct 11 19:39:19.753  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.35027992))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.624620128))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32432.996397888))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32433.541361568))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32434.400804112))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32435.642454768))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32437.270977744))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32439.234546048))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.44027032))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.783458335998))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32446.171296864))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32448.516490079997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.755642271997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.842910223997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.755747231997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.481281663997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32458.025927999995))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.408609759994))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32460.660578351995))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.827083807995))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32462.946510863996))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32464.069834463997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32465.247272591998))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32466.515769648))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32467.897204896))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32469.405831599997))
-Oct 11 19:39:19.754  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32471.036367888))
-Oct 11 19:39:19.779  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 11 19:39:19.784  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 11 19:40:50.805  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
-Oct 11 19:41:48.561  INFO scheduler{p=rdN34G}::participant{pid=4kn15H}: veloren_network::participant: Channel got closed cid=0
-Oct 11 19:41:48.561  INFO scheduler{p=4kn15H}::participant{pid=rdN34G}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 11 19:41:48.561  INFO scheduler{p=4kn15H}::participant{pid=rdN34G}: veloren_network::participant: Channel got closed cid=0
-Oct 11 19:45:44.326  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 11 19:45:44.964  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 11 19:45:45.002  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 11 19:45:45.138  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 11 19:45:47.380  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 11 19:45:47.381  INFO veloren_server: Authentication is disabled
-Oct 11 19:45:57.634  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 11 19:46:01.221  INFO veloren_world::civ: all sites placed cnt=192
-Oct 11 19:46:17.198  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (88d6c645)"
-Oct 11 19:46:17.198  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 11 19:46:17.413  INFO scheduler{p=B4GN1M}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:20264
-Oct 11 19:46:17.413  INFO scheduler{p=/jADhb}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:47894
-Oct 11 19:46:17.414  INFO scheduler{p=B4GN1M}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=/jADhb
-Oct 11 19:46:17.416  INFO scheduler{p=/jADhb}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=B4GN1M
-Oct 11 19:46:17.698  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32411.063976671994))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32424.006517103993))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32424.935257583995))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.278388367995))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.368757103995))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.392961247995))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.417337663996))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.461246623996))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.533457343998))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32425.824586895997))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32426.486599391996))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32427.616724447995))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32429.224074431993))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32431.242758447992))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32433.56481700799))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32436.12195892799))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32438.60421983999))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32441.08186910399))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32443.43790590399))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32445.63919703999))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32447.627582207988))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32449.406751359988))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32450.97355751999))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32452.35679972799))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32453.57595835199))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32454.67442942399))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32455.71413510399))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32456.75004782399))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32457.83747951999))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32459.03676340799))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32460.357089999987))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32461.823537999986))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32463.436603103986))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32465.175466415985))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32467.012395599984))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32468.901964175984))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32470.817712767985))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32472.719038559986))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32474.578426559987))
-Oct 11 19:46:18.800  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32476.372692383986))
-Oct 11 19:46:18.825  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 11 19:46:18.831  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 11 19:46:59.575  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
-Oct 11 19:53:12.266  INFO scheduler{p=B4GN1M}::participant{pid=/jADhb}: veloren_network::participant: Channel got closed cid=0
-Oct 11 19:53:12.266  INFO scheduler{p=/jADhb}::participant{pid=B4GN1M}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 11 19:53:12.266  INFO scheduler{p=/jADhb}::participant{pid=B4GN1M}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:05:28.209  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:05:28.783  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:05:28.800  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:05:28.859  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:05:46.002  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 12 12:05:46.002  INFO veloren_server: Authentication is disabled
-Oct 12 12:05:55.855  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 12 12:05:59.768  INFO veloren_world::civ: all sites placed cnt=192
-Oct 12 12:06:14.173  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
-Oct 12 12:06:14.173  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 12 12:06:16.023  INFO scheduler{p=bkeuPw}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:18291
-Oct 12 12:06:16.023  INFO scheduler{p=aQiAfK}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:47260
-Oct 12 12:06:16.024  INFO scheduler{p=bkeuPw}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=aQiAfK
-Oct 12 12:06:16.024  INFO scheduler{p=aQiAfK}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=bkeuPw
-Oct 12 12:06:16.178  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 12 12:06:17.053  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32488.92802972801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.21413668801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.40452857601))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.23670424001))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.790442368012))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.14344540801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.42639355201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.77460489601))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32500.32708067201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32501.19538987201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32502.44842488001))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32504.083048224013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32506.048014816013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32508.25465123201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32510.597602320013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32512.982084064013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32515.323684480012))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32517.55845307201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32519.640895584012))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32521.54702699201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32523.26714236801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32524.80896092801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32526.18868108801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32527.43857876801))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32528.599880640013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32529.721435056013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32530.848714144013))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32532.030462288014))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32533.304371728012))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32534.691932688012))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32536.20476419201))
-Oct 12 12:06:17.058  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32537.83693339201))
-Oct 12 12:06:17.081  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 12 12:06:17.091  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 12 12:14:38.826  INFO scheduler{p=bkeuPw}::participant{pid=aQiAfK}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:14:38.826  INFO scheduler{p=aQiAfK}::participant{pid=bkeuPw}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 12 12:14:38.827  INFO scheduler{p=aQiAfK}::participant{pid=bkeuPw}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:16:48.730  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:16:49.263  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:16:49.281  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:16:49.338  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:16:50.945  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 12 12:16:50.945  INFO veloren_server: Authentication is disabled
-Oct 12 12:17:00.806  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 12 12:17:04.296  INFO veloren_world::civ: all sites placed cnt=192
-Oct 12 12:17:19.181  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
-Oct 12 12:17:19.181  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 12 12:17:20.981  INFO scheduler{p=SzLgDg}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:60422
-Oct 12 12:17:20.981  INFO scheduler{p=a9QNsC}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:23461
-Oct 12 12:17:20.982  INFO scheduler{p=a9QNsC}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=SzLgDg
-Oct 12 12:17:20.983  INFO scheduler{p=SzLgDg}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=a9QNsC
-Oct 12 12:17:21.157  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32487.031819728007))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32494.864288272005))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.008849712005))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32496.770821968006))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.242128448008))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.506182112007))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.716438768006))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32497.961612592007))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32498.43479976001))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32499.24511560001))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32500.46601105601))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32502.10729718401))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32504.107448736013))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32506.363686240013))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32508.772547568013))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32511.221176080013))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32513.622217728014))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32515.904499120013))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32518.025724576015))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32519.953731072015))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32521.684768800016))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32523.224175696017))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32524.593438528016))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32525.820961392015))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32526.954828816015))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32528.044226208014))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32529.135946080016))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32530.281263904017))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32531.524068576018))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32532.89112681602))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32534.39458708802))
-Oct 12 12:17:22.042  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32536.02989121602))
-Oct 12 12:17:22.051  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 12 12:17:22.059  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 12 12:19:03.158  WARN veloren_voxygen::audio::soundcache: SoundCache: Failed to load sound name="voxygen.audio.sfx.placeholder"
-Oct 12 12:19:48.619  INFO scheduler{p=a9QNsC}::participant{pid=SzLgDg}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:19:48.619  INFO scheduler{p=SzLgDg}::participant{pid=a9QNsC}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 12 12:19:48.619  INFO scheduler{p=SzLgDg}::participant{pid=a9QNsC}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:22:42.331  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:22:42.845  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:22:42.864  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:22:42.929  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:22:45.578  INFO veloren_server: Server is data dir is: /home/james/Documents/Projects/rust/veloren/userdata/singleplayer
-Oct 12 12:22:45.579  INFO veloren_server: Authentication is disabled
-Oct 12 12:22:56.225  INFO veloren_world::civ: all civilisations created initial_civ_count=48
-Oct 12 12:22:59.711  INFO veloren_world::civ: all sites placed cnt=192
-Oct 12 12:23:16.276  INFO veloren_server: Server version version="Pre-Alpha-2020-10-12 (34caebea)"
-Oct 12 12:23:16.276  INFO veloren_voxygen::singleplayer: Starting server-cli...
-Oct 12 12:23:20.599  INFO scheduler{p=MGR054}: veloren_network::scheduler: Connecting Tcp to: 127.0.0.1:24773
-Oct 12 12:23:20.599  INFO scheduler{p=dzLtmj}: veloren_network::scheduler: Accepting Tcp from: 127.0.0.1:60338
-Oct 12 12:23:20.606  INFO scheduler{p=MGR054}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=dzLtmj
-Oct 12 12:23:20.606  INFO scheduler{p=dzLtmj}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=MGR054
-Oct 12 12:23:20.847  INFO veloren_voxygen::singleplayer: Client connected!
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32609.02690776))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32619.440602751998))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32620.465254095998))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32620.99991448))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.124989472))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.156733696))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.1792924))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.213735376))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32621.460529824002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32622.011067072002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32622.998664144))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32624.473578624))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32626.390874112003))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32628.634983696003))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32631.097510800002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32633.644413936003))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32636.172348912))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32638.59134064))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32640.85016976))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32642.90700912))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32644.742364816))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32646.35959848))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32647.773400176))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32649.018852432))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32650.134614784))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32651.174654256003))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32652.195674352002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32653.256941776002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32654.409903792002))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32655.6924924))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32657.127760992))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32658.716405952))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32660.439022176))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32662.266582336))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32664.160049664))
-Oct 12 12:23:21.842  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(32666.082284016))
-Oct 12 12:23:21.859  INFO veloren_server::login_provider: New User username="singleplayer"
-Oct 12 12:23:21.866  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 12 12:24:39.597  INFO scheduler{p=MGR054}::participant{pid=dzLtmj}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:24:39.597  INFO scheduler{p=dzLtmj}::participant{pid=MGR054}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Kind(UnexpectedEof)
-Oct 12 12:24:39.597  INFO scheduler{p=dzLtmj}::participant{pid=MGR054}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:32:03.571  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:32:03.869  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:32:03.886  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:32:03.934  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:32:32.571  INFO scheduler{p=RTuK4S}: veloren_network::scheduler: Connecting Tcp to: 45.136.30.39:14004
-Oct 12 12:32:33.558  INFO scheduler{p=RTuK4S}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=1BNABt
-Oct 12 12:32:36.914  WARN veloren_client: Server is running b920439a[2020-10-11], you are running d4c97628[2020-10-12], versions might be incompatible!
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657619.7010520529))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657626.1632259089))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657627.3811961969))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657628.2866997329))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657628.9427667089))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657629.4497873489))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657629.9070680368))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657630.4363415729))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657631.1539781969))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657632.1483596849))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657633.4679605168))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657635.1110101648))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657637.0316239889))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657639.1548881489))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657641.3933106929))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657643.6650479248))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657645.8997357328))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657648.0416267728))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657650.0527723408))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657651.9101086769))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657653.6055620369))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657655.1461207889))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657656.5482438928))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657657.8406524848))
-Oct 12 12:32:38.717  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657659.0592908368))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657660.2420117968))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657661.4340680848))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657662.6736748049))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657663.9926110768))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657665.4110306128))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657666.9339300687))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657668.5595156368))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657670.2717394767))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657672.0444828687))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657673.8490750768))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657675.6760837648))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657677.4892442607))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657679.2621059247))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657680.9951866287))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657682.6701389487))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657684.2862141808))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657685.8451280848))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657687.3544410447))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657688.8268190607))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657690.2750960847))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657691.7153319087))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657693.1644663566))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657694.6331784206))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657696.1299560847))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657697.6624086447))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657699.2316158607))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657700.8379224207))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657702.4712837967))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657704.1266022447))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657705.7952365166))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657707.4631286606))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657709.1252216366))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657710.7758955086))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657712.4061728365))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657714.0177347246))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657715.6074029485))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657717.1763028685))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657718.7280989005))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657720.2683359085))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657721.8027886285))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657723.3368426604))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657724.8745635564))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657726.4210850603))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657727.9805477003))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657729.5508296363))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657731.1329986763))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657732.7271961323))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657734.3308591883))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657735.9406951404))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657737.5555074444))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657739.1700884365))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657740.7799522765))
-Oct 12 12:32:38.718  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657742.3835153485))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657743.9816595085))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657745.5743170766))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657747.1573628366))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657748.7332867887))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657750.3049619726))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657751.8731520686))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657753.4392588686))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657755.0047905325))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657756.5722847246))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657758.1435684685))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657759.7200762446))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657761.3006429486))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657762.8857623086))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657764.4756739406))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657766.0691196686))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657767.6657729966))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657769.2596039246))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657770.8546136366))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657772.4475707726))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657774.0375405326))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657775.6250918607))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657777.2097024206))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657778.7913294926))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657780.3709843406))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657781.9488363086))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657783.5260765646))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657785.1047388206))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657786.6831981806))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657788.2627197807))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657789.8430810446))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657791.4261325647))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657793.0093378767))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657794.5939802127))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657796.1802917487))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657797.7685264047))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657799.3562190927))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657800.9434188207))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657802.5308879247))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657804.1180285168))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657805.7050450288))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657807.2904491249))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657808.8740849008))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657810.4575354928))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657812.0398622608))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657813.6219509488))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657815.2035352049))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657816.7865938288))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657818.3683290929))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657819.9514061009))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657821.5364918129))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657823.1191970129))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657824.7010674449))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657826.2854745329))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657827.8700038769))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657829.4558921969))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657831.0402209968))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657832.6242198448))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657834.2080258768))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657835.7939041648))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657837.3779756369))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657838.9616118929))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657840.545986821))
-Oct 12 12:32:38.719  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657842.1291984209))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657843.7131280049))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657845.2975539089))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657846.8822659889))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657848.4671737648))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657850.0504079729))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657851.6344525649))
-Oct 12 12:32:38.919  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657853.2191241329))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657854.8038449009))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657856.386465477))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657857.9690923409))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657859.5529738289))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657861.1366904369))
-Oct 12 12:32:39.123  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(657862.7212346129))
-Oct 12 12:34:32.941  WARN veloren_voxygen::ui: Could not recache queued glyphs, skipping frame.
-Oct 12 12:35:26.888  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:35:27.076  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:35:27.103  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:35:27.181  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:36:09.402  INFO scheduler{p=a92Gg5}: veloren_network::scheduler: Connecting Tcp to: 45.136.30.39:14004
-Oct 12 12:36:10.260  INFO scheduler{p=a92Gg5}::handshake{cid=0}: veloren_network::channel: This Handshake is now configured! pid=1BNABt
-Oct 12 12:36:12.970  WARN veloren_client: Server is running b920439a[2020-10-11], you are running d4c97628[2020-10-12], versions might be incompatible!
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668017.8865566945))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668024.6020041825))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668025.8223141346))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668026.7372351266))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668027.4015568065))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668027.9035073025))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668028.3718107585))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668028.8761426305))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668029.5329824064))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668030.4424514144))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668031.6679200224))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668033.2169719904))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668035.0545471105))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668037.1173884865))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668039.3189708865))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668041.5835229026))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668043.8302318786))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668046.0223668705))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668048.1058260705))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668050.0493997345))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668051.8326518144))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668053.4647007264))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668054.9536102784))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668056.3201565985))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668057.5853743425))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668058.7915638945))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668059.9789414785))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668061.1850277345))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668062.4425914465))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668063.7810071744))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668065.2192837824))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668066.7606956384))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668068.3981436864))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668070.1174969664))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668071.8964488223))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668073.7078929823))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668075.5278804223))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668077.3327505983))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668079.1034169343))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668080.8289830943))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668082.5008143584))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668084.1155690623))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668085.6762392384))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668087.1907122943))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668088.6688409023))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668090.1230513023))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668091.5672208703))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668093.0169525823))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668094.4851890623))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668095.9804216063))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668097.5083046623))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668099.0710720543))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668100.6683126623))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668102.2939949502))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668103.9413174143))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668105.6019580542))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668107.2672500382))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668108.9288298462))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668110.5801101022))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668112.2165521662))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668113.8338464542))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668115.4319651262))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668117.0110861182))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668118.5730076062))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668120.1222260382))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668121.6626794783))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668123.1992380543))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668124.7367757823))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668126.2800939583))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668127.8321790462))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668129.3956380222))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668130.9710609022))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668132.5580552862))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668134.1555608541))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668135.7781451261))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668137.38389335))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668138.990691382))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668140.5975937659))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668142.2013500859))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668143.7998063419))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668145.3924302618))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668146.9789265018))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668148.5595594938))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668150.1362000378))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668151.7088095897))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668153.2794335257))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668154.8497131577))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668156.4211993178))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668157.9939522458))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668159.5687793498))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668161.1467909658))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668162.7289542458))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668164.3140255098))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668165.9026227577))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668167.4928724057))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668169.0848331577))
-Oct 12 12:36:15.356  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668170.6770477818))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668172.2683625978))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668173.8588223897))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668175.4482520537))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668177.0360717498))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668178.6211526138))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668180.2044065498))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668181.7861687418))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668183.3688725018))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668184.9496060058))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668186.5290285818))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668188.1084511578))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668189.6879443898))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668191.2686649818))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668192.8501765658))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668194.4341980218))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668196.0173510137))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668197.6014152378))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668199.1865764537))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668200.7738469337))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668202.3606921817))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668203.9462270777))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668205.5312464058))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668207.1163249178))
-Oct 12 12:36:15.357  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668208.7005060698))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668210.2852166619))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668211.8704990299))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668213.4535659578))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668215.0372517499))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668216.6211972219))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668218.2043842939))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668219.7865523258))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668221.3710123579))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668222.9563548699))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668224.5384786939))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: Pong
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668226.1203495099))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668227.7039987259))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668229.2876383899))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668230.8714343419))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668232.4546473819))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668234.0385860859))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668235.6229211258))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668237.2075850138))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668238.7923143258))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668240.3770432058))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668241.9617908058))
-Oct 12 12:36:15.359  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668243.5457199578))
-Oct 12 12:36:15.512  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668245.1295562778))
-Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668246.7135243578))
-Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668248.2982002938))
-Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668249.8829926298))
-Oct 12 12:36:15.513  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668251.4673680858))
-Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668253.0516815258))
-Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668254.6354033658))
-Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668256.2192684858))
-Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668257.8027205177))
-Oct 12 12:36:15.684  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668259.3862812697))
-Oct 12 12:36:15.854  WARN veloren_client: Ignoring what the server send till registered: TimeOfDay(TimeOfDay(668260.9746279577))
-Oct 12 12:37:02.882  INFO scheduler{p=RTuK4S}::participant{pid=1BNABt}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Os { code: 104, kind: ConnectionReset, message: "Connection reset by peer" }
-Oct 12 12:37:02.882  INFO scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:37:02.882 ERROR veloren_voxygen::session: [session] Failed to tick the scene: ClientError(StreamErr(StreamClosed))
-Oct 12 12:37:02.883  WARN veloren_client: Error during drop of client, couldn't send disconnect package, is the connection already closed? e=StreamClosed
-Oct 12 12:37:02.884  INFO scheduler{p=a92Gg5}::participant{pid=1BNABt}:{cid=0}: veloren_network::protocols: Closing tcp protocol due to read error e=Os { code: 104, kind: ConnectionReset, message: "Connection reset by peer" }
-Oct 12 12:37:02.884  INFO scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: Channel got closed cid=0
-Oct 12 12:37:02.888 ERROR veloren_voxygen::session: [session] Failed to tick the scene: ClientError(StreamErr(StreamClosed))
-Oct 12 12:37:02.889  WARN veloren_client: Error during drop of client, couldn't send disconnect package, is the connection already closed? e=StreamClosed
-Oct 12 12:37:02.894 ERROR scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: Participant has no channel to communicate on occurrences=1 lastframe=Shutdown
-Oct 12 12:37:02.894  WARN scheduler{p=RTuK4S}::participant{pid=1BNABt}: veloren_network::participant: couldn't send shutdown frame, are channels already closed?
-Oct 12 12:37:02.899 ERROR scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: Participant has no channel to communicate on occurrences=1 lastframe=Shutdown
-Oct 12 12:37:02.899  WARN scheduler{p=a92Gg5}::participant{pid=1BNABt}: veloren_network::participant: couldn't send shutdown frame, are channels already closed?
-Oct 12 12:38:34.381  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:38:34.561  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:38:34.580  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:38:34.629  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:39:22.651  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:39:22.823  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:39:22.842  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:39:22.892  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
-Oct 12 12:46:13.416  INFO veloren_voxygen::logging: Setup terminal and file logging. logdir="/home/james/Documents/Projects/rust/veloren/userdata/voxygen/logs"
-Oct 12 12:46:13.729  INFO veloren_common::assets: Assets found path=/home/james/Documents/Projects/rust/veloren/assets
-Oct 12 12:46:13.747  INFO winit::platform_impl::platform::x11::window: Guessed window scale factor: 1    
-Oct 12 12:46:13.794  INFO veloren_voxygen::window: selected graphics device vendor="NVIDIA Corporation" renderer="GeForce 940MX/PCIe/SSE2" opengl_version=3.3.0, NVIDIA 450.66 glsl_version=3.30, NVIDIA via Cg compiler
diff --git a/userdata/voxygen/profile.ron b/userdata/voxygen/profile.ron
deleted file mode 100644
index 3b597fc037..0000000000
--- a/userdata/voxygen/profile.ron
+++ /dev/null
@@ -1,18 +0,0 @@
-(
-    servers: {
-        "Singleplayer": (
-            characters: {
-                2: (
-                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
-                ),
-            },
-        ),
-        "Veloren Alpha": (
-            characters: {
-                24: (
-                    hotbar_slots: (None, None, None, None, None, Some(Inventory(0)), Some(Inventory(1)), None, None, None),
-                ),
-            },
-        ),
-    },
-)
\ No newline at end of file