Skip to content

Commit ecae203

Browse files
committed
Nickname change limit per spawn (cvar)
1 parent adeb09a commit ecae203

6 files changed

Lines changed: 48 additions & 21 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
4747
| bot_deathmatch | 0 | 0 | 1 | Set's the mode for the zBot.<br/>`0` disabled<br/>`1` enable mode Deathmatch and not allow to do the scenario |
4848
| bot_quota_mode | normal | - | - | Determines the type of quota.<br/>`normal` default behaviour<br/>`fill` the server will adjust bots to keep `N` players in the game, where `N` is bot_quota |
4949
| mp_item_staytime | 300 | - | - | Time to remove item that have been dropped from the players. |
50+
| mp_max_alive_name_changes | -1 | -1 | - | Maximum amount of nickname changes before next respawn. <br/>`-1` Infinity (HLDS behavior)<br/>`0` Allow to change only at spawn <br/>`0>` Allow to change arbitrary amount of nicks |
5051

5152
## How to install zBot for CS 1.6?
5253
* Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true)

dist/game.cfg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,10 @@ sv_alltalk 0
172172
//
173173
// Default value: "300"
174174
mp_item_staytime 300
175+
176+
// Maximum amount of nickname changes before next respawn.
177+
// -1 - Infinity (HLDS behavior)
178+
// 0 - Allow to change only at spawn
179+
// 0> - Allow to change arbitrary amount of nicks
180+
//
181+
mp_max_alive_name_changes

regamedll/dlls/game.cpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,27 +94,28 @@ cvar_t sk_scientist_heal3 = { "sk_scientist_heal3", "0", 0, 0.0f, nullptr };
9494

9595
#ifdef REGAMEDLL_ADD
9696

97-
cvar_t game_version = { "game_version", APP_VERSION, FCVAR_SERVER, 0.0f, nullptr };
98-
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, nullptr };
99-
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, nullptr };
100-
cvar_t hegrenade_penetration = { "mp_hegrenade_penetration", "0", 0, 0.0f, nullptr };
101-
cvar_t nadedrops = { "mp_nadedrops", "0", 0, 0.0f, nullptr };
102-
cvar_t roundrespawn_time = { "mp_roundrespawn_time", "20", 0, 20.0f, nullptr };
103-
cvar_t auto_reload_weapons = { "mp_auto_reload_weapons", "0", 0, 0.0f, nullptr };
104-
cvar_t refill_bpammo_weapons = { "mp_refill_bpammo_weapons", "0", 0, 0.0f, nullptr }; // Useful for mods like DeathMatch, GunGame, ZombieMod etc
105-
cvar_t freeforall = { "mp_freeforall", "0", FCVAR_SERVER, 0.0f, nullptr };
106-
cvar_t auto_join_team = { "mp_auto_join_team", "0", 0, 0.0f, nullptr };
107-
cvar_t max_teamkills = { "mp_max_teamkills", "3", 0, 3.0f, nullptr };
108-
cvar_t fraglimit = { "mp_fraglimit", "0", FCVAR_SERVER, 0.0f, nullptr };
109-
cvar_t round_restart_delay = { "mp_round_restart_delay", "5", FCVAR_SERVER, 0.0f, nullptr };
110-
cvar_t showtriggers = { "showtriggers", "0", 0, 0.0f, nullptr }; // debug cvar shows triggers
97+
cvar_t game_version = { "game_version", APP_VERSION, FCVAR_SERVER, 0.0f, nullptr };
98+
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, nullptr };
99+
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, nullptr };
100+
cvar_t hegrenade_penetration = { "mp_hegrenade_penetration", "0", 0, 0.0f, nullptr };
101+
cvar_t nadedrops = { "mp_nadedrops", "0", 0, 0.0f, nullptr };
102+
cvar_t roundrespawn_time = { "mp_roundrespawn_time", "20", 0, 20.0f, nullptr };
103+
cvar_t auto_reload_weapons = { "mp_auto_reload_weapons", "0", 0, 0.0f, nullptr };
104+
cvar_t refill_bpammo_weapons = { "mp_refill_bpammo_weapons", "0", 0, 0.0f, nullptr }; // Useful for mods like DeathMatch, GunGame, ZombieMod etc
105+
cvar_t freeforall = { "mp_freeforall", "0", FCVAR_SERVER, 0.0f, nullptr };
106+
cvar_t auto_join_team = { "mp_auto_join_team", "0", 0, 0.0f, nullptr };
107+
cvar_t max_teamkills = { "mp_max_teamkills", "3", 0, 3.0f, nullptr };
108+
cvar_t fraglimit = { "mp_fraglimit", "0", FCVAR_SERVER, 0.0f, nullptr };
109+
cvar_t round_restart_delay = { "mp_round_restart_delay", "5", FCVAR_SERVER, 0.0f, nullptr };
110+
cvar_t showtriggers = { "showtriggers", "0", 0, 0.0f, nullptr }; // debug cvar shows triggers
111111
// TODO: Maybe it's better to register in the engine?
112112

