X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fgamemode_ca.qc;h=8a6315c4236bd1673758253449af1889fe2e35e8;hb=198765425d8c346faa41b601cba98247ca2ddac2;hp=32e7e98b6d080ffe81f5622e735d1d4598d5fe12;hpb=8c8a22011714768f8c5b3ac887d0fd099fc08d8b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/gamemode_ca.qc b/qcsrc/server/mutators/gamemode_ca.qc index 32e7e98b6..8a6315c42 100644 --- a/qcsrc/server/mutators/gamemode_ca.qc +++ b/qcsrc/server/mutators/gamemode_ca.qc @@ -85,7 +85,7 @@ float CA_CheckWinner() { Send_Notification(NOTIF_ALL, world, MSG_CENTER, APP_TEAM_NUM_4(winner_team, CENTER_ROUND_TEAM_WIN_)); Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM_4(winner_team, INFO_ROUND_TEAM_WIN_)); - TeamScore_AddToTeam(winner_team, ST_SCORE, +1); + TeamScore_AddToTeam(winner_team, ST_CA_ROUNDS, +1); } else if(winner_team == -1) { @@ -100,7 +100,7 @@ float CA_CheckWinner() void CA_RoundStart() { - if(inWarmupStage) + if(warmup_stage) allowed_to_spawn = TRUE; else allowed_to_spawn = FALSE; @@ -144,6 +144,7 @@ MUTATOR_HOOKFUNCTION(ca_PutClientInServer) if(!allowed_to_spawn) { self.classname = "observer"; + if(self.jointime != time) //not when connecting if(!self.caplayer) { self.caplayer = 0.5; @@ -158,6 +159,7 @@ MUTATOR_HOOKFUNCTION(ca_reset_map_players) { FOR_EACH_CLIENT(self) { + self.killcount = 0; if(self.caplayer) { self.classname = "player"; @@ -182,12 +184,8 @@ MUTATOR_HOOKFUNCTION(ca_reset_map_global) MUTATOR_HOOKFUNCTION(ca_GetTeamCount) { - ca_teams = autocvar_g_ca_teams_override; - if(ca_teams < 2) - ca_teams = autocvar_g_ca_teams; - ca_teams = bound(2, ca_teams, 4); ret_float = ca_teams; - return 1; + return 0; } MUTATOR_HOOKFUNCTION(ca_PlayerDies) @@ -224,24 +222,69 @@ MUTATOR_HOOKFUNCTION(ca_GiveFragsForKill) MUTATOR_HOOKFUNCTION(ca_SetStartItems) { - start_health = cvar("g_lms_start_health"); - start_armorvalue = cvar("g_lms_start_armor"); - - start_ammo_shells = cvar("g_lms_start_ammo_shells"); - start_ammo_nails = cvar("g_lms_start_ammo_nails"); - start_ammo_rockets = cvar("g_lms_start_ammo_rockets"); - start_ammo_cells = cvar("g_lms_start_ammo_cells"); - start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); - - start_items &~= IT_UNLIMITED_AMMO; + start_items &= ~IT_UNLIMITED_AMMO; + start_health = warmup_start_health = cvar("g_lms_start_health"); + start_armorvalue = warmup_start_armorvalue = cvar("g_lms_start_armor"); + start_ammo_shells = warmup_start_ammo_shells = cvar("g_lms_start_ammo_shells"); + start_ammo_nails = warmup_start_ammo_nails = cvar("g_lms_start_ammo_nails"); + start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets"); + start_ammo_cells = warmup_start_ammo_cells = cvar("g_lms_start_ammo_cells"); + start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); return 0; } +MUTATOR_HOOKFUNCTION(ca_PlayerDamage) +{ + if(IS_PLAYER(frag_target)) + if(frag_target.deadflag == DEAD_NO) + if(frag_target == frag_attacker || SAME_TEAM(frag_target, frag_attacker) || frag_deathtype == DEATH_FALL) + frag_damage = 0; + + frag_mirrordamage = 0; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ca_FilterItem) +{ + if(autocvar_g_powerups <= 0) + if(self.flags & FL_POWERUP) + return TRUE; + + if(autocvar_g_pickup_items <= 0) + return TRUE; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ca_PlayerDamage_SplitHealthArmor) +{ + float excess = max(0, frag_damage - damage_take - damage_save); + + if(frag_target != frag_attacker && IS_PLAYER(frag_attacker)) + PlayerTeamScore_Add(frag_attacker, SP_SCORE, ST_SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ca_PlayerRegen) +{ + // no regeneration in CA + return TRUE; +} + void ca_Initialize() { allowed_to_spawn = TRUE; + ca_teams = autocvar_g_ca_teams_override; + if(ca_teams < 2) + ca_teams = autocvar_g_ca_teams; + ca_teams = bound(2, ca_teams, 4); + ret_float = ca_teams; + ScoreRules_ca(ca_teams); + round_handler_Spawn(CA_CheckTeams, CA_CheckWinner, CA_RoundStart); round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit); @@ -265,6 +308,10 @@ MUTATOR_DEFINITION(gamemode_ca) MUTATOR_HOOK(ForbidThrowCurrentWeapon, ca_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, ca_GiveFragsForKill, CBC_ORDER_FIRST); MUTATOR_HOOK(SetStartItems, ca_SetStartItems, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDamage_Calculate, ca_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, ca_FilterItem, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, ca_PlayerDamage_SplitHealthArmor, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerRegen, ca_PlayerRegen, CBC_ORDER_ANY); MUTATOR_ONADD {