Server: add cvars mp_td_dmgToWarn and mp_td_dmgToKick

This commit is contained in:
Marco Cawthorne 2023-11-06 08:46:22 -08:00
parent 25cfc4938e
commit e67d1b0da4
Signed by: eukara
GPG key ID: CE2032F0A2882A22
3 changed files with 53 additions and 7 deletions

View file

@ -50,6 +50,19 @@ seta r_skipDetail 0 // Skip rendering of detail textures on surfaces.
seta r_skipEnvmap 0 // Skip rendering of environment/cube maps on surfaces.
seta r_skipFullbright 0 // Skip rendering of fullbright textures on surfaces.
seta r_skipNormal 0 // Skip rendering of normal/bump maps on surfaces.
seta r_showDlights 0 // Show debug info for dynamic light entities.
seta r_showPhysicsInfo 0 // Show debug info for NSPhysicsEntity entities.
seta r_showRenderInfo 0 // Show debug info for NSRenderableEntity entities.
seta r_showSkeleton 0 // Shows joints for skeletal entities.
seta r_showTexts 0 // Shows debug info for game_text messages.
seta r_showView 0 // Shows debug info for NSView objects.
seta r_showViewCone 0 // Shows view cone for actors and other similar entities.
// teamplay related cvars
seta sv_friendlyFire 0 // When set to 1, players/actors/bots belonging to the same team can damage each other
seta mp_td_dmgToKick 300 // Specifies how much damage one player has to inflict to others players before getting kicked.
seta mp_td_dmgToWarn 200 // Specifies how much damage one player has to inflict to others players before getting warned.
alias mp_friendlyfire sv_friendlyFire
// aliases for the older commands (may be removed some day)
alias cl_autojump pm_autoJump

View file

@ -15,6 +15,8 @@
*/
var bool autocvar_sv_friendlyFire = false;
var int autocvar_mp_td_dmgToKick = 300i;
var int autocvar_mp_td_dmgToWarn = 200i;
void
NSGameRules::NSGameRules(void)
@ -265,6 +267,8 @@ NSGameRules::IsMultiplayer(void)
void
NSGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type)
{
bool isFriendlyFire = false;
/* Damage */
NSSurfacePropEntity eTarget = (NSSurfacePropEntity)t;
@ -280,13 +284,19 @@ NSGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type
if (eTarget.flags & FL_CLIENT && eTarget.flags & FL_GODMODE)
return;
/* friendly fire */
if (autocvar_sv_friendlyFire == false)
if (t != c)
/* friendly fire check */
if (t != c) {
if (IsTeamplay()) {
if (t.flags & FL_CLIENT && c.flags & FL_CLIENT)
if (t.team == c.team)
if (t.flags & FL_CLIENT && c.flags & FL_CLIENT) {
if (t.team == c.team) {
if (autocvar_sv_friendlyFire == false) {
return;
} else {
isFriendlyFire = true;
}
}
}
}
}
/* already dead, please avoid recursion */
@ -346,6 +356,27 @@ NSGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type
NSLog("\tFlags: %i", g_dmg_iFlags);
NSLog("\tWeapon: %i", g_dmg_iWeapon);
/* friendly fire penalty */
if (isFriendlyFire) {
int lastDmg = 0i;
NSClientPlayer plC = (NSClientPlayer)c;
lastDmg = plC.m_iFriendlyDMG;
plC.m_iFriendlyDMG += dmg;
/* kick the client. */
if (plC.m_iFriendlyDMG >= autocvar_mp_td_dmgToKick) {
NSLog("Kicking %S due to team damage rules.", plC.netname);
dropclient(plC);
} else if (plC.m_iFriendlyDMG >= autocvar_mp_td_dmgToWarn) {
if (lastDmg < autocvar_mp_td_dmgToKick) {
// warn player here
sprint(plC, PRINT_CHAT, "Keep attacking teammates and you will be kicked!\n");
}
}
bprint(PRINT_CHAT, sprintf("%s ^7attacked a teammate.\n", c.netname));
}
if (dmg > 0 || flArmor > 0) {
vector dmg_origin;

View file

@ -172,6 +172,8 @@ private:
float pb_angle_delta;
float pb_player_delta;
vector pb_last_angles;
int m_iFriendlyDMG;
#endif
};