From 28390970ddaca167996590a8742b950793e5ce53 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sat, 20 Mar 2010 20:05:08 +0100 Subject: [PATCH] mutator system: cleanup of hooks --- qcsrc/server/cl_client.qc | 1 - qcsrc/server/cl_physics.qc | 4 +- qcsrc/server/cl_player.qc | 6 +- qcsrc/server/clientcommands.qc | 1 - qcsrc/server/g_damage.qc | 49 ++++++++------- qcsrc/server/miscfunctions.qc | 6 +- qcsrc/server/mutators/base.qh | 75 ++++++++++++++++++++--- qcsrc/server/mutators/gamemode_keyhunt.qc | 3 +- qcsrc/server/mutators/mutator_dodging.qc | 8 +-- 9 files changed, 105 insertions(+), 48 deletions(-) diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 65091dcc7..e747918f6 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2848,7 +2848,6 @@ void PlayerPostThink (void) ImpulseCommands(); if (intermission_running) return; // intermission or finale - GetPressedKeys(); } else if (self.classname == "observer") { //do nothing diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index 66dc32fcc..52477cb9a 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -593,8 +593,6 @@ void SV_PlayerPhysics() float not_allowed_to_move; string c; - MUTATOR_CALLHOOK(PlayerPhysics); - if(self.PlayerPhysplug) if(self.PlayerPhysplug()) return; @@ -690,6 +688,8 @@ void SV_PlayerPhysics() bot_think(); } + MUTATOR_CALLHOOK(PlayerPhysics); + self.items &~= IT_USING_JETPACK; if(self.classname == "player") diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 1911f4027..33cc475cf 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -633,7 +633,11 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht Obituary (attacker, inflictor, self, deathtype); race_PreDie(); DropAllRunes(self); - frag_attacker = attacker; MUTATOR_CALLHOOK(PlayerDies); + + frag_attacker = attacker; + frag_inflictor = inflictor; + MUTATOR_CALLHOOK(PlayerDies); + if(self.flagcarried) { if(attacker.classname != "player" && attacker.classname != "gib") diff --git a/qcsrc/server/clientcommands.qc b/qcsrc/server/clientcommands.qc index d272d694a..ff5794dae 100644 --- a/qcsrc/server/clientcommands.qc +++ b/qcsrc/server/clientcommands.qc @@ -225,7 +225,6 @@ void SV_ParseClientCommand(string s) { DropFlag(self.flagcarried, world, world); if(self.ballcarried) DropBall(self.ballcarried, self.origin, self.velocity); - MUTATOR_CALLHOOK(MakePlayerSpectator); WaypointSprite_PlayerDead(); self.classname = "observer"; if(g_ca) diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 936b5f678..338204c0c 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -146,37 +146,44 @@ void GiveFrags (entity attacker, entity targ, float f) } // FIXME fix the mess this is (we have REAL points now!) - frag_attacker = attacker; + entity oldself; + oldself = self; + self = attacker; frag_target = targ; frag_score = f; if(MUTATOR_CALLHOOK(GiveFragsForKill)) { f = frag_score; + self = oldself; } - else if(g_runematch) - { - f = RunematchHandleFrags(attacker, targ, f); - } - else if(g_lms) + else { - // remove a life - float tl; - tl = PlayerScore_Add(targ, SP_LMS_LIVES, -1); - if(tl < lms_lowest_lives) - lms_lowest_lives = tl; - if(tl <= 0) + self = oldself; + if(g_runematch) { - if(!lms_next_place) - lms_next_place = player_count; - PlayerScore_Add(targ, SP_LMS_RANK, lms_next_place); // won't ever spawn again - --lms_next_place; + f = RunematchHandleFrags(attacker, targ, f); } - f = 0; - } - else if(g_ctf) - { - if(g_ctf_ignore_frags) + else if(g_lms) + { + // remove a life + float tl; + tl = PlayerScore_Add(targ, SP_LMS_LIVES, -1); + if(tl < lms_lowest_lives) + lms_lowest_lives = tl; + if(tl <= 0) + { + if(!lms_next_place) + lms_next_place = player_count; + PlayerScore_Add(targ, SP_LMS_RANK, lms_next_place); // won't ever spawn again + --lms_next_place; + } f = 0; + } + else if(g_ctf) + { + if(g_ctf_ignore_frags) + f = 0; + } } attacker.totalfrags += f; diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 7e00a8d6c..dda27b8fa 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -594,11 +594,11 @@ void GetCvars(float f) { string s; - get_cvars_f = f; - MUTATOR_CALLHOOK(GetCvars); - if (f > 0) s = strcat1(argv(f)); + + get_cvars_f = f; + MUTATOR_CALLHOOK(GetCvars); GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch"); GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction"); GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime"); diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh index 49feb762d..9ed316ee1 100644 --- a/qcsrc/server/mutators/base.qh +++ b/qcsrc/server/mutators/base.qh @@ -36,22 +36,77 @@ void Mutator_Remove(float(float) func); // calls error() on fail // register all possible hooks here + MUTATOR_HOOKABLE(MakePlayerObserver); -MUTATOR_HOOKABLE(MakePlayerSpectator); + // called when a player becomes observer, after shared setup + MUTATOR_HOOKABLE(PlayerSpawn); + // called when a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here) + MUTATOR_HOOKABLE(ClientDisconnect); -MUTATOR_HOOKABLE(PlayerDies); entity other; entity frag_attacker; -MUTATOR_HOOKABLE(GiveFragsForKill); entity frag_attacker, frag_target; float frag_score; + // called when a player disconnects + +MUTATOR_HOOKABLE(PlayerDies); + // called when a player dies to e.g. remove stuff he was carrying. + // INPUT: + entity frag_inflictor; + entity frag_attacker; + +MUTATOR_HOOKABLE(GiveFragsForKill); + // called when someone was fragged by "self", and is expected to change frag_score to adjust scoring for the kill + // INPUT: + entity frag_target; + // INPUT, OUTPUT: + float frag_score; + MUTATOR_HOOKABLE(MatchEnd); -MUTATOR_HOOKABLE(GetTeamCount); float ret_float; -MUTATOR_HOOKABLE(SpectateCopy); entity other; + // called when the match ends + +MUTATOR_HOOKABLE(GetTeamCount); + // should adjust ret_float to contain the team count + // INPUT, OUTPUT: + float ret_float; + +MUTATOR_HOOKABLE(SpectateCopy); + // copies variables for spectating "other" to "self" + // INPUT: + entity other; + MUTATOR_HOOKABLE(ForbidThrowCurrentWeapon); + // returns 1 if throwing the current weapon shall not be allowed + MUTATOR_HOOKABLE(SetStartItems); -MUTATOR_HOOKABLE(BuildMutatorsString); string ret_string; -MUTATOR_HOOKABLE(BuildMutatorsPrettyString); string ret_string; -MUTATOR_HOOKABLE(FilterItem); // return error to request removal, or change self.items or self.weapons -MUTATOR_HOOKABLE(OnEntityPreSpawn); // return error to prevent entity spawn, or modify the entity + // adjusts {warmup_}start_{items,weapons,ammo_{cells,rockets,nails,shells,fuel}} + +MUTATOR_HOOKABLE(BuildMutatorsString); + // appends ":mutatorname" to ret_string for logging + // INPUT, OUTPUT: + string ret_string; + +MUTATOR_HOOKABLE(BuildMutatorsPrettyString); + // appends ", Mutator name" to ret_string for display + // INPUT, OUTPUT: + string ret_string; + +MUTATOR_HOOKABLE(FilterItem); + // checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields) + // return error to request removal + +MUTATOR_HOOKABLE(OnEntityPreSpawn); + // return error to prevent entity spawn, or modify the entity + MUTATOR_HOOKABLE(PlayerPreThink); + // runs in the event loop for players; is called for ALL player entities, also bots, also the dead, or spectators + MUTATOR_HOOKABLE(GetPressedKeys); + // TODO change this into a general PlayerPostThink hook? + MUTATOR_HOOKABLE(PlayerPhysics); -MUTATOR_HOOKABLE(GetCvars); float get_cvars_f; + // called before any player physics, may adjust variables for movement, + // is run AFTER bot code and idle checking + +MUTATOR_HOOKABLE(GetCvars); + // is meant to call GetCvars_handle*(get_cvars_s, get_cvars_f, cvarfield, "cvarname") for cvars this mutator needs from the client + // INPUT: + float get_cvars_f; + string get_cvars_s; diff --git a/qcsrc/server/mutators/gamemode_keyhunt.qc b/qcsrc/server/mutators/gamemode_keyhunt.qc index f2074260b..cdc4a076f 100644 --- a/qcsrc/server/mutators/gamemode_keyhunt.qc +++ b/qcsrc/server/mutators/gamemode_keyhunt.qc @@ -1064,10 +1064,9 @@ MUTATOR_HOOKFUNCTION(kh_SpectateCopy) MUTATOR_DEFINITION(gamemode_keyhunt) { MUTATOR_HOOK(MakePlayerObserver, kh_Key_DropAll, CBC_ORDER_ANY); - MUTATOR_HOOK(MakePlayerSpectator, kh_Key_DropAll, CBC_ORDER_ANY); MUTATOR_HOOK(ClientDisconnect, kh_Key_DropAll, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDies, kh_PlayerDies, CBC_ORDER_ANY); - MUTATOR_HOOK(GiveFragsForKill, kh_GiveFragsForKill, CBC_ORDER_EXCLUSIVE); + MUTATOR_HOOK(GiveFragsForKill, kh_GiveFragsForKill, CBC_ORDER_FIRST); MUTATOR_HOOK(MatchEnd, kh_finalize, CBC_ORDER_ANY); MUTATOR_HOOK(GetTeamCount, kh_GetTeamCount, CBC_ORDER_EXCLUSIVE); MUTATOR_HOOK(SpectateCopy, kh_SpectateCopy, CBC_ORDER_ANY); diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc index 3c5e884e8..b50f7090e 100644 --- a/qcsrc/server/mutators/mutator_dodging.qc +++ b/qcsrc/server/mutators/mutator_dodging.qc @@ -37,13 +37,7 @@ void dodging_Initialize() { } MUTATOR_HOOKFUNCTION(dodging_GetCvars) { - // print("dodging_GetCvars\n"); - - string s; - s = strcat1(argv(get_cvars_f)); - - GetCvars_handleFloat(s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout"); - + GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout"); return 0; } -- 2.39.2