Commit graph

2443 commits

Author SHA1 Message Date
Yamagi Burmeister
32d9119cff CL_HTTP_EnableGenericFilelist() needs curl/download.c linked in.
Reported by @LoneFox78 in issue #369.
2019-02-11 19:20:55 +01:00
Yamagi Burmeister
e049717ac3 Bump version to 7.41pre. 2019-02-07 17:27:09 +01:00
Yamagi Burmeister
25bf4d3e02 Bump version to 7.40. 2019-02-07 17:25:36 +01:00
Yamagi Burmeister
86d438708e Not all libc support the %z format modifier added in C99... 2019-02-05 17:18:01 +01:00
Yamagi Burmeister
f7706b2c06 Fix indention after b44fd32. 2019-02-05 09:15:11 +01:00
Yamagi Burmeister
95bdec447d Include wchar.h, required by wmemset(). 2019-02-04 17:10:28 +01:00
Yamagi Burmeister
0318fb59c7 Update the CHANGELOG. 2019-02-04 14:20:16 +01:00
Yamagi Burmeister
e4665547a8 Try to fix gun fov calculations in the softrenderer.
Until now the softrenderer calculated the fov relative to a hard coded
aspect of 4/3. That's wrong, because we're supporting arbitrary aspects
and we aren't calculating a fov but just a scaling factor to the global
fov which takes the aspect into the account.

Fix this by not taking any aspect calculations into account. BUT: While
this renders the gun with a correct perspective it's positioned much
nearer to the camera / player then in the GL renderers. The GL renderers
work around that problem by enforcing a minimal Z distance of 4 units,
which can't do because we're just calculating a scaling factor...
2019-02-04 13:43:34 +01:00
Yamagi
9c549f1cd2
Merge pull request #363 from 0lvin/image_resize
Soft Render: Image resize
2019-02-04 13:41:54 +01:00
Daniel Gibson
04a33c9837 Fix loading Coop savegames without starting server first 2019-02-03 19:35:38 +01:00
Daniel Gibson
b44fd32572 Save gclient_t::resp.coop_respawn.*weapon to fix coop savegames
This fixed bug #357 - the problem was that
client->resp.coop_respawn.weapon and .lastweapon (pointers to gitem)
were not properly initialized when loading a savegame.
Now those fields are saved (=> we had to bump the savegame version)
and for old savegames client->resp.coop_rewspawn is initialized
from client->pers, as a hack for backwards-compatibility.
2019-02-03 19:01:03 +01:00
Denis Pauk
2a19bfe6cd make variables local 2019-01-31 22:40:16 +02:00
Denis Pauk
3a85943118 Show func in .Sys_Error and .R_Printf 2019-01-31 22:09:33 +02:00
Denis Pauk
b7cac7f8aa Use INT_MIN instead -999999 2019-01-30 23:27:59 +02:00
Denis Pauk
c80820500b Fast lights clean 2019-01-30 23:22:00 +02:00
Denis Pauk
e43859de4a Fast lights clean 2019-01-30 23:19:10 +02:00
Denis Pauk
dcc2892de0 Use resize stb image 2019-01-30 23:06:25 +02:00
Denis Pauk
1dfb54bf38 Add code for retore mips 2019-01-30 23:03:38 +02:00
Denis Pauk
203bc4b202 Update stb_image and add stb_image_resize code 2019-01-30 22:43:54 +02:00
Denis Pauk
07c472cfd2 Remove adivtab 2019-01-30 22:42:21 +02:00
Yamagi Burmeister
29bb6e5c6c Fix last commit, pack can be NULL. 2019-01-30 17:14:14 +01:00
Yamagi Burmeister
5ddab0e4bf Allow UDP download from paks that are not numbered.
Until now the UDP download code prohibited downloading of maps from all
pak files. That was some kind of copy protection, without the limitation
demo users could download assets from the full version. Don't apply that
protection for all paks, but only for numbered .pak files.

This could be enhanced by limiting the protection to pak0 to pak2 for
baseq2 and pak0 for both xatrix and rogue.
2019-01-30 17:14:14 +01:00
Yamagi Burmeister
900d35ef27 Hack in support for q2pro filelists.
r1q2 places the global filelist at /.filelist, q2pro at
/gamedir/.filelist...

