Releases: MrDave1999/Capture-The-Flag
v9.0.0 Release Candidate 1 (RC1)
What's Changed
- test: Create a single persistence test project that includes testing against repositories by @MrDave1999 in #166
- test: Add integration tests for repositories using MariaDB by @MrDave1999 in #167
- test: Add integration tests for repositories using SQLite by @MrDave1999 in #168
- test: Organize code by use cases in persistence project by @MrDave1999 in #169
- ci: Import database once MariaDB service is ready by @MrDave1999 in #170
- refactor: Remove 'PlayerInfo' type parameter in ShowSignupDialog by @MrDave1999 in #171
- feat: Add kick system after 4 incorrect password attempts by @MrDave1999 in #172
- fix: Year 2038 problem by @MrDave1999 in #174
- feat: Allow players to view the top players via commands by @MrDave1999 in #175
- ci: Use 'setup-mariadb' action instead of docker container by @MrDave1999 in #176
- refactor: Add 'STRICT' keyword to ensure strict typing rules by @MrDave1999 in #177
- ci: Implement health check for MariaDB in docker container by @MrDave1999 in #178
- db: Add CHECK constraints on 'players' to ensure data consistency by @MrDave1999 in #179
- fix: Enable REGEXP function to fix 'unknown function: REGEXP()' by @MrDave1999 in #180
- feat: Allow players to become VIP when reaching Legendary rank by @MrDave1999 in #181
- db: Allow the 'skin_id' column to accept the value '-1' by @MrDave1999 in #182
- fix!: Start at level 1 (noob rank) instead of 0 by @MrDave1999 in #183
- feat: Allow admins to set total kills to other players by @MrDave1999 in #184
- refactor: Update variable and macro names to improve code readability by @MrDave1999 in #185
Full Changelog: v9.0.0-preview.5...v9.0.0-rc.1
v9.0.0-preview.5
What's Changed
- feat: Add SQLite support by @MrDave1999 in #161
- chore: Move 'IPlayerRepository' to the 'Accounts' subdomain by @MrDave1999 in #162
- feat: Add MariaDB support by @MrDave1999 in #163
- chore: Update sample .env file by @MrDave1999 in #164
- fix: Copy sqlite library to the output and publish directory by @MrDave1999 in #165
Full Changelog: v9.0.0-preview.4...v9.0.0-preview.5
v9.0.0-preview.4
What's Changed
- feat: Add welcome message when player connects to the server by @MrDave1999 in #157
- refactor: Create the 'WelcomeSystem' class to welcome players by @MrDave1999 in #158
- feat!: Implement team balancer based on players' scores by @MrDave1999 in #159
- feat: Make the color visible on the radar for the player who captures the flag by @MrDave1999 in #160
Full Changelog: v9.0.0-preview.3...v9.0.0-preview.4
v9.0.0-preview.3
What's Changed
- feat: Allow the administrator to change a player's role by @MrDave1999 in #126
- feat: Allow the administrator to give points to players by @MrDave1999 in #127
- feat(improve): Ensure that the player cannot select the current skin by @MrDave1999 in #128
- refactor!: Rename AddPoints and SubtractPoints resources for clarity by @MrDave1999 in #129
- feat: Allow administrators to give scores to players by @MrDave1999 in #130
- feat: Add admin commands by @MrDave1999 in #131
- feat: Add module to manage player health and armour vitality by @MrDave1999 in #132
- refactor!: Rename methods to use 'AddPoints' prefix instead of 'GivePoints' by @MrDave1999 in #133
- feat: Add moderator commands by @MrDave1999 in #134
- feat: Allow VIP players to self-assign points every 4 minutes by @MrDave1999 in #135
- feat: Allow VIP players to restore their health and armour by @MrDave1999 in #136
- feat: Add VIP commands by @MrDave1999 in #137
- feat: Add Cooldowns to VIP Commands by @MrDave1999 in #138
- BREAKING CHANGE: Replace 'Points' with 'Coins' for clarity by @MrDave1999 in #139
- fix: Update player's stat bar after acquiring a combo by @MrDave1999 in #140
- chore: Update namespace to 'Results' by @MrDave1999 in #141
- chore: Update namespace to 'Settings' by @MrDave1999 in #142
- feat: Add public commands by @MrDave1999 in #143
- feat: Allow players to report another player from a command by @MrDave1999 in #144
- feat: Allow players to be in AFK mode from a command by @MrDave1999 in #145
- refactor!: Move the player stats reset method to the 'PlayerStatsSystem' by @MrDave1999 in #146
- feat: Allow players to be in spectator mode by @MrDave1999 in #147
- fix: Check if the target player is in spectator mode by @MrDave1999 in #148
- feat: Add command to show VIP commands in-game by @MrDave1999 in #149
- feat: Add command to show moderator commands in-game by @MrDave1999 in #150
- feat: Add command to show admin commands in-game by @MrDave1999 in #151
- feat: Add command to show public commands in-game by @MrDave1999 in #152
- feat: Add help command for players by @MrDave1999 in #153
- feat: Add credits command for players by @MrDave1999 in #154
- feat: Add resource file for general commands module to manage strings by @MrDave1999 in #155
- fix: Set the interior to the current player when in spectator mode by @MrDave1999 in #156
Full Changelog: v9.0.0-preview.2...v9.0.0-preview.3
v9.0.0-preview.2
What's Changed
- refactor!: Use 'Exterior Marker' terminology instead of 'Pickup Info' by @MrDave1999 in #109
- feat: Allow players to view statistics of both teams (Alpha and Beta) by @MrDave1999 in #110
- feat: Allow players to change teams by @MrDave1999 in #111
- feat: Allow to view the members of both teams (Alpha and Beta) by @MrDave1999 in #112
- feat: Implement chat system by @MrDave1999 in #113
- feat: Implement command locking mechanism for player inputs by @MrDave1999 in #114
- feat: Allow players to change skins by @MrDave1999 in #115
- refactor: Rename 'SkinSystem' class to 'ChangeSkinSystem' by @MrDave1999 in #116
- refactor: Ammo balancing and item adjustments by @MrDave1999 in #117
- feat: Set the player's score by @MrDave1999 in #118
- feat: Include 'Score' column in the scoreboard by @MrDave1999 in #119
- feat: Show current team and score in the stats by @MrDave1999 in #120
- refactor!: Add 'OnPlayerDeath' method to 'PlayerStatsSystem' by @MrDave1999 in #121
- feat: Allow players to view others' stats by @MrDave1999 in #122
- fix: An exception is thrown when executing a command with the argument [playerId] by @MrDave1999 in #124
- fix: Avoid throwing an exception when an unauthenticated player disconnects by @MrDave1999 in #125
Full Changelog: v9.0.0-preview.1...v9.0.0-preview.2
v9.0.0-preview.1
What's Changed
- Refactor (globals namespaces and file scoped namespaces) by @Ts-Pytham in #11
- restruct: Create new project structure by @MrDave1999 in #12
- cleanup: Remove Domain Project by @MrDave1999 in #13
- Implement the Result pattern by @MrDave1999 in #14
- Create resource file to save messages by @MrDave1999 in #15
- feat: Create the rank module by @MrDave1999 in #16
- ci: Create workflow by @MrDave1999 in #17
- feat: Create the weapon module by @MrDave1999 in #18
- feat: Create the account module by @MrDave1999 in #19
- feat: Get rank by required kills by @MrDave1999 in #20
- feat: Verify if a player has a lower role than X by @MrDave1999 in #21
- feat: Create the flag module by @MrDave1999 in #22
- refactor: Use ShowAsync instead of Show by @MrDave1999 in #23
- test: Use FakeCarrier in the tests by @MrDave1999 in #24
- feat: Create the Teams module by @MrDave1999 in #25
- test: Add missing tests to PlayerStatsPerRound type by @MrDave1999 in #26
- feat: Allow to set the team from the PlayerInfo type by @MrDave1999 in #27
- refactor: Convert types to public from the application layer by @MrDave1999 in #28
- feat: Check if the player has captured the opposing team's flag by @MrDave1999 in #29
- feat: Check if the player has not been assigned to a team by @MrDave1999 in #30
- BREAKING CHANGE: Remove AccountStatus type by @MrDave1999 in #31
- BREAKING CHANGE: Rename the property that gets the number of elements in a collection by @MrDave1999 in #32
- test: Use parameterized tests on types such as RankCollection and GtaWeaponsTests by @MrDave1999 in #33
- feat: Create the Maps module by @MrDave1999 in #34
- feat: Set the flag location of both teams (Alpha and Beta) by @MrDave1999 in #35
- feat: Create IPlayerRepository interface by @MrDave1999 in #36
- feat: Create a project called Persistence.InMemory by @MrDave1999 in #37
- feat: Choose database provider from a configuration file by @MrDave1999 in #38
- feat: Add service to encrypt passwords with bcrypt by @MrDave1999 in #39
- feat: Add support for streamer by @MrDave1999 in #40
- feat: Inject IPasswordHasher to encrypt passwords from FakePlayerRepository by @MrDave1999 in #41
- refactor: Rename property to PasswordHash in FakePlayer class by @MrDave1999 in #42
- test: Create unit tests for the SetValue method by @MrDave1999 in #43
- feat: Add login and signup system by @MrDave1999 in #44
- fix: Remove private field called
_connectedPlayer
from AccountSystem by @MrDave1999 in #45 - feat: Validate whether the player can move up in rank when killing a player by @MrDave1999 in #46
- feat: Add team sounds via OpenDrive to generate mp3 links by @MrDave1999 in #47
- feat: Execute the native function
gettime
from C# code by @MrDave1999 in #48 - feat: Add a command to show player statistics by @MrDave1999 in #49
- feat: Allow the player to change their name by @MrDave1999 in #50
- feat: Add support for auto-increment IDs in InMemoryDb provider by @MrDave1999 in #51
- feat: Allow the player to change their password by @MrDave1999 in #52
- BREAKING CHANGE: Remove 'EntityId' property from 'PlayerInfo' class by @MrDave1999 in #53
- feat: Add combos system by @MrDave1999 in #54
- refactor: Use GetInfo method instead of GetComponent by @MrDave1999 in #55
- fix!: Fix misspelling of SatchelChargesAmour and MolotovAmour by @MrDave1999 in #56
- refactor: Initialize dialog object in constructor to reduce memory allocations by @MrDave1999 in #57
- BREAKING CHANGE: Use ICombo interface instead of IBenefit by @MrDave1999 in #58
- feat!: Add new combos that improve the player's health and armour by @MrDave1999 in #60
- fix: Set new ammo to FlameThrower by @MrDave1999 in #61
- refactor: Improve test names by @MrDave1999 in #62
- feat: Implement class for upgrading player's rank by @MrDave1999 in #63
- feat: Implement killing spree system by @MrDave1999 in #64
- feat!: Update player's rank from the accounts module by @MrDave1999 in #65
- feat: Implement a service to create pickups for each team (Alpha and Beta) by @MrDave1999 in #66
- feat: Implement a service to create icons for each team (Alpha and Beta) by @MrDave1999 in #67
- feat: Enable team selection in class selection screen by @MrDave1999 in #68
- feat: Implement player spawn system by @MrDave1999 in #69
- BREAKING CHANGE: Rename class to PlayerDeathSystem by @MrDave1999 in #70
- fix: Add/remove players when spawned or disconnected by @MrDave1999 in #71
- fix: Verify if the entered password is null by @MrDave1999 in #72
- fix: Prevent the player from returning to class selection after death by @MrDave1999 in #73
- BREAKING CHANGE: Rename method to EnableClassSelection by @MrDave1999 in #74
- BREAKING CHANGE: Rename method to DisableClassSelection by @MrDave1999 in #75
- test: Add tests for flag counters by @MrDave1999 in #76
- Update team icons to Colored Square/Triangle by @MrDave1999 in #77
- feat: Load SA-MP server info from configuration file by @MrDave1999 in #78
- feat: Add textdraws to class selection screen by @MrDave1999 in #79
- feat: Create class selection module by @MrDave1999 in #80
- fix: Fix bug with outdated map information due to singleton registration by @MrDave1999 in #81
- feat: Update player's last connection when disconnected by @MrDave1999 in #82
- feat: Implement headshot system by @MrDave1999 in #83
- feat: Implement team text draw renderer by @MrDave1999 in #84
- feat: Implement map text draw renderer by @MrDave1999 in #85
- BREAKING CHANGE: Add “Renderer” suffix to follow project convention by @MrDave1999 in #86
- restruct: Move 'ClassSelection' submodule to 'Teams' for better organization by @MrDave1999 in #87
- refactor: Create 'ServiceCollectionExtensions' for Players and Maps modules by @MrDave1999 in #88
- BREAKING CHANGE: Minimize GameModeInit class dependencies by @MrDave1999 in #89
- feat: Implement a map rotation system by @MrDave1999 in #90
...
v8.0.1
v8.0.0
- Fixed the problem of some accents not appearing in the game. (#7, #8)
- Added support for .NET 6
- Added a pawn.json file for sampctl (with this tool you can download the samp server and plugins).
- Added a Dockerfile and docker-compose.yml to deploy with Docker.
- Added two scripts (for both Windows and Linux) to build all filterscripts with sampctl. (#6)
- This version makes use of .env files for game-mode configuration.
- Added a new map: fy_iceworld2.
- Added a time limit in seconds that the flag will remain on the ground after being released.
v7.19.6-RC1
Main features:
-
The /changemap command was modified to show in color which is the current map or the next map. Also added a confirmation dialog so that the player can choose if he wants to force the map at that moment or not.
An optional parameter was also added to the command so that the player can select maps by a value. For example, if the player types
/changemap fy
, he will be shown maps starting with the wordfy
. -
A /nextmap command has been added to know which is the next map on the server.
-
New maps have been added:
- cs_assault
- TheWild
- GateToHell
- TheBunker
- cs_deagle5
- cs_rockwar
- de_aztec
- mp_jetdoor
- Simpson
- ZM_Italy
- zone_paintball
- mp_island
-
Two new administrative commands have been added for level 1: /setallweather and /setalltime.
-
The
MAX_MAPS
constant was removed from theconfig.ini
file, the reason is because it is tedious to manually add the value, so now it is obtained automatically. -
Added a default value to the variables: Interior, Weather and WorldTime. This configuration can be done in the
config.ini
file.
Fixed Bugs:
- When the map finishes loading and if a player is paused, his color will remain blue or red depending on the team he is on. So in this version this has been changed, his color will be changed to white (the color is not visible on the radar map).
- The map de_dust2_x1 has been modified because it left an open path through which the player could leave the map and this should not happen because the map should be completely closed.
v7.13.4-RC1
Fixed Bugs
-
In the previous version, the connection to the database was left open until the application finished its execution. According to the official MySQL documentation, the connection can remain inactive for up to 8 hours, after that time, the connection is automatically closed. This caused that the SA-MP server can no longer perform any operation to the database, since the connection it had created was already "expired".
The solution was simple, we created a global instance of typeMySqlConnection
and every time we need to perform an operation on the database, we open and close the connection.
Although opening and closing the connection is an expensive operation, Connector/.NET uses internally pool connections, so we would be reusing the same connection. -
A second error encountered was the following:
Imagine that the remaining time of the game is 1 second but just in that moment, a player could die, so the player could appear in the new loaded map and play as if nothing.
The solution was simple, if this scenario happens, the player will be automatically redirected to the class selection.