From ffee9d9f70a2c50db199e3f9f5e4808dd3d6d84a Mon Sep 17 00:00:00 2001 From: Lyberta Date: Wed, 6 Sep 2017 08:55:03 +0300 Subject: [PATCH] Added handicap API. --- .../dynamic_handicap/sv_dynamic_handicap.qc | 30 ++------------ qcsrc/server/_mod.inc | 1 + qcsrc/server/_mod.qh | 1 + qcsrc/server/client.qc | 3 ++ qcsrc/server/handicap.qc | 38 ++++++++++++++++++ qcsrc/server/handicap.qh | 40 +++++++++++++++++++ qcsrc/server/player.qc | 8 ++-- 7 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 qcsrc/server/handicap.qc create mode 100644 qcsrc/server/handicap.qh diff --git a/qcsrc/common/mutators/mutator/dynamic_handicap/sv_dynamic_handicap.qc b/qcsrc/common/mutators/mutator/dynamic_handicap/sv_dynamic_handicap.qc index 43f10fd2c..817e56185 100644 --- a/qcsrc/common/mutators/mutator/dynamic_handicap/sv_dynamic_handicap.qc +++ b/qcsrc/common/mutators/mutator/dynamic_handicap/sv_dynamic_handicap.qc @@ -13,8 +13,6 @@ float autocvar_g_dynamic_handicap_scale; float autocvar_g_dynamic_handicap_min; ///< The minimum value of the handicap. float autocvar_g_dynamic_handicap_max; ///< The maximum value of the handicap. -.float dynamic_handicap; ///< Holds the dynamic handicap value. - //====================== Forward declarations ================================= /// \brief Returns the base value of the handicap. @@ -43,9 +41,9 @@ void DynamicHandicap_UpdateHandicap(entity player) //PrintToChat(player, strcat("Base handicap = ", ftos(handicap))); handicap = DynamicHandicap_ScaleHandicap(handicap); //PrintToChat(player, strcat("Scaled handicap = ", ftos(handicap))); - player.dynamic_handicap = DynamicHandicap_ClampHandicap(handicap); - //PrintToChat(player, strcat("Clamped handicap = ", - // ftos(player.dynamic_handicap))); + handicap = DynamicHandicap_ClampHandicap(handicap); + //PrintToChat(player, strcat("Clamped handicap = ", ftos(handicap))); + Handicap_SetForcedHandicap(player, handicap); } float DynamicHandicap_GetBaseValue(entity player) @@ -130,28 +128,6 @@ MUTATOR_HOOKFUNCTION(dynamic_handicap, ClientConnect) DynamicHandicap_UpdateHandicap(player); } -/// \brief Hook which is called when the damage amount must be determined. -MUTATOR_HOOKFUNCTION(dynamic_handicap, Damage_Calculate) -{ - entity frag_attacker = M_ARGV(1, entity); - entity frag_target = M_ARGV(2, entity); - float deathtype = M_ARGV(3, float); - float damage = M_ARGV(4, float); - if (DEATH_ISSPECIAL(deathtype)) - { - return; - } - if (IS_CLIENT(frag_attacker)) - { - damage /= frag_attacker.dynamic_handicap; - } - if (IS_CLIENT(frag_target)) - { - damage *= frag_target.dynamic_handicap; - } - M_ARGV(4, float) = damage; -} - /// \brief Hook that is called when player dies. MUTATOR_HOOKFUNCTION(dynamic_handicap, PlayerDies) { diff --git a/qcsrc/server/_mod.inc b/qcsrc/server/_mod.inc index 99115fbdc..de7e01aa7 100644 --- a/qcsrc/server/_mod.inc +++ b/qcsrc/server/_mod.inc @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/server/_mod.qh b/qcsrc/server/_mod.qh index 3a8898670..67f6aae4d 100644 --- a/qcsrc/server/_mod.qh +++ b/qcsrc/server/_mod.qh @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 6a978c6ae..13111fbd6 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -14,6 +14,7 @@ #include "spawnpoints.qh" #include "resources.qh" #include "g_damage.qh" +#include "handicap.qh" #include "g_hook.qh" #include "command/common.qh" #include "cheats.qh" @@ -1272,6 +1273,8 @@ void ClientConnect(entity this) it.init_for_player(it, this); }); + Handicap_Initialize(this); + MUTATOR_CALLHOOK(ClientConnect, this); if (IS_REAL_CLIENT(this)) diff --git a/qcsrc/server/handicap.qc b/qcsrc/server/handicap.qc new file mode 100644 index 000000000..078c7035a --- /dev/null +++ b/qcsrc/server/handicap.qc @@ -0,0 +1,38 @@ +#include "handicap.qh" + +/// \file +/// \brief Source file that contains implementation of the handicap system. +/// \author Lyberta +/// \copyright GNU GPLv2 or any later version. + +.float m_handicap; ///< Holds the handicap value. + +void Handicap_Initialize(entity player) +{ + player.m_handicap = 1; +} + +float Handicap_GetVoluntaryHandicap(entity player) +{ + return bound(1.0, CS(player).cvar_cl_handicap, 10.0); +} + +float Handicap_GetForcedHandicap(entity player) +{ + return player.m_handicap; +} + +void Handicap_SetForcedHandicap(entity player, float value) +{ + if (value <= 0) + { + error("Handicap_SetForcedHandicap: Invalid handicap value."); + } + player.m_handicap = value; +} + +float Handicap_GetTotalHandicap(entity player) +{ + return Handicap_GetForcedHandicap(player) * Handicap_GetVoluntaryHandicap( + player); +} diff --git a/qcsrc/server/handicap.qh b/qcsrc/server/handicap.qh new file mode 100644 index 000000000..fa45a0ed0 --- /dev/null +++ b/qcsrc/server/handicap.qh @@ -0,0 +1,40 @@ +#pragma once + +/// \file +/// \brief Header file that describes the handicap system. +/// \author Lyberta +/// \copyright GNU GPLv2 or any later version. + +// Handicap is used to make the game harder for strong players and easier for +// weak players. Values greater than 1 make the game harder and values less than +// 1 make the game easier. Right now handicap only affects damage. There are 2 +// types of handicap: voluntary and forced. Voluntary handicap can be set via +// cl_handicap cvar. For obvious reasons, it can't be less than 1. Forced +// handicap can be set by server mutators. The total handicap is the product of +// voluntary and forced handicap. + +/// \brief Initializes handicap to its default value. +/// \param[in,out] player Player to initialize. +/// \return No return. +void Handicap_Initialize(entity player); + +/// \brief Returns the voluntary handicap of the player. +/// \param[in] player Player to check. +/// \return Voluntary handicap of the player. +float Handicap_GetVoluntaryHandicap(entity player); + +/// \brief Returns the forced handicap of the player. +/// \param[in] player Player to check. +/// \return Forced handicap of the player. +float Handicap_GetForcedHandicap(entity player); + +/// \brief Sets the forced handicap of the player. +/// \param[in] player Player to alter. +/// \param[in] value Handicap value to set. +/// \return No return. +void Handicap_SetForcedHandicap(entity player, float value); + +/// \brief Returns the total handicap of the player. +/// \param[in] player Player to check. +/// \return Total handicap of the player. +float Handicap_GetTotalHandicap(entity player); diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index dd0615262..ab4b8edc3 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -317,9 +317,11 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(!DEATH_ISSPECIAL(deathtype)) { - damage *= bound(1.0, CS(this).cvar_cl_handicap, 10.0); - if(this != attacker && IS_PLAYER(attacker)) - damage /= bound(1.0, CS(attacker).cvar_cl_handicap, 10.0); + damage *= Handicap_GetTotalHandicap(this); + if (this != attacker && IS_PLAYER(attacker)) + { + damage /= Handicap_GetTotalHandicap(attacker); + } } if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1) -- 2.39.2