qclauncher

package module
v0.0.0-...-eeb78c7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 25, 2018 License: MIT Imports: 36 Imported by: 0

README

Logo QCLauncher


What Is QCLauncher?

QCLauncher is a small tool for Quake Champions. With it, you can launch Quake Champions without running the Bethesda Launcher or having the Bethesda Launcher open. QCLauncher has just 2 files, uses very few resources, and can be configured to immediately exit after launching the game. You can download it here.

It is very important to recognize that QCLauncher does not entirely replace the Bethesda Launcher. Most importantly, if you are not using the Early Access Steam version of QC you will still need the Bethesda Launcher to download any QC game updates or to verify your game files if necessary. QCLauncher will tell you when Quake Champions game updates are available and you will be unable to play if you do not have the latest version of Quake Champions from Bethesda.

Why?

  • The Bethesda Launcher:

  • Quickly and easily enable undocumented game options.

  • Easily add Quake Champions to Steam and use the Steam overlay if you have not purchased the Quake Champions Early Access version through Steam.


Main window

Download

💾 You can download both the latest version of the binary and source code from the releases page.

Requirements

How to Use (Setup)

  1. Download the latest release and extract the qclauncher.exe file from the zip file.
  2. Double click qclauncher.exe to run QCLauncher.
  3. Click the 'Configure' button and enter the requested information to configure your settings. For the QC user name and password, this will be the same info used for the Bethesda launcher (or the Bethesda forums).
  4. When selecting the QC exe, the default location is: C:\Program Files (x86)\bethesda.net Launcher\games\quakechampions\client\bin\pc
  5. Steam (Optional): If you want to add Quake Champions as a non-Steam game, this can be done under the 'Launcher Settings' tab. Click the check box labeled 'Add as a non-Steam Game (for Steam overlay)'. After you save your settings, Steam will open. Find and select qclauncher.exe in Steam to add it as a non-Steam game. You can rename it to Quake Champions if you want, so that it will be displayed that way in your friends list.
  6. Click the 'Save All' button. If successful, you should be able to play by clicking the 'Play' button.

New game options have been found since the last QCLauncher release, how can I try these new options?

Since version 1.01, it has been possible to pass custom Quake Champions start-up options to QCLauncher with the --customargs flag. For example, create a shortcut to QCLauncher or start QCLauncher in this manner:

qclauncher.exe --customargs="--set /Config/CONFIG/WeaponZScale -10 --set /Config/CONFIG/isLowResParticles 1"

QCLauncher will then pass these options to Quake Champions on launch.