Now I'm feeling even more dirty.
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
67b1a8fd95 Implement q2pro URL scheme.
The r1q2 URL generator was, like everything in this game, buggy. It took
cl.gamedir into account when generating the URLs, but overlooked that it
is only set when 'gamedir != BASEDIR'. So baseq2 assets ended up with
/maps/foo.bsp and mod assets with /mod/maps/foo.bsp. q2pro fixed that
to always include the gamedir...

Work around this by refactoring the HTTP -> UDP fallback logic to be
more generic: Count the number of iterations and depending on the
iteration set the gamedir to be used by the URL generator or force
UDP downloads.
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
c06af7de57 Reset error state when getting a new download server. 2019-01-30 17:14:13 +01:00
Yamagi Burmeister
1d9acffe0b Ensure that internal pathes are always starting with a /.
Otherwise the URL generator might generate invalid URLs...
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
d38929170b Download the generic filelist only once.
Cleaning the download queue as soon as a file finished downloading leads
in combination with only one parallel download and multiple precacher
runs to an ugly problem: The generic filelist is requested several time
which can lead to cycles. Hack around this by rembering if we already
requested it and reset set reminder as soon as the precacher finished.

Yes, I'm feeling dirty.
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
5e67596d56 Strip trailing slashes from download server URL.
If the server sends us an URL with trailing slash we're generating URIs
like http://example.com//maps/foo.bsp. While double // are perfectly
valid they might me rejected by some servers. So let's play save.
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
e05f95e3fb Don't free() the download queues last element twice.
While at it replace the crappy Z_TagMalloc() with the standard malloc().
Z_TagMalloc() ist just a wrapper arround malloc(), there's no functional
change.
2019-01-30 17:14:13 +01:00
Yamagi Burmeister
eb048e8611 Implement fallback logic from HTTP downloading to UDP.
This looks easy, but is rather hacky... Downloading is implemented
through the precacher. The server sends an asset list, while loading
the map another one is generated. CL_RequestNextDownload() goes
through this list, in the order models / maps -> sounds -> images,
calls CL_CheckOrDownloadFile() for each file. CL_CheckOrDownloadFile()
checks if the file is already there, return true if it is and false
if not. If the return code is false CL_RequestNextDownload() itself
returns, it's called again by CL_ParseDownload() as soon as the just
queued file finished downloading. This way all missing files are
downloaded one after the other, when CL_RequestNextDownload() finally
reaches it's end (all files are there) it send 'begin' to the server,
thus putting the client into the game.

HTTP downloads are parallel, so CL_RequestNextDownload() cannot track
which files are there and which are missing. The work around for that is
to queue the file but have CL_CheckOrDownloadFile() return true. So
CL_RequestNextDownload() thinks the file is already there, continues
with the next one, until all missing files are queued. After that it
polls CL_PendingHTTPDownloads() and sends the 'begin' as soon as all
HTTP downloads are finished.

If a HTTP download fails we cannot just queue it as UDP download,
because the precacher things that the file is already there. And we
can't tell the precacher that it's not because the precacher tracks
files only by the number of downloaded files per asste type and not
their name. Just decreasing the number of downloaded files isn't
possible since the precacher may have progressed to the next asset
type.

So: On the HTTP side it's tracked if there was an error or not.  After
CL_RequestNextDownload() has queued all files and waited for all HTTP
downloads to finish it checks the HTTP error status. If there was an
error the precacher state is reset and CL_RequestNextDownload() recurses
into itself to take another run. All files that couldn't be downloaded
are queued again, this time as UDP downloads.
2019-01-30 17:14:13 +01:00
Yamagi
78366472f9
Merge pull request #351 from CanntAim/master
Fixed menu code to correctly parse maps.lst file.
2019-01-19 16:53:52 +01:00
Yamagi
dc623840ea
Merge pull request #358 from 0lvin/delete_menu
Use separator instead action in delete menu header
2019-01-19 16:52:53 +01:00
Denis Pauk
a1773b91d7 Use separator instead action in menu header 2019-01-16 23:23:48 +02:00
Neil Richardson
a83add6ea9 Fix case error for linux -> win32 cross compile 2019-01-13 20:40:58 +01:00
Jonathan Bergeron
d82708b448 added windows implementation of sys_removedir and used snprintf in the unix one 2019-01-13 20:33:30 +01:00
JBerg
867046bb8b requested fixes my last commit: proper null checks + undid my removal of a slash + fixed my previous use of va() 2019-01-13 20:32:39 +01:00
JBerg
be8bab6603 added feature to delete savegames 2019-01-13 20:32:39 +01:00
Yamagi Burmeister
7d9016510e Fix snd_restart. it should restore the OGG playback state.
My solution to this problem is somewhat hacky. A newly added function
OGG_SaveState() can be called to save the state and OGG_RecoverState()
at a later time to restore it. There's only one state and it works
only iff OGG is state playing.

