Commit graph

108 commits

Author SHA1 Message Date
Yamagi
c9913eb538 Detect if an autosave is loaded and advance world by 100 frames.
Autosaves are special. The are a byproduct of the level change process.
When loaded they aren't respawning the player at it's last position, the
player is relocated to func_playerstart. Since entities spawn at their
start position, the player may end up in the wrong spot.

One example is train.bsp -> base2.bsp. The platform spawns in upper
position, the player in lower position. The platform comes down and
crushes the player.

Most of these cases work by luck when the client isn't paused during
load, because the world advances a few frames before the player is
spawned. Implement a better fix: Detect if an autosave is loaded (name
is save0 or current) and treat it like a map change, advance the world
by 100 frames. We cant use the `autosave` boolean, because it's in the
game savefile.

Fix suggested by @BjossiAlfreds, closes #711.
2021-05-29 17:16:42 +02:00
Yamagi
baae6bed89 Send protocol version to client.
Knightmare of KMQ2 requested this as an easy way to support client site
prtocol auto detection.

While here fix the protocol version number in the error string.
2021-03-28 18:48:38 +02:00
Yamagi
2fae58d56b Implement singleplayer in the dedicated server.
When set to `1`, both `deathmatch` and `coop` are forced to `0`.
`maxclients` is forced to `1`. This makes it possible to play single
player campaigns over the dedicated server.

Closes #614.
2021-01-17 11:07:46 +01:00
Denis Pauk
db20a6ce18 Add ioquake3 vstr/nextdemo support 2020-10-06 23:38:12 +03:00
Yamagi
634748a5b5 Add missing return type for SV_ListMaps_f() 2020-08-23 10:34:52 +02:00
JBerg
b746f4520d added listmaps command 2020-08-18 23:18:22 -04:00
Yamagi
d1a53bdeec
Merge pull request #551 from DanielGibson/scancode-input
Scancodes for Input and other keyboard input improvements
2020-04-20 08:59:55 +02:00
Daniel Gibson
f1a81a5611 SV_Frame(int _usec_) instead of msec
it's microseconds, not milliseconds.
2020-04-08 15:28:59 +02:00
Yamagi
904f14f2ff Bump MAX_STRING_CHARS to 2048 and MAX_TOKEN_CHARS to 1024.
This allows for longer arguments passed to cvars, gl_nolerp_list is a
good example for a case were a token length of 128 is too short. Keep
the mapname[] buffer in the server struct at 128 bytes to preserve
savegame compatibility.

