internal static void GatherInputsOverrideHook(On.EntityStates.GenericCharacterMain.orig_GatherInputs orig, GenericCharacterMain self)
        {
            orig(self);

            if (!instances.TryGetValue(self, out var extraGenericCharacterMain))
            {
                instances.Add(self, extraGenericCharacterMain = new ExtraGenericCharacterMain
                {
                    ExtraSkillLocator  = self.outer.GetComponent <ExtraSkillLocator>(),
                    ExtraInputBankTest = self.outer.GetComponent <ExtraInputBankTest>()
                });
            }

            var extraInputBankTest = extraGenericCharacterMain.ExtraInputBankTest;

            if (!extraInputBankTest)
            {
                return;
            }

            extraGenericCharacterMain.extraSkill1InputReceived |= extraInputBankTest.extraSkill1.down;
            extraGenericCharacterMain.extraSkill2InputReceived |= extraInputBankTest.extraSkill2.down;
            extraGenericCharacterMain.extraSkill3InputReceived |= extraInputBankTest.extraSkill3.down;
            extraGenericCharacterMain.extraSkill4InputReceived |= extraInputBankTest.extraSkill4.down;
        }
        internal static void PerformInputsOverrideHook(On.EntityStates.GenericCharacterMain.orig_PerformInputs orig, GenericCharacterMain self)
        {
            orig(self);

            if (!self.isAuthority)
            {
                return;
            }

            if (!instances.TryGetValue(self, out var extraGenericCharacterMain))
            {
                instances.Add(self, extraGenericCharacterMain = new ExtraGenericCharacterMain
                {
                    ExtraSkillLocator  = self.outer.GetComponent <ExtraSkillLocator>(),
                    ExtraInputBankTest = self.outer.GetComponent <ExtraInputBankTest>()
                });
            }

            var extraSkillLocator  = extraGenericCharacterMain.ExtraSkillLocator;
            var extraInputBankTest = extraGenericCharacterMain.ExtraInputBankTest;

            if (extraSkillLocator && extraInputBankTest && extraGenericCharacterMain != null)
            {
                HandleSkill(extraSkillLocator.extraFirst, ref extraGenericCharacterMain.extraSkill1InputReceived, extraInputBankTest.extraSkill1.justPressed);
                HandleSkill(extraSkillLocator.extraSecond, ref extraGenericCharacterMain.extraSkill2InputReceived, extraInputBankTest.extraSkill2.justPressed);
                HandleSkill(extraSkillLocator.extraThird, ref extraGenericCharacterMain.extraSkill3InputReceived, extraInputBankTest.extraSkill3.justPressed);
                HandleSkill(extraSkillLocator.extraFourth, ref extraGenericCharacterMain.extraSkill4InputReceived, extraInputBankTest.extraSkill4.justPressed);
            }

            void HandleSkill(GenericSkill skillSlot, ref bool inputReceived, bool justPressed)
            {
                bool flag = inputReceived;

                inputReceived = false;
                if (!skillSlot || !justPressed && (!flag || skillSlot.mustKeyPress) || !self.CanExecuteSkill(skillSlot))
                {
                    return;
                }
                skillSlot.ExecuteIfReady();
            }
        }