private void ToolbotDash_FixedUpdate(On.EntityStates.Toolbot.ToolbotDash.orig_FixedUpdate orig, EntityStates.Toolbot.ToolbotDash self)
        {
            orig(self);
            var count = GetCount(self.characterBody);

            //todo: add contextual skill override
            if (count > 0)
            {
                var cpt = self.GetComponent <ToolbotDashBoostTracker>();
                if (!cpt)
                {
                    return;
                }
                var isDown = self.hasInputBank && self.inputBank.skill3.down;
                if (!isDown)
                {
                    cpt.retrigProtection = false;
                }
                if (!cpt.boosting && isDown && cpt.TryBoost())
                {
                    self.duration += toolbotReacTime;
                    Util.PlaySound(EntityStates.Toolbot.ToolbotDash.endSoundString, self.gameObject);
                }
            }
        }
        private Vector3 ToolbotDash_GetIdealVelocity(On.EntityStates.Toolbot.ToolbotDash.orig_GetIdealVelocity orig, EntityStates.Toolbot.ToolbotDash self)
        {
            var retv = orig(self);
            var cpt  = self.GetComponent <ToolbotDashBoostTracker>();

            if (cpt && cpt.boosting)
            {
                retv *= 1f + buffFrac * toolbotReacBoostFrac * cpt.maxBoosts;
            }
            return(retv);
        }
        private void ToolbotDash_OnEnter(On.EntityStates.Toolbot.ToolbotDash.orig_OnEnter orig, EntityStates.Toolbot.ToolbotDash self)
        {
            orig(self);
            var count = GetCount(self.characterBody);

            if (count > 0)
            {
                var cpt = self.GetComponent <ToolbotDashBoostTracker>();
                if (!cpt)
                {
                    cpt = self.gameObject.AddComponent <ToolbotDashBoostTracker>();
                }
                cpt.maxBoosts  = count * toolbotReacBoostCount;
                cpt.boostsUsed = 0;
            }
        }