Closes #526.
2020-03-14 17:15:40 +01:00
Daniel Gibson
9f22f3d298 PVS Studio: Misc. fixes and FIXMEs 2020-02-10 17:55:41 +01:00
Daniel Gibson
ae3723c900 YQ2_ATTR_NORETURN for functions that don't return (Sys_Error() etc)
must be used in front of functions, not behind (the GCC __attribute__
allows both, but MSVC and C11 don't!)
2020-02-10 17:55:41 +01:00
Denis Pauk
b1d3ddebbc use vsnprint in Com_Printf functions 2020-01-30 22:28:13 +02:00
Yamagi
bec90db5fe Add missing stdint.h includes. This fixes the build on Windows. 2019-11-13 19:07:49 +01:00
Daniel Gibson
378f01f7b5 SV_FatPVS(): use int32_t instead of long, as the code assumes it's 32bit 2019-09-25 21:39:02 -01:00
Daniel Gibson
d615190e36 Fixes for PVS Studio warnings: warnings in unix/main.c and sv_send.c 2019-08-24 20:40:06 -01:00
Daniel Gibson
f9c77b98af YQ2_ALIGNAS_*() in common.h 2019-08-24 20:38:42 -01:00
Daniel Gibson
bebd9e73b3 YQ2_COM_CHECK_OOM() macro to check if malloc() etc was successful 2019-08-21 21:07:31 -01:00
Daniel Gibson
d2d87025fa Fix case of map savegames name (save/bla/MAPNAME.sav/sv2)
introduced FS_GetFilenameForHandle(fileHandle_t) for this

this helps if a map has been started with "wrong" case, which doesn't
immediately fail if it has been loaded from a pack, but will result
in invalid savegame names that (with case-sensitive FSs) will fail to
load (when going back to a formerly played level)
2019-02-17 18:46:57 +01:00
Yamagi Burmeister
b49f2bda6d Reconnect entity states of clients >1 when running in coop mode.
While loading a savegame the global edict arrays is free()ed and newly
malloc()ed to reset all entity states. When the game puts the first
client into the server it sends it's entity state to us, so as long as
there's only one client everything's okay. But when there're more
clients the entity states if all clients >1 are dangeling. Hack around
that by reconnecting the clients >1 entity states "manually".
2019-02-15 19:50:56 +01:00
Daniel Gibson
04a33c9837 Fix loading Coop savegames without starting server first 2019-02-03 19:35:38 +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
537e6d8de3 Port the server side of HTTP downloading from q2dos. 2018-12-20 18:01:38 +01:00
Yamagi Burmeister
9525dc35a8 Some small cleanups to entity file support.
- Fix some compiler warning about wrong format strings.
- Comply to code style.
- Remove unnecessary comments.
2018-10-07 09:51:19 +02:00
NeonKnightOA
d036868600 Add support for external entity files (.ent files).
This was ported from KMQ2.
2018-10-07 09:50:54 +02:00
Yamagi Burmeister
012ab85b31 On Windows we need to pass wchar strings to remove().
Until now the server just called remove() to delete the servers state
from the HDD. That was fine on Linux were UTF-8 is used but failed
silently on Windows in case that the working dir path had some Unicode
characters. Replace remove() by Sys_Remove(), on Linux it's just a
wrapper around remove() on Windows it does a UTF8->UTF-16 conversion
and calls _wremove(). This fixes issue 318.
2018-09-30 18:57:06 +02:00
Yamagi Burmeister
6b13d77c36 Change the current working directory before writing save games.
We can't rely on the game.dll being unicode conformant. Work around
that by changing the current working directory before calling into
the game.dll, pass a non unicode string to it and chang back after
we return.
2018-02-05 18:00:28 +01:00
Yamagi Burmeister
37ea3e1d58 Introduce a wrapper Q_fopen() and replace fopen() with it.
On Unix platforms unicode is implemented through UTF-8 which is
transparent for applications. But on Windows a UTF-16 dialect is
used which needs alteration at application side. This wrapper is
another step to unicode support on Windows, now we can replace
fopen() by a function that converts our internal UTF-8 pathes to
Windows UTF-16 dialect.

This is a noop for Unix platforms. The Windows build is broken,
the compiler errors out in shared.h. This will be fixed in a
later commit.

Caveats:
* fopen() calls in 3rd party code (std_* and unzip) are not replaced.
  This may become a problem. We need to check that.
* In the Unix specific code fopen() isn't replaced since it's not
  necessayry.
2018-02-05 07:43:26 +01:00
Denis Pauk
c43e944a3d Rebase soft render from https://icculus.org/quake2/
* deleted asm code
* added support 2k+ resolutions
* SDL2 support
2017-12-11 23:33:19 +02:00
Yamagi Burmeister
629683ab40 Also print errors when build with DEDICATED_ONLY. 2017-09-07 13:17:02 +02:00
Yamagi Burmeister
465963a1a5 Reconnect the server to the global timing.
Having the server in an own timing zone seems to simplify things but
introduces slight timing discrepancies. The most visible effect is that
the game runs a little bit too fast, especially in the first cl_maxfps
frames.

Therefor: Remove timeframes, they're unnecessary. Track the time since
the last (client|server) frame instead and pass it to the client and
server when it's called.
2017-09-06 18:36:51 +02:00
Yamagi Burmeister
f16242e923 Determine svs.realtime from curtime and not the global timing.
This is the same as the client does for it's realtime. It looks at least
somewhat more correct since it pevents rounding errors. And things are
simplified a litte bit since the server timing is now independent of the
global timing.
2017-09-06 18:36:51 +02:00
Yamagi Burmeister
9efd831312 Refactoring the search path magic, step 3: Remove now used code.
Remove all functions that are no longer used:

* FS_AddGameDirectory()
* FS_SetGameDir()
* FS_AddHomeAsGameDirectory()
* FS_AddBinaryDirAsGameDirectory()

While at it try remove as much global variables from filesystem.c as
possible. Also fix a small, longstandig bug: The download code should
treat .zip and .pk3 files as pak files and not as normal directories.
2017-07-23 08:47:41 +02:00
Yamagi Burmeister
1d709e5e27 Move file name check to prevent spurious "refusing to download messages
Moving the check under the "do we have the file localy" check prevents
spurious "Refusing to download a path with .." messages with some game
data. The tank commander skin is one example. This change has no
security impact since FS_LoadFile() just opens and closes the file.

While at it tighten the condition to prevent pathes with colons (this
condition is added at the server side, too) and pathes starting with
slashes and dots.
2015-10-27 17:38:28 +01:00
Yamagi Burmeister
7456daf65f Do not display baseq2 savegames in mods / addons
The savegame list is generated by calling FS_FOpenFile() for each
possible savegame name. When a file handle is returned the savegame
exists, otherwise the savegame slot is empty. But FS_FOpenFile()
searches in every directory known to the VFS. If a savegame file
isn't found in $moddir but in baseq2, the file in baseq2 is opened
and a baseq2 savegame is displayed in the mods / addons savegame menu.

The fix is compromise between a clean solution and invasiveness:

- Refactor FS_FOpenFile() to include FS_FOpenFileRead(). FS_FOpenFile()
  was used only to open read only files, limit its's possibilities to
  do exactly that.
- Introduce a new flag "gamedir_only" to FS_FOpenFile(). When true
  only the gamedir directories are searched and not other directories
  like baseq2.
- Change all callers to FS_FOpenFile()s new signature.
- Use the new gamedir_only flag to limit the searchpath for savegames
  to the gamedir.
2015-10-25 16:44:22 +01:00
Yamagi Burmeister
bd025ae5c5 Fix an off-by-one in memmove() call in SV_Map()
Submitted by: Ozkan Sezer
2015-08-24 18:02:08 +02:00
Daniel Gibson
d19cace026 Set MAX_OSPATH to 4096 for !Windows + fixes for that
sounds easy, right?
Except some genius decided to save CVAR_LATCH cvars in buffers of
MAX_OSPATH length into savegames.. so just changing MAX_OSPATH
breaks savegame compatibility.
Fortunately, this assumption only matters in SV_WriteServerFile() and
SV_ReadServerFile() so I worked around it by introducing a
platform-specific LATCH_CVAR_SAVELENGTH (because MAX_OSPATH was 256 on
Windows but 128 on other systems..)
2015-05-23 02:02:27 +02:00
Yamagi Burmeister
eb879bb9b6 Rename VERSION to YQ2VERSION to prevent collisions
Newer jpeg versions (I guess starting with 9) define an macro
"VERSION", colliding with ours. While wie could #undef it, take
the less hacky route and rename it.
2014-01-27 18:14:36 +01:00
svdijk
6472514c8f Lets not do the last two commits just before 5.11
Revert "change several strcat calls to Q_strlcat calls"
This reverts commit ab879f1bc7.

Revert "change (v)sprintf calls to (v)snprintf calls"
This reverts commit b46e210d76.
2013-05-18 18:59:39 +02:00
svdijk
ab879f1bc7 change several strcat calls to Q_strlcat calls 2013-05-17 22:25:18 +02:00
svdijk
b46e210d76 change (v)sprintf calls to (v)snprintf calls 2013-05-17 21:50:31 +02:00
svdijk
be63c7f198 note to self: always compile before you commit 2013-05-13 21:39:53 +02:00
svdijk
a5044a93eb make sure svs.demofile is set to NULL after closing it 2013-05-13 21:26:58 +02:00
svdijk
f5a44ff5ae remove unnecessary fileHandle_t typecasts 2013-05-13 21:11:52 +02:00
svdijk
2ad4255187 fix sv.demofile/svs.demofile type/treatment 2013-05-13 21:00:50 +02:00
svdijk
8fad0a9008 change some more (mostly wrong) strncpy calls to Q_strlcpy calls 2013-05-12 20:25:00 +02:00
svdijk
7c1d2b4219 fix incorrect typecasts in FS_* calls 2013-05-11 15:22:27 +02:00
svdijk
e07294b6b1 replace most strncpy calls (several of them wrong) by Q_strlcpy calls 2013-05-11 14:44:36 +02:00
svdijk
4682c888f0 replace strncat calls by Q_strlcat calls 2013-05-11 13:24:13 +02:00
Yamagi Burmeister
d9519cee61 Remove an unneccessary check.
This check involved an uninitialized pointer, so it never worked. It
could lead to crashes in some situations, especially when clients tried
to reconnect after a manual map change on the dedictated server.
2013-03-10 12:08:58 +01:00
svdijk
76e3480ccb Some rewriting of windowed_mouse setting, in preparation of releasing the mouse in the menu. 2012-10-30 20:36:15 +01:00