X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fgamemode_freezetag.qc;h=22d51590951a48da47db2f4bf8e1d9651cff34aa;hb=74a4e5c118426a16f5656cdefbb0f5efa2f71124;hp=5ab96277b9e4a286a04999ab8c0832fb09d0fdc2;hpb=dcf8a85693db60468fde21e1eaa64043576edb0d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 5ab96277b..22d515909 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -1,13 +1,25 @@ -.float freezetag_frozen_time; -.float freezetag_frozen_timeout; -#define ICE_MAX_ALPHA 1 -#define ICE_MIN_ALPHA 0.1 -float freezetag_teams; - -#define SP_FREEZETAG_REVIVALS 4 +#include "gamemode_freezetag.qh" + +#include "gamemode.qh" + +float autocvar_g_freezetag_frozen_maxtime; +bool autocvar_g_freezetag_revive_nade; +float autocvar_g_freezetag_revive_nade_health; +int autocvar_g_freezetag_point_leadlimit; +int autocvar_g_freezetag_point_limit; +float autocvar_g_freezetag_revive_extra_size; +float autocvar_g_freezetag_revive_speed; +float autocvar_g_freezetag_revive_clearspeed; +float autocvar_g_freezetag_round_timelimit; +int autocvar_g_freezetag_teams; +int autocvar_g_freezetag_teams_override; +bool autocvar_g_freezetag_team_spawns; +float autocvar_g_freezetag_warmup; + +const float SP_FREEZETAG_REVIVALS = 4; void freezetag_ScoreRules(float teams) { - ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY + ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, true); // SFL_SORT_PRIO_PRIMARY ScoreInfo_SetLabel_PlayerScore(SP_FREEZETAG_REVIVALS, "revivals", 0); ScoreRules_basics_end(); } @@ -39,9 +51,9 @@ void freezetag_count_alive_players() #define FREEZETAG_ALIVE_TEAMS() ((redalive > 0) + (bluealive > 0) + (yellowalive > 0) + (pinkalive > 0)) #define FREEZETAG_ALIVE_TEAMS_OK() (FREEZETAG_ALIVE_TEAMS() == freezetag_teams) -float prev_missing_teams_mask; float freezetag_CheckTeams() { + static float prev_missing_teams_mask; if(FREEZETAG_ALIVE_TEAMS_OK()) { if(prev_missing_teams_mask > 0) @@ -135,7 +147,7 @@ float freezetag_CheckWinner() } entity freezetag_LastPlayerForTeam() -{ +{SELFPARAM(); entity pl, last_pl = world; FOR_EACH_PLAYER(pl) { @@ -163,7 +175,7 @@ void freezetag_LastPlayerForTeam_Notify() } void freezetag_Add_Score(entity attacker) -{ +{SELFPARAM(); if(attacker == self) { // you froze your own dumb self @@ -181,14 +193,14 @@ void freezetag_Add_Score(entity attacker) } void freezetag_Freeze(entity attacker) -{ +{SELFPARAM(); if(self.frozen) return; if(autocvar_g_freezetag_frozen_maxtime > 0) self.freezetag_frozen_timeout = time + autocvar_g_freezetag_frozen_maxtime; - Freeze(self, 0, 1, TRUE); + Freeze(self, 0, 1, true); freezetag_count_alive_players(); @@ -196,7 +208,7 @@ void freezetag_Freeze(entity attacker) } void freezetag_Unfreeze(entity attacker) -{ +{SELFPARAM(); self.freezetag_frozen_time = 0; self.freezetag_frozen_timeout = 0; @@ -206,8 +218,8 @@ void freezetag_Unfreeze(entity attacker) float freezetag_isEliminated(entity e) { if(IS_PLAYER(e) && (e.frozen == 1 || e.deadflag != DEAD_NO)) - return TRUE; - return FALSE; + return true; + return false; } @@ -219,7 +231,7 @@ void() havocbot_role_ft_freeing; void() havocbot_role_ft_offense; void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius) -{ +{SELFPARAM(); entity head; float distance; @@ -245,7 +257,7 @@ void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradiu } void havocbot_role_ft_offense() -{ +{SELFPARAM(); entity head; float unfrozen; @@ -266,7 +278,7 @@ void havocbot_role_ft_offense() // If only one left on team or if role has timed out then start trying to free players. if (((unfrozen == 0) && (!self.frozen)) || (time > self.havocbot_role_timeout)) { - dprint("changing role to freeing\n"); + LOG_TRACE("changing role to freeing\n"); self.havocbot_role = havocbot_role_ft_freeing; self.havocbot_role_timeout = 0; return; @@ -286,7 +298,7 @@ void havocbot_role_ft_offense() } void havocbot_role_ft_freeing() -{ +{SELFPARAM(); if(self.deadflag != DEAD_NO) return; @@ -295,7 +307,7 @@ void havocbot_role_ft_freeing() if (time > self.havocbot_role_timeout) { - dprint("changing role to offense\n"); + LOG_TRACE("changing role to offense\n"); self.havocbot_role = havocbot_role_ft_offense; self.havocbot_role_timeout = 0; return; @@ -319,18 +331,29 @@ void havocbot_role_ft_freeing() // Hook Functions // ============== -MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer) -{ +void ft_RemovePlayer() +{SELFPARAM(); self.health = 0; // neccessary to update correctly alive stats if(!self.frozen) freezetag_LastPlayerForTeam_Notify(); freezetag_Unfreeze(world); freezetag_count_alive_players(); +} + +MUTATOR_HOOKFUNCTION(ft, ClientDisconnect) +{SELFPARAM(); + ft_RemovePlayer(); return 1; } -MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) -{ +MUTATOR_HOOKFUNCTION(ft, MakePlayerObserver) +{SELFPARAM(); + ft_RemovePlayer(); + return 1; +} + +MUTATOR_HOOKFUNCTION(ft, PlayerDies) +{SELFPARAM(); if(round_handler_IsActive()) if(round_handler_CountdownRunning()) { @@ -343,7 +366,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) // Cases DEATH_TEAMCHANGE and DEATH_AUTOTEAMCHANGE are needed to fix a bug whe // you succeed changing team through the menu: you both really die (gibbing) and get frozen if(ITEM_DAMAGE_NEEDKILL(frag_deathtype) - || frag_deathtype == DEATH_TEAMCHANGE || frag_deathtype == DEATH_AUTOTEAMCHANGE) + || frag_deathtype == DEATH_TEAMCHANGE.m_id || frag_deathtype == DEATH_AUTOTEAMCHANGE.m_id) { // let the player die, he will be automatically frozen when he respawns if(self.frozen != 1) @@ -383,8 +406,8 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) return 1; } -MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) -{ +MUTATOR_HOOKFUNCTION(ft, PlayerSpawn) +{SELFPARAM(); if(self.freezetag_frozen_timeout == -1) // if PlayerSpawn is called by reset_map_players return 1; // do nothing, round is starting right now @@ -406,28 +429,29 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) return 1; } -MUTATOR_HOOKFUNCTION(freezetag_reset_map_players) -{ - FOR_EACH_PLAYER(self) +MUTATOR_HOOKFUNCTION(ft, reset_map_players) +{SELFPARAM(); + entity e; + FOR_EACH_PLAYER(e) { - self.killcount = 0; - self.freezetag_frozen_timeout = -1; + e.killcount = 0; + e.freezetag_frozen_timeout = -1; + setself(e); PutClientInServer(); - self.freezetag_frozen_timeout = 0; + e.freezetag_frozen_timeout = 0; } freezetag_count_alive_players(); return 1; } -MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill) +MUTATOR_HOOKFUNCTION(ft, GiveFragsForKill, CBC_ORDER_FIRST) { frag_score = 0; // no frags counted in Freeze Tag return 1; } -.float reviving; // temp var -MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) -{ +MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST) +{SELFPARAM(); float n; if(gameover) @@ -465,7 +489,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) if(!o) o = other; if(self.frozen == 1) - other.reviving = TRUE; + other.reviving = true; ++n; } } @@ -509,7 +533,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) if(other.reviving) { other.revive_progress = self.revive_progress; - other.reviving = FALSE; + other.reviving = false; } } } @@ -526,8 +550,23 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) return 1; } -MUTATOR_HOOKFUNCTION(freezetag_BotRoles) +MUTATOR_HOOKFUNCTION(ft, SetStartItems) { + 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_plasma = warmup_start_ammo_plasma = cvar("g_lms_start_ammo_plasma"); + start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); + + return 0; +} + +MUTATOR_HOOKFUNCTION(ft, HavocBot_ChooseRole) +{SELFPARAM(); if (!self.deadflag) { if (random() < 0.5) @@ -536,13 +575,13 @@ MUTATOR_HOOKFUNCTION(freezetag_BotRoles) self.havocbot_role = havocbot_role_ft_offense; } - return TRUE; + return true; } -MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount) +MUTATOR_HOOKFUNCTION(ft, GetTeamCount, CBC_ORDER_EXCLUSIVE) { ret_float = freezetag_teams; - return 0; + return false; } void freezetag_Initialize() @@ -564,17 +603,13 @@ void freezetag_Initialize() EliminatedPlayers_Init(freezetag_isEliminated); } -MUTATOR_DEFINITION(gamemode_freezetag) +REGISTER_MUTATOR(ft, g_freezetag) { - MUTATOR_HOOK(MakePlayerObserver, freezetag_RemovePlayer, CBC_ORDER_ANY); - MUTATOR_HOOK(ClientDisconnect, freezetag_RemovePlayer, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDies, freezetag_PlayerDies, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerSpawn, freezetag_PlayerSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY); - MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST); - MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST); - MUTATOR_HOOK(HavocBot_ChooseRole, freezetag_BotRoles, CBC_ORDER_ANY); - MUTATOR_HOOK(GetTeamCount, freezetag_GetTeamCount, CBC_ORDER_EXCLUSIVE); + ActivateTeamplay(); + SetLimits(autocvar_g_freezetag_point_limit, autocvar_g_freezetag_point_leadlimit, -1, -1); + + if(autocvar_g_freezetag_team_spawns) + have_team_spawns = -1; // request team spawns MUTATOR_ONADD { @@ -592,7 +627,7 @@ MUTATOR_DEFINITION(gamemode_freezetag) MUTATOR_ONREMOVE { - print("This is a game type and it cannot be removed at runtime."); + LOG_INFO("This is a game type and it cannot be removed at runtime."); return -1; }