2715: Fix server responses handling in game browser r=heinrich5991 a=BannZay
Fixes all problems for #2620
Explanations of existed problems:
Lan has non expected servers because we were creating browser entry regardless token check
DDNet tab has ping 0 for servers as we weren`t rejecting previous refresh responses
Co-authored-by: Andrii <bannzay3@gmail.com>
2713: allow empty max ping filter r=heinrich5991 a=BannZay
The inconvenieces I discovered so far:
1. You got to write 999 to "disable" this filter
2. If you try to clear this field and then type 75 then the field will contain 750 because the last zero is bugged at this point
Those are fixed
What I would like to be fixed as well (not sure if I gona do this soon):
1. Update browser servers live without refreshing. You press refresh - you receives all the servers and then you should be able (but currently not) to filter them out without pressing on "Refresh" button again but just by changing the max ping value
Co-authored-by: Andrii <bannzay3@gmail.com>
2674: Add nameplates friend marks r=heinrich5991 a=BannZay
Problem: when I play with a friend in team 0, and there are many players nearby, I cannot distinguish him due to nameplates overlapping. It's getting worse when they are in freeze.
Solution: Mark your teammate as "Friend" and setup "cl_nameplates_friendmark"
Result:
![v2](https://user-images.githubusercontent.com/17499770/91647684-08988b00-ea66-11ea-9407-336437391b4f.png)
Co-authored-by: Andrii <bannzay3@gmail.com>
2710: Fix layers right click on item opens menu for previously selected (left clicked) item r=heinrich5991 a=BannZay
```
Im 'corneumToday at 16:55
when i have a layer selected and rightclick on another one to change its properties, it doesnt switch to that layer. that hasnt always been this way and its throwing me off lately
especially because it still opens the menu for the other layer
```
Co-authored-by: Andrii <bannzay3@gmail.com>
2708: Disabling 3.3 in settings tab should reset to version 3.0 r=def- a=Jupeyy
We don't have a way to query the default config value, except including the config_variables.h, do we?
Co-authored-by: Jupeyy <jupjopjap@gmail.com>
Currently, this just shows the current map in the status. Might need
localization data in Steamworks to be available to work in languages
other than English.
CC #2642
2691: Also check for divisibility by 16 of height (fixes#2687) r=heinrich5991 a=def-
2701: Set search field active when opening file dialog in editor r=heinrich5991 a=def-
2702: Remove fallback for Teeworlds' settings.cfg (partially fixes#2698) r=heinrich5991 a=def-
2705: Clarify kill and /kill r=heinrich5991 a=def-
Co-authored-by: def <dennis@felsin9.de>
2678: Load serverbrowser more fairly r=heinrich5991 a=def-
One from each country and so on instead of doing one country fully first
before moving to the next. This makes loading servers like Japan and AUS
much faster since they're at the back of the list. This also reduces the
peak number of packets sent to each IP at once.
2681: Upgrade SDL2 for Linux Steam release to 2.0.12 (fixes#2679) r=heinrich5991 a=def-
Co-authored-by: def <dennis@felsin9.de>
One from each country and so on instead of doing one country fully first
before moving to the next. This makes loading servers like Japan and AUS
much faster since they're at the back of the list. This also reduces the
peak number of packets sent to each IP at once.
2665: Use the correct name for determining ranks r=def- a=heinrich5991
Was broken by the recent Steam name update.
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2667: Fix server port in teehistorian r=def- a=heinrich5991
Official servers weren't affected because they didn't use the default of
`sv_port 0`.
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2662: Read server port from CNetServer but not from app config r=def- a=BannZay
Due to a34c72530b we may see "[register]: ERROR: configure your firewall/nat to let through udp on port 0."
Reason: reading port data from configs but not from server object itself
I am new to server code, take a close look to changes please
Co-authored-by: Andrii <bannzay3@gmail.com>
2656: Forbid some more whitespace and whitespace-like characters r=Learath2 a=def-
Made sure everything from
https://en.wikipedia.org/wiki/Whitespace_character#Unicode is included
As reported by Im 'corneum
Co-authored-by: def <dennis@felsin9.de>
2653: Fix background map loading r=def- a=Jupeyy
As reported.
Tested all possible contexts, hope this is right now
Co-authored-by: Jupeyy <jupjopjap@gmail.com>
2648: Support Linux shared libs in autoupdater r=Learath2 a=def-
Since we now ship our first shared lib on Linux, libsteam_api.so
Co-authored-by: def <dennis@felsin9.de>
2647: No sampler calls in old OpenGL API r=def- a=Jupeyy
Sadly didn't see it earlier, old API still binds its samplers to textures directly.
Need this before steam release @def-
Co-authored-by: Jupeyy <jupjopjap@gmail.com>
2598: Allow specifying an OpenGL version manually r=def- a=Jupeyy
Ofc don't merge, we'll test it first, and if we want merge it, i'd need to enable shader compability for OpenGL 4+, and general support for OpenGL 3.1 and 3.2(bcs i think they already don't allow some older GL commands).
Also i never really read in the OpenGL 1.x specification, i remember that older OpenGL versions required glBegin and stuff like that
Co-authored-by: Jupeyy <jupjopjap@gmail.com>
2631: Enable "Switch weapon on pickup" by default r=heinrich5991 a=def-
As voted in Discord, suggested by Lady Saavik
Co-authored-by: def <dennis@felsin9.de>
2637: Send larger distance when zooming r=heinrich5991 a=def-
since sometimes with dyncam it can be just at the border.
As reported by Lady Saavik
Co-authored-by: def <dennis@felsin9.de>
2606: Remove need for custom certificate r=heinrich5991 a=def-
in anticipation of using CloudFlare
Co-authored-by: def <dennis@felsin9.de>
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2590: Add DoxyFile and document CUIRect r=def- a=edg-l
I will probably document more stuff later.
To generate docs: `doxygen Doxyfile`
Co-authored-by: Edgar <git@edgarluque.com>
2595: Change default from borderless to fullscreen r=Learath2 a=def-
Switching the default means everyone with borderless window will be
switched to fullscreen. Fullscreen has lower latency and better
performance.
As suggested by Shyzo and voted on on Discord.
Co-authored-by: def <dennis@felsin9.de>
2602: Merge DejaVuSansCJKName with DejavuWenQuanYiMicroHei and use it for all (fixes#2593) r=Learath2 a=def-
allows reading CJK for everyone independent of language chosen.
got them merged with fontforge, finally looks good.
Hopefully the lags are gone.
Co-authored-by: def <dennis@felsin9.de>
Switching the default means everyone with borderless window will be
switched to fullscreen. Fullscreen has lower latency and better
performance.
As suggested by Shyzo and voted on on Discord.
2579: Ship map_convert_07 executable, allow drag'n'drop and ship Gold Mine map (with sixup version) instead of Kobra 4 and Goo! r=def- a=def-
2588: Add instructions about how to kill and pause game r=def- a=def-
Co-authored-by: def <dennis@felsin9.de>
2566: Optimization: Don't calculate with too small fraction r=heinrich5991 a=def-
since it won't add up to anything anyway.
Hopefully doesn't break any physics.
Co-authored-by: def <dennis@felsin9.de>
2465: Sqlite3 support and prepared statements r=heinrich5991 a=Zwelf
This PR changes the abstraction layer of the score backend to thin abstractions over the MySQL and SQLite3 library. It executes all Queries in one worker thread making it easier to use the ddnet thread pool. This doesn't change much, because each the mysql-connection was locked with `m_SqlLock` beforehand, serializing writes and reads respectively.
Behavior change (even though I tried to minimize them):
* `sv_use_sql` is used to determine if mysql server should be added
* `sv_sql_failure_file` is replaced by `sv_sqlite_file`
* `sv_sqlite_file` is either used as a backup server when `sv_use_sql` is enabled or as the primary read+write server when `sv_use_sql` is disabled
* `/load` now escapes the like-string
Since I am not good at designing config file commands, I would appreciate feedback on this part.
WIP:
* [x] rewrite SQL statements to work in both MySQL and SQLite (preferable just ANSI-SQL)
* [x] create tables (`COLLATE BINARY` and encoding info)
* [x] store rank (UPSERT for points)
* [x] load birthday (different function in sqlite for time handling)
* [x] `/mapinfo` (`convert(? using utf8mb4) COLLATE utf8mb4_general_ci`)
* [x] `/map` (`convert(? using utf8mb4) COLLATE utf8mb4_general_ci`)
* [x] store teamrank (`GROUP_CONCAT`)
* [x] `/teamrank` (`GROUP_CONCAT`)
* [x] ~`/top5team` (`GROUP_CONCAT`)~ doesn't contain GROUP_CONCAT
* [x] `/times` (`UNIX_TIMESTAMP`)
* [x] `/load` without any arguments (`UNIX_TIMESTAMP`)
* [x] all commits compiling, making future bisect easier
* [x] write a sqlite_to_mysql script
* [x] write an old_file_server to sqlite script
* [x] gracefully shutdown DbPool
Co-authored-by: Zwelf <zwelf@strct.cc>
2536: Send extended snap objects as is to Sixup r=def- a=Learath2
Seems to work, @fokkonaut can you take a look?
Co-authored-by: Learath <learath2@gmail.com>
2531: Client: Support .map file drag-and-drop to open map in editor r=heinrich5991 a=def-
As suggested by Lady Saavik
Co-authored-by: def <dennis@felsin9.de>
2502: Improved dummy switching r=def- a=Fireball-Teeworlds
- Fix a use-after-free when there are no new snapshots for the cl_dummy tee after the switch: #2499 .
- When one of the tees is hooked, cycling through them will no longer show phantom hook for the other tee: https://youtu.be/mxVT4pdyGnU.
- Dummy switch might happen a bit quicker since it doesn't depend on receiving new snapshots.
- Simplified code: m_LastDummy2 is no more.
Co-authored-by: Fireball <fireball.teeworlds@gmail.com>
2501: Show "Free View" for Sixup r=fokkonaut a=Learath2
@fokkonaut is this enough?
bors delegate=fokkonaut
Co-authored-by: Learath <learath2@gmail.com>
2433: Fix votes for sixup r=heinrich5991 a=Learath2
I think this looks sane but I haven't tested it at all for idk how to even test this locally/alone
2505: Fix legacy 64 player serverinfo, don't send duplicate packets (fixes#2495) r=heinrich5991 a=def-
For legacy we sent the first packet once correctly, then the 2nd and 3rd
packet without the marker and token at the start, so they never worked.
For new 64 player serverinfo we sent all packets correctly but the 1st
packet twice.
Introduced in #1955.
2506: Prevent whisper spam from 0.7 (fixes#2504) r=heinrich5991 a=def-
Co-authored-by: Learath <learath2@gmail.com>
Co-authored-by: def <dennis@felsin9.de>
For legacy we sent the first packet once correctly, then the 2nd and 3rd
packet without the marker and token at the start, so they never worked.
For new 64 player serverinfo we sent all packets correctly but the 1st
packet twice.
Introduced in #1955.
- Fix a use-after-free when there are no new snapshots for the cl_dummy tee after the switch.
- When one of the tees is hooked, cycling through them will no longer show phantom hook for the other tee.
- Dummy switch might happen a bit quicker since it doesn't depend on receiving new snapshots.
- Simplified code: m_LastDummy2 is no more.
Probably related to #2487, was previously fixed and caused stoppers not
to work.
src/game/collision.cpp:902:247: warning: bitwise or with non-zero value always evaluates to true [-Wtautological-bitwise-compare]
src/game/collision.cpp:891:252: warning: bitwise or with non-zero value always evaluates to true [-Wtautological-bitwise-compare]
src/game/collision.cpp:885:251: warning: bitwise or with non-zero value always evaluates to true [-Wtautological-bitwise-compare]
2478: Use (u)int64 from system.h instead of (u)int64_t from cstdint r=heinrich5991 a=def-
src/game/client/prediction/gameworld.h:62:90: error: ‘int64_t’ has not been declared
62 | void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, int ActivatedTeam, int64_t Mask);
| ^~~~~~~
2480: Send zoom status for dummy too r=heinrich5991 a=def-
Co-authored-by: def <dennis@felsin9.de>
src/game/client/prediction/gameworld.h:62:90: error: ‘int64_t’ has not been declared
62 | void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, int ActivatedTeam, int64_t Mask);
| ^~~~~~~
2482: Only write non-defaulted config values to settings_ddnet.cfg r=heinrich5991 a=def-
As a consequence changed defaults in an update will be respected
instantly if the player hasn't changed the value.
Co-authored-by: def <dennis@felsin9.de>
2474: Remove IP skins r=heinrich5991 a=def-
2476: Use x instead of y in show distance (fixes#2475) r=heinrich5991 a=def-
Co-authored-by: def <dennis@felsin9.de>
2429: Use a cubic polynomial for smoothing zoom r=def- a=heinrich5991
Supersedes #2420.
Co-authored-by: Edgar <git@edgarluque.com>
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2446: Fix storing finish on solo server with practice mode enabled r=heinrich5991 a=Zwelf
Fixes#2445
vulnerable versions:
* 506602d472c48821b6e7bb846b86431a113834a1..59a7e1f1873ad58b838cd3470d51b6ba84c02926~
* b99bbccd248437c928b25e32d40deaf98d8ef3ad..4186622d8750f4288be86b9064886a86c665c45d~
Problem was that `OnFinish` is only suited for team0 finishes, where `/practice` can't be enabled. Solo server finishes have to be handled like team finishes in CheckTeamFinished, which checks if `/practice` was enabled.
Co-authored-by: Zwelf <zwelf@strct.cc>
2424: Keep hook when loading r=heinrich5991 a=Zwelf
Solves issue discussed in #2374. Also keeps direction and jump, which is evaluated when player is in /pause. Fire could be deleted, as it does not affect game play in any way.
Co-authored-by: Zwelf <zwelf@strct.cc>
2413: Fix showothers for specchar r=heinrich5991 a=edg-l
Fixes https://github.com/ddnet/ddnet/issues/2410
I also made it use the Alpha on specchars that are on another team.
Co-authored-by: Edgar <git@edgarluque.com>
2401: Client tells server its zoom level (fixes#2087) r=heinrich5991 a=def-
and server adapts the visible distance to it
Co-authored-by: def <dennis@felsin9.de>
2389: Ignore emoticon of spammy players (fixes#2387) r=heinrich5991 a=def-
Controlled with the regular ignore chat button in players menu
Co-authored-by: def <dennis@felsin9.de>
2388: Get rid of the annoying font size warnings r=heinrich5991 a=def-
Since we're not doing anything about them anyway, and I get them
spamming me on every client start.
Co-authored-by: def <dennis@felsin9.de>
2390: Support cl_show_hook_coll_own/other 2 to always show (fixes#2383) r=heinrich5991 a=def-
hook collision, without broadcasting to other players.
Removed cl_show_hook_coll_always in return
Renamed cl_video_showhookcollother to cl_video_show_hook_coll_other for consistency
Co-authored-by: def <dennis@felsin9.de>
hook collision, without broadcasting to other players.
Removed cl_show_hook_coll_always in return
Renamed cl_video_showhookcollother to cl_video_show_hook_coll_other for consistency
2009: Fix min mouse position for follow factor r=heinrich5991 a=Jupeyy
@Learath2 you were the last to change this, would be nice if you could check if this is correct behaviour, i didn't find anything wrong :D
Co-authored-by: jupeyy <jupjopjap@gmail.com>
2379: Fix unused translations r=def- a=3edcxzaq1
Fix so that "Connect Dummy" and "Disconnect Dummy" follows language file
Co-authored-by: sven <sven@rx.lan>
Co-authored-by: 3edcxzaq1 <66034590+3edcxzaq1@users.noreply.github.com>
2374: Restore old /save behavior r=def- a=Zwelf
Fixes#2362, supersedes #2367
I didn't change the /save message. There are already two different: "Use '/load %s' on %s to continue" and "Use '/load %s' to continue".
I think it would be better to add a NetMessage, this could also solve the problem of saving which team members were in the team.
> I guess this can't be used to cheat anything?
Only if an instant rehook is necessary. Might be useful for rehooking an edge hook (but you still have to aim).
Co-authored-by: Zwelf <zwelf@strct.cc>
2358: Allow any update.json size r=heinrich5991 a=def-
just grew over 16 KB and thus updates failed. I still need to setup update5 server and will need to release a last release on update4 to have a seemless upgrade-path.
Update: https://update5.ddnet.tw/update.json is ready, 14.0.1 will still land on update4, then we switch to update5.
Co-authored-by: def <dennis@felsin9.de>
2356: Make game less dependend on score backend r=heinrich5991 a=Zwelf
Behavior change:
* `sv_save_worse_scores` is respected on file based servers
Mainly a clean up after #2247, but helps #2298 too
Co-authored-by: Zwelf <zwelf@strct.cc>
just grew over 16 KB and thus updates failed. I still need to setup
update5 server and will need to release a last release on update4 to
have a seemless upgrade-path.
2335: Make it more clear that this is a sixup translation server r=heinrich5991 a=def-
2336: Set skill level for Sixup (fixes#2334) r=heinrich5991 a=def-
2340: Keeping multiple states consistent is hard (fixes#2315) r=heinrich5991 a=def-
let's go recount every time
2342: Don't forget video recorder fps setting r=heinrich5991 a=def-
after switching to non-videorecorder client
2349: Document which MySQL/MariaDB versions we require (fixes#2343) r=heinrich5991 a=def-
Co-authored-by: def <dennis@felsin9.de>
2338: Ensure that team state is always sent (fix#2315) r=def- a=trml
Noticed that team state wasn't sent to the client in some cases (when SetForceCharacterNewTeam is called directly), which I think this could happen if a team is unlocked between killing and respawning a player. Also added a CheckTeamFinished for that case.
Co-authored-by: trml <trml@users.noreply.github.com>
2301: map_convert_07: Check image width for divisibility by 16 r=heinrich5991 a=def-
As noticed on Sunny Land.
> [5:31 PM] redix: in theory it should be enough if width and height are divisible by 16
Now running this over our maps and fixing them manually.
Co-authored-by: def <dennis@felsin9.de>
2326: Disable -Wstringop-overflow warning in IntsToStr r=heinrich5991 a=def-
Since it won't write into invalid memory when Num > 0
Co-authored-by: def <dennis@felsin9.de>
2279: Only forbid resizing when videorecorder is recording r=heinrich5991 a=def-
2327: List data files in `CMakeLists.txt` r=def- a=heinrich5991
This fixes missing files for people recompiling when we add new data
files.
Co-authored-by: def <dennis@felsin9.de>
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2306: Make ctrl-s/ctrl-l etc work everywhere in editor (fixes#2302) r=heinrich5991 a=def-
instead of just in the layers view
Co-authored-by: def <dennis@felsin9.de>
2321: Use the 0.7 race features better r=def- a=Learath2
Mostly tested, couldn't test the diffs though as I don't have score set up. It looks good to me though.
Co-authored-by: Learath <learath2@gmail.com>
src/game/server/ddracecommands.cpp:743:39: warning: unknown conversion type character ‘l’ in format [-Wformat=]
743 | str_format(aBuf, sizeof(aBuf), "%s-%lld-%s.save", pSelf->Server()->GetMapName(), time_get(), pSelf->Server()->GetAuthName(pResult->m_ClientID));
See https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/
2291: Make PlayerResult messages an union variant r=def- a=Zwelf
and some small style and readability fixes in sql_score.
Co-authored-by: Zwelf <zwelf@strct.cc>
2290: Restore old message behavior when using /load and /save r=def- a=Zwelf
Only notify the player initiating /load about the error and don't send
'Loading initiated by ...' and 'Saving initiated by ...' messages resulting
in two messages per /load and /save.
Not sure if the old behavior is better or if we want to keep the new with sending two messages per /save and /load.
Co-authored-by: Zwelf <zwelf@strct.cc>
Only notify the player initiating /load about the error and don't send
'Loading initiated by ...' and 'Saving initiated by ...' messages resulting
in two messages per /load and /save.
2245: Stop playing map sound when demo player is paused r=heinrich5991 a=def-
Noticed on Shooting Range map
2266: Reset hook & collision in prediction after kill r=heinrich5991 a=def-
Thanks to Pipou for reporting
Co-authored-by: def <dennis@felsin9.de>
2276: Fix segmentation fault when creating sql tables failed r=heinrich5991 a=Zwelf
`GameServer()->OnShutdown(true);` (which would wait on running threads to exit)
wasn't called if an error occured in the server init. Therefore `CServer` was
freed before the init-thread finished executing, causing a use after free from
`CSqlConnector::ms_ppSqlReadServers` pointing to `CServer->m_apSqlReadServers`.
Fixes#2271
Note that the server exits when creating tables failed. Since the tables are created by default, it has to be disabled explicitly (e.g. `add_sqlserver r teeworlds record teeworlds PASSWORD "localhost" 3306 0`) if the servers should start even when the database connection fails.
Co-authored-by: Zwelf <zwelf@strct.cc>
`GameServer()->OnShutdown(true);` (which would wait on running threads to exit)
wasn't called if an error occured in the server init. Therefore `CServer` was
freed before the init-thread finished executing, causing a use after free from
`CSqlConnector::ms_ppSqlReadServers` pointing to `CServer->m_apSqlReadServers`.
2247: Thread safe SQL interaction r=def- a=Zwelf
This PR intends to make the database interaction thread safe and optimizes some SQL queries. This is still a WIP, but since it is a rather big PR I wanted to get feedback early on.
Benefits:
* remove race conditions leading to undefined behavior and potential crashes
* logging game related database results in teehistorian would be possible
Behavior change:
* /top5team prints ranks in reverse order when passing a negative number (like /top5, /top5points)
* Optimize SQL statements for /rank /teamrank /top5 /top5team /points /top5points
* /load without parameters doesn't pass the SQL error to the user (as most other functions)
* Simplify IScore interface
* Add UUID to /save table (update of database schema necessary):
```
ALTER TABLE record_saves ADD SaveID varchar(64);
```
* /save immediately kills team and loads it again if the database insert fails.
still TBD:
* [x] saving (team) score when finishing
* [x] loading team save
* [x] loading initial time and birthday check
* [x] /map and random map votes
* [x] RFC: generate a passphrase (2-3 word) if save-code exists or no save-code is given making /save failures much more rare and save-codes more secure
* [x] clean up code (removing now unused structs, ordering of functions in IScore)
Co-authored-by: Zwelf <zwelf@strct.cc>
2270: Consider time_freq() r=def- a=Learath2
The timer ticks way faster on macOS leading to some insane pings :D
Co-authored-by: Learath <learath2@gmail.com>
2243: Workaround for client crash on predicted explosion r=def- a=trml
I haven't been able to find the exact source of the problem yet, but at least this seems to get rid of the segfault. The crash only happened with with recent versions of gcc and -O3 for me.
Co-authored-by: trml <trml@users.noreply.github.com>
2231: Don't clamp values that have no reasonable values r=Learath2 a=def-
Still affects many values in editor, for example colors in tiles and quads.
Thanks to Pipou for report.
Co-authored-by: def <dennis@felsin9.de>
2226: Fix image/sound selection in editor r=heinrich5991 a=def-
Follow-up to https://github.com/ddnet/ddnet/pull/2186 by @BannZay
Thanks to Cøke for notifying me
Co-authored-by: def <dennis@felsin9.de>
2202: Send DDNet version early in the connection process r=Learath2 a=heinrich5991
This gets rid of the problem that we don't know whether we should send
full snapshots to clients because they haven't told us about them being
DDNet yet.
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
2212: Use a consistent PRNG on all platforms r=Learath2 a=heinrich5991
I just used glibc's because that is what we use on all the servers. Based on https://www.mscs.dal.ca/~selinger/random/.
Behavior change: The PRNG is actually seeded now.
Co-authored-by: heinrich5991 <heinrich5991@gmail.com>
As discussed on Discord today, can be enabled inside of teams on the fly
during each run on any server. Finishes don't count. I haven't tested
save/load yet, would do that live on the server if this can be merged.
The following member variables:
* m_name to m_aName
* m_String to m_aString
* m_CpCurrent to m_aCpCurrent
* m_Switchers to m_pSwitchers
* SavedTees to m_pSavedTees
This came from a long discussion comparing PCG-* against xoroshiro*. Do
not generate integers without bias because it doesn't affect us very
much and it is easier to reimplement with modulo.
2208: Implement /load without params to show some info r=Learath2 a=def-
about your existing saves. Not the code of course, but only how many saves you have and when you last saved on this map.
Co-authored-by: def <dennis@felsin9.de>
src/game/editor/auto_map.h:47:9: warning: ‘*((void*)& NewConf +16)’ may be used uninitialized in this function [-Wmaybe-uninitialized]
I don't think it's an actual problem
This gets rid of the problem that we don't know whether we should send
full snapshots to clients because they haven't told us about them being
DDNet yet.