113-
cvar_t hostagehurtable = { "mp_hostage_hurtable", "1", FCVAR_SERVER, 0.0f, nullptr };
114-
cvar_t roundover = { "mp_roundover", "0", FCVAR_SERVER, 0.0f, nullptr };
115-
cvar_t forcerespawn = { "mp_forcerespawn", "0", FCVAR_SERVER, 0.0f, nullptr };
116-
cvar_t show_radioicon = { "mp_show_radioicon", "1", FCVAR_SERVER, 1.0f, nullptr };
117-
cvar_t item_staytime = { "mp_item_staytime", "300", FCVAR_SERVER, 300.0f, nullptr };
113+
cvar_t hostagehurtable = { "mp_hostage_hurtable", "1", FCVAR_SERVER, 0.0f, nullptr };
114+
cvar_t roundover = { "mp_roundover", "0", FCVAR_SERVER, 0.0f, nullptr };
115+
cvar_t forcerespawn = { "mp_forcerespawn", "0", FCVAR_SERVER, 0.0f, nullptr };
116+
cvar_t show_radioicon = { "mp_show_radioicon", "1", FCVAR_SERVER, 1.0f, nullptr };
117+
cvar_t item_staytime = { "mp_item_staytime", "300", FCVAR_SERVER, 300.0f, nullptr };
118+
cvar_t max_alive_name_changes = { "mp_max_alive_name_changes", "-1", FCVAR_SERVER, -1.0f, nullptr };
118119

119120
void GameDLL_Version_f()
120121
{
@@ -267,6 +268,7 @@ void EXT_FUNC GameDLLInit()
267268
CVAR_REGISTER(&forcerespawn);
268269
CVAR_REGISTER(&show_radioicon);
269270
CVAR_REGISTER(&item_staytime);
271+
CVAR_REGISTER(&max_alive_name_changes);
270272

271273
// print version
272274
CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n");

regamedll/dlls/game.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ extern cvar_t roundover;
151151
extern cvar_t forcerespawn;
152152
extern cvar_t show_radioicon;
153153
extern cvar_t item_staytime;
154+
extern cvar_t max_alive_name_changes;
154155

155156
#endif
156157

regamedll/dlls/player.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,23 @@ LINK_HOOK_CLASS_CHAIN(bool, CBasePlayer, SetClientUserInfoName, (char *infobuffe
164164
bool EXT_FUNC CBasePlayer::__API_HOOK(SetClientUserInfoName)(char *infobuffer, char *szNewName)
165165
{
166166
int nClientIndex = entindex();
167-
if (pev->deadflag != DEAD_NO)
167+
if (pev->deadflag != DEAD_NO
168+
#ifdef REGAMEDLL_ADD
169+
|| (m_iNickChangesBeforeSpawn > max_alive_name_changes.value && max_alive_name_changes.value >= 0)
170+
#endif
171+
)
168172
{
169173
m_bHasChangedName = true;
170174
Q_snprintf(m_szNewName, sizeof(m_szNewName), "%s", szNewName);
171175
ClientPrint(pev, HUD_PRINTTALK, "#Name_change_at_respawn");
172176
return false;
173177
}
174-
178+
#ifdef REGAMEDLL_ADD
179+
else
180+
{
181+
m_iNickChangesBeforeSpawn++;
182+
}
183+
#endif
175184
// Set the name
176185
SET_CLIENT_KEY_VALUE(nClientIndex, infobuffer, "name", szNewName);
177186

@@ -3555,6 +3564,10 @@ void EXT_FUNC CBasePlayer::__API_HOOK(RoundRespawn)()
35553564
CLIENT_COMMAND(edict(), "kill\n");
35563565
#endif
35573566
}
3567+
3568+
#ifdef REGAMEDLL_ADD
3569+
m_iNickChangesBeforeSpawn = 0;
3570+
#endif
35583571

35593572
if (m_iMenu != Menu_ChooseAppearance)
35603573
{

regamedll/dlls/player.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,9 @@ class CBasePlayer: public CBaseMonster {
855855
float m_silentTimestamp;
856856
MusicState m_musicState;
857857
float m_flLastCommandTime[COMMANDS_TO_TRACK];
858+
#ifdef REGAMEDLL_ADD
859+
int m_iNickChangesBeforeSpawn;
860+
#endif
858861
};
859862

860863
class CWShield: public CBaseEntity

0 commit comments

Comments
 (0)