Developers: Build from Source Code (you can skip this if you don't plan on working on the code)

  1. Download and install the latest stable release of the Go Programming Language, which is available here.
  2. Windows - To get the QCLauncher source: go get -ldflags="-H windowsgui -s -w" github.com/syncore/qclauncher
  3. Windows - If you do not have Microsoft Visual Studio 2017 Enterprise Edition, download the Build Tools For Visual Studio 2017 from Microsoft. Afterwards, adjust the msBuildDir variable in this file. If you have VS2017, but not the Enterprise edition (i.e. Professional), adjust the msBuildDir variable to point to its MSBuild.exe executable location.
  4. Linux - To get the QCLauncher source: GOOS=windows GOARCH=amd64 go get -d -ldflags="-H windowsgui -s -w" github.com/syncore/qclauncher
  5. Find your GOPATH. This can be found by entering: go env GOPATH on the command line.
  6. Change directory to GOPATH\src\github.com\syncore\qclauncher
  7. Windows - To build, run build.bat
  8. Linux - To build, run build.sh (the application only runs on Windows, but can be built on Linux/OSX).
  9. If everything went well, you should have the qclauncher.exe file in the bin directory.

Is QCLauncher Considered a Cheat?

No. QCLauncher does NOT touch or modify any game files or game code at all. Any additional functionality that QCLauncher provides is derived from the game itself and the game's built-in commands. The tool is simply a very lightweight utility that launches the game. Use it if you'd like to, or not. I wrote it as a learning exercise in the tradition of contributing to the Quake community. It's open-source. Inspect the code and you will see that there is no funny business going on.

Issues, Contact Me, etc.

I can be contacted under the name syncore on Discord. Any other issues can be opened on the issue tracker here on Github, and I will try to address them, time permitting. Additionally, there is an ESR thread available here and a PlusForward.net thread available here.

👍 🎮 Happy fragging, and please support this latest Quake title! Download it for free at https://www.quake.com

Documentation

Index

Constants

View Source
const (
	LogFile            = "qclauncher.log"
	DataFile           = "data.qcl"
	LockFile           = "qcl.lock"
	ShowMainWindowFlag = "show"
	XAppDefVer         = "1.43.3"
	XLibDefVer         = "1.43.3"
	XSrcFpDef          = ""
)
View Source
const (
	QCExe = "QuakeChampions.exe"
)

Variables

View Source
var (
	ConfLocal             bool
	ConfDebug             bool
	ConfAppendCustomArgs  string
	ConfLocalAddr         string
	ConfXAppVer           string
	ConfXLibVer           string
	ConfXSrcFp            string
	ConfUpdateInterval    int64
	ConfSkipUpdates       bool
	ConfEnforceHash       bool
	ConfMaxFPS            int
	ConfBaseSvc           string
	ConfBaseBi            string
	ConfShowMainWindow    bool
	ConfUseEntitlementAPI bool
	Lock                  *Single
)
View Source
var (
	UILaunchErrorMsg = fmt.Sprintf("An error occurred while executing the launch process. See %s for more information. For support visit: https://github.com/syncore/qclauncher/issues",
		LogFile)
)
View Source
var UseEntitlementAPI = true

Functions

func CheckUpdate

func CheckUpdate(enforceHashIntegrity bool, ut UpdateType) error

func DeleteConfiguration

func DeleteConfiguration(removeLock bool)

func DeleteFile

func DeleteFile(filepath string) error

func Exit

func Exit(code int)

func FileExists

func FileExists(name string) bool

func Get

func Get(s Storable) error

func GetCaller

func GetCaller() string

func GetDataFilePath

func GetDataFilePath() string

func IsErrAlreadyRunning

func IsErrAlreadyRunning(err error) bool

func IsErrAuthFailed

func IsErrAuthFailed(err error) bool

func IsErrHashMismatch

func IsErrHashMismatch(err error) bool

func IsProcessRunning

func IsProcessRunning(processNames ...string) (bool, string, int, []string, map[string]int, error)

func Launch

func Launch() error

func LoadUI

func LoadUI(cfg *Configuration)

func NewLogger

func NewLogger() *qlogger

func Save

func Save(s Storable) error

func SetEntitlementAPI

func SetEntitlementAPI()

func Setup

func Setup()

func ShowErrorMsg

func ShowErrorMsg(title, message string, owner walk.Form)

func ShowFatalErrorMsg

func ShowFatalErrorMsg(title, message string, owner walk.Form)

func ShowInfoMsg

func ShowInfoMsg(title, message string, owner walk.Form)

func ShowQCRunningMsg

func ShowQCRunningMsg(pid int) bool

func ShowWarningMsg

func ShowWarningMsg(title, message string, owner walk.Form)

Types

type AuthResponse

type AuthResponse struct {
	OAuthToken       interface{} `json:"oauth_token"`
	BeamClientAPIKey string      `json:"beam_client_api_key"`
	Token            string      `json:"token"`
	SessionID        string      `json:"session_id"`
	BeamToken        []string    `json:"beam_token"`
	EntitlementIDs   []int       `json:"entitlement_ids"`
	// contains filtered or unexported fields
}

type Branch

type Branch struct {
	ID         int    `json:"id"`
	Project    int    `json:"project"`
	BranchType int    `json:"branch_type"`
	BuildID    int    `json:"build_id"`
	Name       string `json:"name"`
}

type BranchBuildHistory

type BranchBuildHistory struct {
	ID          int    `json:"id"`
	Description string `json:"description"`
}

type BranchInfoResponse

type BranchInfoResponse struct {
	StorageURL         string               `json:"storage_url"`
	LaunchinfoList     []int                `json:"launchinfo_list"`
	FileDiffBuildList  []int                `json:"file_diff_build_list"`
	FileDiffContainers []FileDiffContainer  `json:"filediffcontainers"`
	BuildHistory       []BranchBuildHistory `json:"build_history"`
	Preload            bool                 `json:"preload"`
	PreloadOndeck      bool                 `json:"preload_ondeck"`
	Available          bool                 `json:"available"`
	BranchType         int                  `json:"branch_type"`
	DiffType           int                  `json:"diff_type"`
	Project            int                  `json:"project"`
	Name               string               `json:"name"`
	OnDeckBuild        interface{}          `json:"on_deck_build"`
	DepotList          Depot                `json:"depot_list"`
	Build              int                  `json:"build"`
	PreloadLiveTime    interface{}          `json:"preload_live_time"`
}

type BuildInfoResponse

type BuildInfoResponse struct {
	Projects []Project `json:"projects"`
	Branches []Branch  `json:"branches"`
}

type Configuration

type Configuration struct {
	Core         *QCCoreSettings
	Experimental *QCExperimentalSettings
	Launcher     *LauncherSettings
	Auth         *TokenAuth
}

func GetConfiguration

func GetConfiguration() (*Configuration, error)

func GetEmptyConfiguration

func GetEmptyConfiguration() *Configuration

type Dependency

type Dependency struct {
	Architecture  int    `json:"architecture"`
	CmdlineArgs   string `json:"cmdline_args"`
	ID            int    `json:"id"`
	InstallerLink string `json:"installer_link"`
	Name          string `json:"name"`
	Platform      int    `json:"platform"`
}

type Depot

type Depot struct {
	Depot252298 DepotItem `json:"252298"`
}

type DepotItem

type DepotItem struct {
	ID              int    `json:"id"`
	Platform        int    `json:"platform"`
	Region          int    `json:"region"`
	CompressionType int    `json:"compression_type"`
	DepotType       int    `json:"depot_type"`
	DeploymentOrder int    `json:"deployment_order"`
	DefaultRegion   bool   `json:"default_region"`
	EncryptionType  int    `json:"encryption_type"`
	Language        int    `json:"language"`
	SizeOnDisk      int64  `json:"size_on_disk"`
	Name            string `json:"name"`
	DefaultLanguage bool   `json:"default_language"`
	Build           int    `json:"build"`
	DownloadSize    int64  `json:"download_size"`
	Architecture    int    `json:"architecture"`
	BytesPerChunk   int    `json:"bytes_per_chunk"`
	PropertiesID    int    `json:"properties_id"`
}

type EntitlementBlacklist

type EntitlementBlacklist struct {
	Branches []EntitlementBlacklistBranch  `json:"branches"`
	Country  string                        `json:"country"`
	IP       string                        `json:"ip"`
	Projects []EntitlementBlacklistProject `json:"projects"`
}

type EntitlementBlacklistBranch

type EntitlementBlacklistBranch struct {
	Available  bool   `json:"available"`
	BranchType int    `json:"branch_type"`
	Build      int    `json:"build"`
	ID         int    `json:"id"`
	Name       string `json:"name"`
	Preload    bool   `json:"preload"`
	Project    int    `json:"project"`
}

type EntitlementBlacklistProject

type EntitlementBlacklistProject struct {
	ID int `json:"id"`
}

type EntitlementBranch

type EntitlementBranch struct {
	Available  bool   `json:"available"`
	BranchType int    `json:"branch_type"`
	Build      int    `json:"build"`
	ID         int    `json:"id"`
	Name       string `json:"name"`
	Preload    bool   `json:"preload"`
	Project    int    `json:"project"`
}

type EntitlementCheckAPIResponse

type EntitlementCheckAPIResponse struct {
	UseEntitlementAPI bool `json:"useEntitlementAPI"`
}

type EntitlementInfoResponse

type EntitlementInfoResponse struct {
	Blacklist EntitlementBlacklist `json:"blacklist"`
	Branches  []EntitlementBranch  `json:"branches"`
	Projects  []EntitlementProject `json:"projects"`
}

type EntitlementProject

type EntitlementProject struct {
	BeamClientKey    bool   `json:"beam_client_key"`
	Buildinfo        bool   `json:"buildinfo"`
	DefaultBranch    int    `json:"default_branch"`
	ID               int    `json:"id"`
	Name             string `json:"name"`
	NewChunkDownload bool   `json:"new_chunk_download"`
	NewChunkFormat   bool   `json:"new_chunk_format"`
}

type FileDiffContainer

type FileDiffContainer struct {
	ID        int `json:"id"`
	FromBuild int `json:"from_build"`
	ToBuild   int `json:"to_build"`
}

type FileHash

type FileHash struct {
	File string `json:"file"`
	Hash string `json:"hash"`
}

type GameCodeResponse

type GameCodeResponse struct {
	Gamecode string `json:"gamecode"`
	Project  int    `json:"project"`
}

type Language

type Language struct {
	LangCode string
	Name     string
}

type LaunchArgsResponse

type LaunchArgsResponse struct {
	CheckFilter      bool          `json:"check_filter"`
	DefaultBranch    int           `json:"default_branch"`
	DependencyList   []Dependency  `json:"dependency_list"`
	EulaLink         string        `json:"eula_link"`
	FirewallLabel    string        `json:"firewall_label"`
	FirewallPath     string        `json:"firewall_path"`
	HasOauthClientID bool          `json:"has_oauth_client_id"`
	IconLink         string        `json:"icon_link"`
	InstallFolder    string        `json:"install_folder"`
	InstallRegistry  string        `json:"install_registry"`
	LaunchinfoSet    LaunchInfo    `json:"launchinfo_set"`
	Name             string        `json:"name"`
	NewChunkFormat   bool          `json:"new_chunk_format"`
	NewChunkDownload bool          `json:"new_chunk_download"`
	RequireLatest    bool          `json:"require_latest"`
	State            int           `json:"state"`
	StorageList      []interface{} `json:"storage_list"`
	SupportLink      string        `json:"support_link"`
}

type LaunchInfo

type LaunchInfo struct {
	Default         LaunchInfoItem `json:"8"`  // NOTE: Default is the only relevant item; fragile (?) may change in the future
	BetaTemp        LaunchInfoItem `json:"9"`  // NOTE: fragile (?) may change in the future
	TestMaxFPS      LaunchInfoItem `json:"10"` // NOTE: fragile (?) may change in the future
	PTSArenaBackend LaunchInfoItem `json:"14"` // NOTE: fragile (?) may change in the future
}

type LaunchInfoItem

type LaunchInfoItem struct {
	Architecture int    `json:"architecture"`
	Description  string `json:"description"`
	ExePath      string `json:"exe_path"`
	LaunchArgs   string `json:"launch_args"`
	Name         string `json:"name"`
	Platform     int    `json:"platform"`
	Registry     string `json:"registry"`
	WorkingDir   string `json:"working_dir"`
}

type LauncherSettings

type LauncherSettings struct {
	AutoStartQC       bool
	ExitOnLaunch      bool
	MinimizeOnLaunch  bool
	MinimizeToTray    bool
	SetAsNonSteamGame bool
}

type LauncherStore

type LauncherStore struct {
	*bolt.DB
}

type LauncherUpdateInfo

type LauncherUpdateInfo struct {
	LatestVersion float32
	Date          time.Time
	URL           string
}

type Project

type Project struct {
	CheckFilter bool   `json:"check_filter"`
	ID          int    `json:"id"`
	Name        string `json:"name"`
}

type QCCoreSettings

type QCCoreSettings struct {
	Username string
	Password string
	FilePath string
	Language string
	FP       string
}

type QCExperimentalSettings

type QCExperimentalSettings struct {
	UseMaxFPSLimit          bool
	UseMaxFPSLimitMinimized bool
	UseFPSSmoothing         bool
	MaxFPSLimit             int
	MaxFPSLimitMinimized    int
}

type QCLMainWindow

type QCLMainWindow struct {
	*walk.MainWindow
	TrayIcon *walk.NotifyIcon
	Options  *QCLMainWindowOptions
	Binder   *walk.DataBinder
}

func (*QCLMainWindow) WndProc

func (qm *QCLMainWindow) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr

type QCLMainWindowOptions

type QCLMainWindowOptions struct {
	MinimizeToTray bool
	CanLaunch      bool
	SignedInName   string
}

type QCLSettingsTab

type QCLSettingsTab struct {
	wd.TabPage
	DataBinder *walk.DataBinder
}

type QCLSettingsWindow

type QCLSettingsWindow struct {
	*walk.MainWindow
	Options *QCLSettingsWindowOptions
	Binder  *walk.DataBinder
}

func (*QCLSettingsWindow) WndProc

func (sw *QCLSettingsWindow) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr

type QCLSettingsWindowOptions

type QCLSettingsWindowOptions struct {
	CanSaveSettings bool
}

type ServerStatusResponse

type ServerStatusResponse struct {
	Platform struct {
		Code     int    `json:"code"`
		Message  string `json:"message"`
		Response struct {
			Quake string `json:"Quake"`
		} `json:"response"`
	} `json:"platform"`
}

type Single

type Single struct {
	Locked bool
	// contains filtered or unexported fields
}

Single provides a mechanism to ensure that only one instance of a program is running https://github.com/WeltN24/single

func NewSingle

func NewSingle(name string) *Single

func (*Single) Filename

func (s *Single) Filename(useFullPath bool) string

func (*Single) Lock

func (s *Single) Lock() error

func (*Single) Unlock

func (s *Single) Unlock() error

func (*Single) Wait

func (s *Single) Wait()

type Storable

type Storable interface {
	// contains filtered or unexported methods
}

type TokenAuth

type TokenAuth struct {
	Token string
}

type TokenKey

type TokenKey struct {
	Key []byte
}

type UpdateLauncherResponse

type UpdateLauncherResponse struct {
	LatestVersion float32   `json:"latest"`
	Date          time.Time `json:"date"`
	URL           string    `json:"url"`
}

type UpdateQCResponse

type UpdateQCResponse struct {
	ID     int        `json:"id"`
	Date   time.Time  `json:"date"`
	Hashes []FileHash `json:"hashes"`
	BVer   string     `json:"bver"`
}

type UpdateTime

type UpdateTime struct {
	LastQCUpdateTime       int64
	LastLauncherUpdateTime int64
}

type UpdateType

type UpdateType int
const (
	UpdateAll UpdateType = iota
	UpdateQC
	UpdateLauncher
)

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL