From: Rudolf Polzer Date: Sun, 12 Jun 2011 13:23:20 +0000 (+0200) Subject: make keyhunt and keepaway use the new use key system X-Git-Tag: xonotic-v0.5.0~211^2~3 X-Git-Url: http://de.git.xonotic.org/?a=commitdiff_plain;h=4ed55dbddfe5f39f9983a46b9dc4d859805525d5;p=xonotic%2Fxonotic-data.pk3dir.git make keyhunt and keepaway use the new use key system --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 2eb18eca2..28495a82a 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -1285,7 +1285,6 @@ set g_balance_keyhunt_delay_round 5 set g_balance_keyhunt_delay_tracking 10 set g_balance_keyhunt_delay_fadeout 2 set g_balance_keyhunt_delay_collect 1.5 -set g_balance_keyhunt_delay_drop 0.4 set g_balance_keyhunt_maxdist 150 set g_balance_keyhunt_score_collect 3 set g_balance_keyhunt_score_carrierfrag 2 diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 36b41896c..f9dea3ac4 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -393,7 +393,6 @@ float autocvar_g_balance_hook_secondary_refire; float autocvar_g_balance_hook_secondary_speed; float autocvar_g_balance_keyhunt_damageforcescale; float autocvar_g_balance_keyhunt_delay_collect; -float autocvar_g_balance_keyhunt_delay_drop; float autocvar_g_balance_keyhunt_delay_return; float autocvar_g_balance_keyhunt_delay_round; float autocvar_g_balance_keyhunt_delay_tracking; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 058e40250..c0771da99 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2585,6 +2585,8 @@ void PlayerUseKey() // a use key was pressed; call handlers if(ctf_usekey()) return; + + MUTATOR_CALLHOOK(PlayerUseKey); } .float touchexplode_time; diff --git a/qcsrc/server/mutators/base.qc b/qcsrc/server/mutators/base.qc index 697849680..fdf24edb7 100644 --- a/qcsrc/server/mutators/base.qc +++ b/qcsrc/server/mutators/base.qc @@ -83,7 +83,10 @@ float CallbackChain_Call(entity cb) entity e; r = 0; for(e = cb; e.cbc_next; e = e.cbc_next) + { + CallbackChain_ReturnValue = r; r |= e.cbc_next.cbc_func(); + } return r; // callbacks return an error status, so 0 is default return value } diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh index 05a5187e5..e26280e61 100644 --- a/qcsrc/server/mutators/base.qh +++ b/qcsrc/server/mutators/base.qh @@ -3,6 +3,8 @@ #define CBC_ORDER_LAST 2 #define CBC_ORDER_ANY 4 +float CallbackChain_ReturnValue; // read-only field of the current return value + entity CallbackChain_New(string name); float CallbackChain_Add(entity cb, float() func, float order) float CallbackChain_Remove(entity cb, float() func); @@ -32,6 +34,7 @@ void Mutator_Remove(mutatorfunc_t func, string name); // calls error() on fail #define MUTATOR_HOOKABLE(cb) entity HOOK_##cb #define MUTATOR_CALLHOOK(cb) CallbackChain_Call(HOOK_##cb) +#define MUTATOR_RETURNVALUE CallbackChain_ReturnValue @@ -151,3 +154,8 @@ MUTATOR_HOOKABLE(PlayerPowerups); // INPUT entity self; float olditems; // also technically output, but since it is at the end of the function it's useless for that :P + +MUTATOR_HOOKABLE(PlayerUseKey); + // called when the use key is pressed + // if MUTATOR_RETURNVALUE is 1, don't do anything + // return 1 if the use key actually did something diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc index 60c39d434..85a29031a 100644 --- a/qcsrc/server/mutators/gamemode_keepaway.qc +++ b/qcsrc/server/mutators/gamemode_keepaway.qc @@ -241,10 +241,17 @@ MUTATOR_HOOKFUNCTION(ka_PlayerPreThink) if(self.ballcarried) self.items |= IT_KEY1; - // drop the ball if the player presses the use button - if(self.BUTTON_USE) - if(self.ballcarried) { ka_DropEvent(self); } + return 0; +} +MUTATOR_HOOKFUNCTION(ka_PlayerUseKey) +{ + if(MUTATOR_RETURNVALUE == 0) + if(self.ballcarried) + { + ka_DropEvent(self); + return 1; + } return 0; } @@ -307,6 +314,7 @@ MUTATOR_DEFINITION(gamemode_keepaway) MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDamage_Calculate, ka_PlayerDamage, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPowerups, ka_PlayerPowerups, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerUseKey, ka_PlayerUseKey, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/gamemode_keyhunt.qc b/qcsrc/server/mutators/gamemode_keyhunt.qc index e1cb1a85b..a7374e49d 100644 --- a/qcsrc/server/mutators/gamemode_keyhunt.qc +++ b/qcsrc/server/mutators/gamemode_keyhunt.qc @@ -653,23 +653,6 @@ void kh_Key_Think() // runs all the time makevectors('0 1 0' * (self.cnt + mod(time, 360) * KH_KEY_XYSPEED)); setorigin(self, v_forward * KH_KEY_XYDIST + '0 0 1' * self.origin_z); #endif - - if(self.owner.BUTTON_USE) - if(time >= self.owner.kh_droptime + autocvar_g_balance_keyhunt_delay_drop) - { - self.owner.kh_droptime = time; - self.kh_droptime = time; // prevent collecting this one for some time - self.enemy = self.owner; - self.pusher = world; - kh_Scores_Event(self.owner, self, "dropkey", 0, 0); - bprint(self.owner.netname, "^7 dropped the ", self.netname, "\n"); - sound(self.owner, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM); - makevectors(self.owner.v_angle); - self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE); - kh_Key_AssignTo(self, world); - self.pushltime = time + autocvar_g_balance_keyhunt_protecttime; - self.kh_dropperteam = self.team; - } } // if in nodrop or time over, end the round @@ -799,6 +782,28 @@ float kh_Key_AllOwnedByWhichTeam() // constantly called. check to see if all th return teem; } +void kh_Key_DropOne(entity key) +{ + // prevent collecting this one for some time + entity player; + player = key.owner; + + key.kh_droptime = time; + key.enemy = player; + + kh_Scores_Event(player, key, "dropkey", 0, 0); + PlayerScore_Add(player, SP_KH_LOSSES, 1); + bprint(player.netname, "^7 dropped the ", key.netname, "\n"); + kh_Key_AssignTo(key, world); + makevectors(player.v_angle); + key.velocity = W_CalculateProjectileVelocity(player.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE); + key.pusher = world; + key.pushltime = time + autocvar_g_balance_keyhunt_protecttime; + key.kh_dropperteam = key.team; + + sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM); +} + void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies { entity key; @@ -1049,6 +1054,21 @@ MUTATOR_HOOKFUNCTION(kh_SpectateCopy) return 0; } +MUTATOR_HOOKFUNCTION(kh_PlayerUseKey) +{ + if(MUTATOR_RETURNVALUE == 0) + { + entity k; + k = self.kh_next; + if(k) + { + kh_Key_DropOne(self, k); + return 1; + } + } + return 0; +} + MUTATOR_DEFINITION(gamemode_keyhunt) { MUTATOR_HOOK(MakePlayerObserver, kh_Key_DropAll, CBC_ORDER_ANY); @@ -1058,6 +1078,7 @@ MUTATOR_DEFINITION(gamemode_keyhunt) MUTATOR_HOOK(MatchEnd, kh_finalize, CBC_ORDER_ANY); MUTATOR_HOOK(GetTeamCount, kh_GetTeamCount, CBC_ORDER_EXCLUSIVE); MUTATOR_HOOK(SpectateCopy, kh_SpectateCopy, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerUseKey, kh_PlayerUseKey, CBC_ORDER_ANY); MUTATOR_ONADD {