GithubHelp home page GithubHelp logo

hrehfeld / quakeinjector Goto Github PK

View Code? Open in Web Editor NEW
91.0 15.0 15.0 973 KB

Download, install and play quake singleplayer maps from the quaddicted.com archive

Home Page: https://www.quaddicted.com/tools/quake_injector

License: GNU General Public License v3.0

Java 100.00%
quake quake-singleplayer-maps quake-injector installer mod

quakeinjector's Introduction

Quake Injector

Quake Injector is a tool to download, install and play Quake (some call it "Quake 1") singleplayer maps from the "Quaddicted archive":https://www.quaddicted.com - basically the complete history of all quake singleplayer maps ever made. Ever been annoyed by an excruciating installation process? Could not figure out how to install a certain map? Well, this tool makes it a piece of cake. Simply pick a map and click Install.

Screenshot of the Quake Injector

Features

Installation

On Windows you can use a self-contained executable. On Linux and MacOS you need Java.

Windows

  1. Download the latest "QuakeInjector.exe" release
  2. Extract the .zip file
  3. Double click the QuakeInjector.exe

Linux and MacOS

  1. Make sure you have a recent Java installed
  2. Download the latest Quake Injector release
  3. Extract the .zip file
  4. Double click lib/quakeinjector.jar, or start it with java -jar lib/quakeinjector.jar. On Windows, you can also use the supplied quakeinjector.bat.

Keep in mind this software is still in heavy development. The alpha tag hints at it not being feature complete, and possibly buggy. See the included licence (COPYING) for more details on warranties, etc. (there are none).

Basic Manual

Filtering, Sorting and the Package Table

Right above the table of available packages you see a filter field. Here you can specify a filter for the listing. Let's say you want to see only maps from 2001? Enter "2001" without the quotes. Or for all maps by Vondur, enter "Vondur". You can also enter multiple words, they will be connect by a logical AND. So "czg 2000" would show you all maps czg made in 2000. To reset the filter simply delete all text from it.

At the top of the package list there are the table headers (duh!). Click on them to sort the table.

This works well in combination with a filter. For example you could look at all maps from 2008 sorted by rating.

Known Problems

  1. On Linux/MacOS and other case-sensitive operating systems you won’t have much joy as there is no engine that can ignore the case of filenames yet. There will be one and it will be a good one, but for now you're pretty much on your own, as a lot of maps were packed with mixed case filenames by the original authors.

  2. Also be aware that most engines cannot run some of the latest and greatest maps, because those maps break the original quake engine limits. A modern Quake engine is recommended.

Development

Bugs and feedback

If anything that feels weird occurs to you, or you find a definite bug, please report it as an issue. Likewise, give us a shout if you want to help with development. Pull requests are what powers the project!

Running from source

To run the application for development, run the following command in the root directory.

On Windows:

gradlew.bat run

On Unix:

./gradlew run

Building

To build a jar, grab the source and run the following command in the root directory. The jar will be in the build/libs directory.

On Windows:

gradlew.bat assemble

On Unix:

./gradlew assemble

Building a Windows EXE

To build an EXE for Windows, grab the source and run the following command in the root directory. It will create a zip in the build/distributions directory.

On Windows:

gradlew.bat winDist

On Unix:

./gradlew winDist

Notes

  • Use an annotated Git tag to define the name of the resulting JAR: git tag -a "alphaXX" -m "alphaXX" will make gradlew compile QuakeInjector-alphaXX.jar.

Credits

  • Hauke 'megaman' Rehfeld (initial programming)
  • Spirit (initial concept)
  • These lovely people (updates, fixes, features, maintenance) ❤️

quakeinjector's People

Contributors

duganchen avatar ericwa avatar hrehfeld avatar jjelliott avatar neogeographica avatar pettyalex avatar spiritquaddicted avatar warsen avatar wrfitch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quakeinjector's Issues

overwriting "no files" leaves injector in somewhat undefined state

  1. Have a package's files installed already.
  2. Choose to install that package
  3. Uncheck all files in the overwrite dialog

I had it show the package as installable (ie the "install" button available) once.

Next time with a different package all buttons were grey and the cancel button was still next to the progress bar. It remained there even after installing other packages. Pressing it gave:

xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at de.haukerehfeld.quakeinjector.Installer.cancel(Installer.java:101)
at de.haukerehfeld.quakeinjector.PackageInteractionPanel$8.actionPerformed(PackageInteractionPanel.java:281)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

After selecting another package and going back to the "not overwritten" one however, the "play" and "uninstall" buttons were properly displayed.