This closes #347.
2019-01-05 19:26:50 +01:00
Yamagi Burmeister
46503018f0 Require cURL in CMakeLists.txt if USE_CURL is defined. 2019-01-05 16:53:00 +01:00
Daniel Gibson
f0d848d3d3 Documentation for HTTP downloading 2019-01-03 16:54:22 -01:00
Yamagi Burmeister
ec6e0ee392 Provide a write callback to cURL.
If we're passing file handles to libcurl to write the data into, the
game may crash under Windows due to incompatible C runtimes between cURL
and quake2. This is even mentioned in the official cURL doku.
2019-01-03 17:42:22 +01:00
Yamagi Burmeister
2199b67a39 Limit the number of parallel downloads to just 1.
Since the moment I took a very first look at the download code I wasn't
a friend of parallel downloads. There're several reasons for that:

- Parallel downloading needs some ugly hacks. For example downloading a
  pak file has a high chance to make asset downloads running in parallel
  unnecessary.
- Parallel downloads are hard to debug.
- There's just no need for them. I've tested several connection, 1
  GBit/s LAN, 50 MBit/s DSL, 6 MBit/s DSL, and there wasn't a
  significant difference between 1, 4 or even 16 parallel downloads.

I'm leaving the parallel download code in place. I someone really wants
parallel downloads he can bump the MAX_HTTP_HANDLES define.
2019-01-03 17:40:06 +01:00
Ivan Pozdnyakov
d43a77029c
Fixed menu code to correctly parse maps.lst file. 2018-12-22 01:14:47 -05:00
Yamagi Burmeister
7b200208c5 Fix the signal handler.
The signal handler was always fishy since it modified the global process
state but worked on all common platforms. libcurl turns the process into
a multithreaded environment, thus breaking that fragile construction.
After the signal handler was called the global state is inconsistent and
there's a high chance of things going wrong. For example at the net curl
download or when setjmp() is called in Qcommon_Frame().
2018-12-20 18:01:38 +01:00
Yamagi Burmeister
95c1bb9972 Some alterations to the libcurl search pathes.
- On Linux try libcurl.so last, because that one is for linking only.
- Support libcurl.dll on Windows.
2018-12-20 18:01:38 +01:00
Yamagi Burmeister
537e6d8de3 Port the server side of HTTP downloading from q2dos. 2018-12-20 18:01:38 +01:00
Yamagi Burmeister
5b44c9f3b4 Make the (new and old) download code UTF-8 compatible.
- Replace all remove() with Sys_Remove().
- Implement Sys_Rename() and replace all rename() with it.

This is believed to close #348.
2018-12-20 18:01:38 +01:00
Daniel Gibson
49bb6bf9f0 Don't leak download queue entries, remove them as soon ans file is done.
Until now download queues entries were created for each file, but only
removed in the unlikely event of changed download server. This leaked
about 4200 byte per file. Fix this by:

- Create a new function CL_RemoveFromQueue() that removes a queue entry
  and call it everytime when a download either finished, failed or
  aborted.
- Retire the 'download done' state, just the queue entries associated
  with a download handle to NULL to communicate that the handle is
  unused.
- Cleanup the full queue at shutdown.
2018-12-20 18:01:38 +01:00
Yamagi Burmeister
04a1a6958d Fix USE_CURL build under Windows. 2018-12-20 18:01:38 +01:00
Yamagi Burmeister
2271c0bb91 Add the HTTP and cURL stuff to cmake. 2018-12-20 18:01:38 +01:00