Releases: gigamon-dev/SubspaceServer
v4.0.0
General
- Fix a bug for zones connected to the SSC billing server so that the "This zone is not connected to the central player database." popup should no longer appear. (05d2087)
- This includes a modification to the IBilling interface. Encryption module binaries from earlier releases are no longer compatible.
- Fix a bug that slowed down the login process for Continuum clients. (Reported by @plushmonkey)
- Fix an issue where logs would not get written during an aborted initial startup. (b0828ab)
- Add support for Continuum position packets to reduce bandwidth usage, including the ability to batch them when sending. (Info provided by POiD and @plushmonkey, cd71f32, d2955c1, 7a3747c, 2f33447)
- Fix an issue where an arena.conf reload would reset flag data and desync with clients. (Reported by @plushmonkey, e460383)
- Fix an issue where flag and brick data could be sent before the client has finished downloading the map. (0f843ee)
- Ensure both kill points and flag points can be used to buy items. (#6 from @aestrada7)
- Fixes and enhancements to the subgame compatibility module, including proxy detection, and the addition of the Idle module (8218527, 9d21d2d, 765bb26)
- Redesign of IPeriodicRewardPoints. (93cc20a)
- Change the PacketHandler delegate to pass the data as a ReadOnlySpan instead of a Span (7e9f01e)
Matchmaking & game modes
- Fix a null reference exception in TeamVersus when running without being connected to the stats database (PostgreSqlGameStats module not loaded). (Reported by @reighnman, 97ac468)
- Add additional settings to the TeamVersus game mode for being able to override spawn settings. (0f99306)
- Players in TeamVersus matches to not be sent position packets of players who are not in the same match. (234cd20, 3755542)
- Fix bugs with the nexthold command. (a264d5c)
- Fix and cleanup TeamVersus premade group tracking. (f2d3a39)
- Add the ability for TeamVersusStats to print a link to view match stats on the subspace-stats-web website. (b1e2736)
- Fix and clean up TeamVersus notifications. (Reported by Captor, 796369c)
- Fix an issue where the ?return command would allow a player to reenter after their slot has been knocked out. (Reported by shaun, 5f4e2f8)
- OneVersusOne game mode to knock out players that enter a safe zone (e.g. for the circle). (cdb50f8)
See the breaking changes for this release.
Requires: .NET 9.0 Runtime
v3.0.0
This release fixes critical performance and stability issues that were uncovered from stress testing. It is highly recommended to upgrade to this version.
Performance and stability changes
- Fix an issue where the Persist module would cause spikes. (e39207a, reported by @plushmonkey)
- Persist module to use a single transaction when reading and writing data. (#5 from @plushmonkey, 8b8c612)
- Fix a deadlock issue in the Network module. (e6bd5b5, reported by @plushmonkey)
- Convert to use System.Threading.Lock (aec15e2, d94fb21)
- Reduce string allocations for base arena names by using StringPool. (3fdf6ab)
Other changes
- Enhance ArenaManager logic for refreshing permanent arenas when the global.conf changes. (#4 from @reighnman, ff50147)
- Add the ability to configure staff members in arena.conf files using the [Staff] section. (7826507)
- Fix a vulnerability in CapabilityManager. (8fe091b)
- Fix spawn positions in the client settings packet. (4b38056, reported by @plushmonkey)
- Fix carry flag game bugs. (9c30169, reported by @plushmonkey)
- Allow a mainloop timer that's executing to be able to cancel itself using IMainloopTimer.ClearTimer rather than having to return false. (c644031)
- Enhance fast bomb detection logic to handle cases where settings are configured to modify bomb fire delay when carrying a flag or a ball (Flag:FlaggerBombFireDelay and Soccer:UseFlagger).(80eed64)
- Prevent client setting Prize:PrizeNegativeFactor from being set to 0 when reading the arena.conf. (af39bbc, reported by @reighnman)
For those upgrading with custom modules, see the breaking changes for this release.
Requires: .NET 9.0 Runtime
v2.0.0
This release includes many performance enhancements, fixes, and additional features.
Performance:
A main focus of this release was to improve performance. There were many changes to reduce allocations including: eliminating more string allocations, reducing delegate allocations by refactoring to prefer static methods for the runtime to automatically cache delegates, manually cache delegates when not possible, use more object pooling, etc.
Other notable changes to improve performance include:
- Network module: Use the Socket methods added in .NET 8 for UDP that take
SocketAddress. This greatly reduced allocations as it previously accounted for 99% of all allocations. PersistSQLitemodule to use a single connection object and reuseSqliteCommandobjects so that prepared statements get used.- Change all blocking file I/O to be done asynchronously.
- (Windows only) Request a 1 ms resolution time by calling the
timeBeginPeriodfunction (timeapi.h). MapDatamodule to use the same ExtendedLvl object for arenas that use the same map. Lvl files to be loaded asynchronously.- Use the
AlternateLookupfunctionality (new in .NET 9) for string-keyed HashSets and Dictionaries instead of using the custom Trie implementation that was created to work around the limitation. - Use System.Threading.Lock (new in .NET 9).
Notable changes:
- Change module dependency injection to use construction injection instead of injecting dependencies into the Load method.
- Add the ability to load, unload, attach, and detach modules asynchronously.
- Complete overhaul of the Network module.
- Spannify PacketDelegate.
- Sized send logic completely redone (see commits 7874032 and 01b2c4a for details).
- Reliable receive logic to handle when sequence number overflows and wraps back around.
- Fix Big Data receive logic to better handle when data received is larger than limits.
- Implement the ASSS Ping/Information protocol and add the Net:SimplePingPopulationMode setting.
- Allow for packets to be up to 520 bytes. This allows certain packets to be sent without needing to be fragmented using big packets (0x00 0x08 and 0x00 0x09).
- SendThread to only wait the remainder of the 10 ms (1 tick) for each iteration, rather than always wait the full 10 ms.
- Add the ability to use
async/awaiton the mainloop thread such that execution will resume on the mainloop thread, unlessConfigureAwaitis used. - Fix thread synchronization issues with player counts. An arena's player counts (total and playing) will now always be consistent with one another.
Other changes:
-
Replay module
- Allow for playback of the same replay in multiple arenas at the same time.
- Add sub-command "settings" to the
?replaycommand to prints out all of the replay settings.
-
Fix an issue with the
?quickfixcommand where there would be no results when filtering due to the StreamWriter not being flushed. -
Add
IMapData.TryGetFlagCoordinateto get the coordinates of a static flag -
Add
IArenaManager.KnownArenaNames. Use it in the?arenacommand and the Peer module. -
Fix a bug where
?sendcommand targeting the wrong player. -
?sendcommand to be able to target a team, arena, or entire zone.. -
Add a generic version of ConfigHelpAttribute.
-
Enhance the
?arenacommand to accept the -a parameter to include known arenas (arenas that have a directory and arena.conf) and known peer arenas (arenas configured for peer zones). -
Matchmaking modules: many fixes and enhancements. Here are some:
- Add tracking of recent damage and use it to calculate additional damage stats (Kill Damage, Team Kill Damage, and Forced Rep Damage). This includes logic to account for EMP shutdown time as damage due to recharge loss and overlapping EMP time ranges to only count once. Also, use the recent damage logic to determine Assists, Solo Kills, and Forced Reps.
- Add the
?chartcommand to view the current stat chart mid-game. - Add a "Wasted Energy" stat for how much energy recharge is wasted by a player being at maximum energy. The calculation accounts for cost of having utilities activated (Stealth, Cloak, X-Radar, and Anti-Warp)
- Add the ability to save match data to a stats database.
- Add rating logic based on the formula used by 4v4. This includes a difference in how "Teammate Enemy Factor" is calculated since this is not limited to 4 players and not limited to 2 teams.
- Add match startup logic to be able balance teams based on rating data from the database or randomize teams when not balanced (no database connection).
- Add match startup logic to have a period where it waits for all players to signal they're ready, by rotating their ship or by firing a weapon.
- Add match startup logic to penalize players that leave before the match begins, or does not ready up. A "hold" is on such players for a configured amount of time, preventing them from queuing up again. Implement it such that the "hold" stays in place, even if they disconnect and reconnect. That is, they must wait for the full penalty period.
- Add a
?nextholdcommand to view a player's hold information and for moderators to be able to manually remove a hold on a player. - Add a match startup countdown after all players have readied up.
- Add lvz for displaying the game timer, score, and statbox. The statbox shows information about each player's slot (remaining lives, repels, and rockets).
- Add stats for keeping track of the average distance to enemy and average distance to teammates.
-
Fix an issue in billing logic in the scenario that the biller sends all zeros for a the player's FirstLogin.
-
Enable nullable reference types on all projects.
-
Convert all uses of fixed size buffers to be inline arrays instead (Added in C# 12). Update projects files to not allow unsafe blocks.
-
Fix an issue where a player that has been kicked would get an empty message when attempting to login.
-
Add the ability for bricks to snap to other existing bricks or carriable flags that are on the map.
-
LvzObjects module to include more batch operations.
-
Fix an issue where players were erroneously being sent to spec for S2C weapons packetloss. Thanks to the folks from T3 The Gauntlet! for reporting the bug.
For those upgrading with custom modules, see the breaking changes for this release.
Requires: .NET 9.0 Runtime
v1.0.0
Initial release.
Requires: .NET 7.0 Runtime