Server Timeout doesn't show nice dialog

 [java] Reading installedMaps.xml                                                                         
 [java] database parsing failed: java.net.ConnectException: Connection timed out: connect                 
 [java] java.net.ConnectException: Connection timed out: connect                                          
 [java]     at java.net.PlainSocketImpl.socketConnect(Native Method)                                      
 [java]     at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)                               
 [java]     at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)                        
 [java]     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)                                 
 [java]     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)                                 
 [java]     at java.net.Socket.connect(Socket.java:519)                                                   
 [java]     at java.net.Socket.connect(Socket.java:469)                                                   
 [java]     at sun.net.NetworkClient.doConnect(NetworkClient.java:163)                                    
 [java]     at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)                                
 [java]     at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)                                
 [java]     at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)                                    
 [java]     at sun.net.www.http.HttpClient.New(HttpClient.java:306)                                       
 [java]     at sun.net.www.http.HttpClient.New(HttpClient.java:323)                                       
 [java]     at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:852)   
 [java]     at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:793)       
 [java]     at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:718)            
 [java]     at de.haukerehfeld.quakeinjector.Download.connect(Download.java:69)                           
 [java]     at de.haukerehfeld.quakeinjector.PackageDatabaseParserWorker.getDownloadStream(PackageDatabaseParserWorker.java:57)                                                                                         
 [java]     at de.haukerehfeld.quakeinjector.PackageDatabaseParserWorker.doInBackground(PackageDatabaseParserWorker.java:41)                                                                                            
 [java]     at de.haukerehfeld.quakeinjector.PackageDatabaseParserWorker.doInBackground(PackageDatabaseParserWorker.java:31)                                                                                            
 [java]     at javax.swing.SwingWorker$1.call(SwingWorker.java:278)                                       
 [java]     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)                         
 [java]     at java.util.concurrent.FutureTask.run(FutureTask.java:138)                                   
 [java]     at javax.swing.SwingWorker.run(SwingWorker.java:317)                                          
 [java]     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)        
 [java]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)            
 [java]     at java.lang.Thread.run(Thread.java:619)                                                      

Closed Issues

  • fetch and update the xml files from quaddicted.com
  • parsing and nicely rendering/displaying the quaddicted xml files
  • downloading zip files from quaddicted.com
  • unzip /install and deinstall packages
  • configure engine path
  • let the user setup his preferred commandline options (and maybe cfg too)
  • launch quake with commandline parameters from the preferences and from the currently selected package
  • bug: bei installierten files wird die id auf dem ausgegrauten "install $id" nicht aktualisiert
  • fix: cursor keys in tabledisplay don't update the startmap combobox when coming from label to enabled combobox
  • parse and install requirements
  • sorting of the package display
  • filtering of the package display
  • fix: selection is independant of sorting ?!
  • fix: QuakeInjector needs to listen on changes of EngineConfigDialog and save the paths
  • add file selection to enginepath/engineexecutable
  • fix: filter box input before xml arrives causes exception
  • install requirements sequentially

prompt before overwriting existing files during installation

Prompt before overwriting existing files. For example if a user has Quoth installed manually and then tells the Injector to install Quoth, the Injector will overwrite the existing .pak files.

Instead prompt before overwriting. "File xyz.abc already exists, overwrite xyz.abc?" Yes, No, Cancel (, Rename?)

If possible show file size and time in the dialog of both files.

show if map is played and/or has savegames

  1. Launching a map simply sets the status to “launched”, the user can modify the state by hand.
  2. try parsing savegames.

Add as an extra column next to the rating one then.

Links in descriptions don't work

If a description contains a link and you click it, nothing will happen.
Since links might be internal (href=package.xml) at Quaddicted or external, it might be the right idea to either ignore links or make them open in the browser.

Add some checkboxes for filter options

or special syntax?
For example:

Only display maps that are installed (or not)
Only display maps of a special "type" (type="1,2,3,4", maps, mods, etc)

Install requirements once

If a package references two requirements, and one requirement references the other, the second one gets installed twice.

Hack idea: copy configs to mod directories

Some mods bring their own cfg files. While that is a good idea when these are binding new impulses and such, many people have their very own idea what keys they want to use and for them this is highly annoying.
One could copy *.cfg from id1/ to newdir/ after installing the zip and overwrite those. This would NEED to be a configurable thing (like the savereload-hack-whatever) as it would "break readmes".
This would need some serious brainstorming and discussion.

Rating title gets truncated when sorted

When you sort by rating the "Rating" title of the column gets truncated because of the Arrow icon. Seems a minor to negligible thing to me. Maybe just allow resizing that column?

Screenshots are downloaded twice

I guess the GUI is first "set", the screenshot being downloaded. And then it is refreshed/displayed once getting the screenshot again. The GET requests are milliseconds apart.
Maybe the screenshot bit has to be somehow moved into its own function? (Might work together with http://github.com/hrehfeld/QuakeInjector/issues#issue/10 )
From what I can see, the screenshot is downloaded twice (judging from monitor local traffic of the Injector).

Install requirements only once

If a package references two requirements, and one requirement references the other, the second one gets installed twice.

Show engine's shell output

Usually some engines log their console output or more or less to the shell they were spawned in (stdout?). When launched through the Injector this output is not visible in the shell (if the Injector was launched in one). It would be handy if it was.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.