code: def inject_dll(self):
          
  
          self.logger.info('Injecting DLL')
          # Inject DLL
          injector_dir = os.path.join(get_dll_directory(), 'RLBot_Injector.exe')
  
          for file in ['RLBot_Injector.exe', 'RLBot_Core.dll', 'RLBot_Core_Interface.dll', 'RLBot_Core_Interface_32.dll']:
              file_path = os.path.join(get_dll_directory(), file)
              if not os.path.isfile(file_path):
                  raise FileNotFoundError(f'{file} was not found in {get_dll_directory()}. '
                                          'Please check that the file exists and your antivirus '
                                          'is not removing it. See https://github.com/RLBot/RLBot/wiki/Antivirus-Notes')
  
          incode = subprocess.call([injector_dir, 'hidden'])
          injector_codes = ['INJECTION_SUCCESSFUL',
                            'INJECTION_FAILED',
                            'MULTIPLE_ROCKET_LEAGUE_PROCESSES_FOUND',
                            'RLBOT_DLL_ALREADY_INJECTED',
                            'RLBOT_DLL_NOT_FOUND',
                            'MULTIPLE_RLBOT_DLL_FILES_FOUND']
          injector_valid_codes = ['INJECTION_SUCCESSFUL',
                                  'RLBOT_DLL_ALREADY_INJECTED']
          injection_status = injector_codes[incode]
          if injection_status in injector_valid_codes:
              self.logger.info('Finished Injecting DLL')
              return injection_status
          else:
              self.logger.error('Failed to inject DLL: ' + injection_status)
              sys.exit()
docs: Calling this function will inject the DLL without GUI
          DLL will return status codes from 0 to 5 which correspond to injector_codes
          DLL injection is only valid if codes are 0->'INJECTION_SUCCESSFUL' or 3->'RLBOT_DLL_ALREADY_INJECTED'
          It will print the output code and if it's not valid it will kill runner.py
          If RL isn't running the Injector will stay hidden waiting for RL to open and inject as soon as it does