#include "sv_freezetag.qh"
+#include <common/resources/sv_resources.qh>
#include <server/elimination.qh>
-#include <server/resources.qh>
float autocvar_g_freezetag_frozen_maxtime;
float autocvar_g_freezetag_revive_clearspeed;
int autocvar_g_freezetag_teams_override;
float autocvar_g_freezetag_warmup;
+float autocvar_g_ft_start_health = 100;
+float autocvar_g_ft_start_armor = 100;
+float autocvar_g_ft_start_ammo_shells = 60;
+float autocvar_g_ft_start_ammo_nails = 320;
+float autocvar_g_ft_start_ammo_rockets = 160;
+float autocvar_g_ft_start_ammo_cells = 180;
+float autocvar_g_ft_start_ammo_plasma = 180;
+float autocvar_g_ft_start_ammo_fuel = 0;
+
void freezetag_count_alive_players()
{
total_players = 0;
});
FOREACH_CLIENT(IS_REAL_CLIENT(it),
{
- STAT(REDALIVE, it) = Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(
- 1));
- STAT(BLUEALIVE, it) = Team_GetNumberOfAlivePlayers(
- Team_GetTeamFromIndex(2));
- STAT(YELLOWALIVE, it) = Team_GetNumberOfAlivePlayers(
- Team_GetTeamFromIndex(3));
- STAT(PINKALIVE, it) = Team_GetNumberOfAlivePlayers(
- Team_GetTeamFromIndex(4));
+ STAT(REDALIVE, it) = Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(1));
+ STAT(BLUEALIVE, it) = Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(2));
+ STAT(YELLOWALIVE, it) = Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(3));
+ STAT(PINKALIVE, it) = Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(4));
});
eliminatedPlayers.SendFlags |= 1;
return false;
}
-int freezetag_getWinnerTeam()
-{
- int winner_team = 0;
- if (Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(1)) >= 1)
- {
- winner_team = NUM_TEAM_1;
- }
- for (int i = 2; i <= NUM_TEAMS; ++i)
- {
- if (Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(i)) >= 1)
- {
- if (winner_team != 0)
- {
- return 0;
- }
- winner_team = Team_IndexToTeam(i);
- }
- }
- if (winner_team)
- {
- return winner_team;
- }
- return -1; // no player left
-}
-
void nades_Clear(entity);
void nades_GiveBonus(entity player, float score);
return true;
}
- if (Team_GetNumberOfAliveTeams() > 1)
- {
+ int winner_team = Team_GetWinnerAliveTeam();
+ if (!winner_team)
return false;
- }
- int winner_team = freezetag_getWinnerTeam();
if(winner_team > 0)
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_WIN));
frag_target.respawn_time = time + 1;
frag_target.respawn_flags |= RESPAWN_FORCE;
- // 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.m_id || frag_deathtype == DEATH_AUTOTEAMCHANGE.m_id)
+ // let the player die, they will be automatically frozen when they respawn
+ // it fixes a bug where you both really die (gibbing) and get frozen
+ // if you succeed changing team through the menu
+ if (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 (STAT(FROZEN, frag_target) != FROZEN_NORMAL)
- {
- freezetag_Add_Score(frag_target, frag_attacker);
- freezetag_count_alive_players();
- freezetag_LastPlayerForTeam_Notify(frag_target);
- frag_target.freezetag_frozen_timeout = -2; // freeze on respawn
- }
- else
- {
- float t = frag_target.freezetag_frozen_timeout;
- float t2 = frag_target.freezetag_frozen_time;
- Unfreeze(frag_target, false); // remove ice
- // keep timeout value so it can be restored when player will be refrozen on respawn
- // NOTE this can't be exactly -2 since game starts from time 2
- frag_target.freezetag_frozen_timeout = -t;
- frag_target.freezetag_frozen_time = t2;
- }
+ freezetag_Add_Score(frag_target, frag_attacker);
+ freezetag_count_alive_players();
+ freezetag_LastPlayerForTeam_Notify(frag_target);
+ frag_target.freezetag_frozen_timeout = -2; // freeze on respawn
return true;
}
+ if(ITEM_DAMAGE_NEEDKILL(frag_deathtype))
+ {
+ // soft-kill: setting health to something >= 1 after death, ammo won't be reset
+ SetResourceExplicit(frag_target, RES_HEALTH, 1);
+ // restore armor as it was removed in PlayerDamage
+ SetResourceExplicit(frag_target, RES_ARMOR, frag_target.freezetag_frozen_armor);
+
+ // relocate
+ entity spot = SelectSpawnPoint(frag_target, true);
+ setorigin(frag_target, spot.origin);
+ frag_target.oldorigin = frag_target.origin;
+ frag_target.fixangle = true; // turn this way immediately
+ frag_target.angles = vec2(spot.angles);
+ frag_target.velocity = '0 0 0';
+ frag_target.oldvelocity = frag_target.velocity; // prevents fall damage, see CreatureFrame_FallDamage
+ frag_target.avelocity = '0 0 0';
+ frag_target.punchangle = '0 0 0';
+ frag_target.punchvector = '0 0 0';
+ }
+
if (STAT(FROZEN, frag_target) == FROZEN_NORMAL)
return true;
if(player.freezetag_frozen_timeout <= -2) // player was dead
{
- float t = player.freezetag_frozen_timeout;
- float t2 = player.freezetag_frozen_time;
freezetag_Freeze(player, NULL);
- if (t < -2)
- {
- player.freezetag_frozen_timeout = -t;
- player.freezetag_frozen_time = t2;
- }
return true;
}
//float frag_damage = M_ARGV(4, float);
vector frag_force = M_ARGV(6, vector);
+ frag_target.freezetag_frozen_armor = GetResource(frag_target, RES_ARMOR);
+
if (STAT(FROZEN, frag_target) == FROZEN_NORMAL && autocvar_g_freezetag_revive_auto_reducible
&& autocvar_g_freezetag_frozen_maxtime > 0 && autocvar_g_freezetag_revive_auto)
{
MUTATOR_HOOKFUNCTION(ft, SetStartItems)
{
start_items &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
- start_health = warmup_start_health = cvar("g_ft_start_health");
- start_armorvalue = warmup_start_armorvalue = cvar("g_ft_start_armor");
- start_ammo_shells = warmup_start_ammo_shells = cvar("g_ft_start_ammo_shells");
- start_ammo_nails = warmup_start_ammo_nails = cvar("g_ft_start_ammo_nails");
- start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_ft_start_ammo_rockets");
- start_ammo_cells = warmup_start_ammo_cells = cvar("g_ft_start_ammo_cells");
- start_ammo_plasma = warmup_start_ammo_plasma = cvar("g_ft_start_ammo_plasma");
- start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_ft_start_ammo_fuel");
+ if(!cvar("g_use_ammunition"))
+ start_items |= IT_UNLIMITED_AMMO;
+
+ start_health = warmup_start_health = autocvar_g_ft_start_health;
+ start_armorvalue = warmup_start_armorvalue = autocvar_g_ft_start_armor;
+ start_ammo_shells = warmup_start_ammo_shells = autocvar_g_ft_start_ammo_shells;
+ start_ammo_nails = warmup_start_ammo_nails = autocvar_g_ft_start_ammo_nails;
+ start_ammo_rockets = warmup_start_ammo_rockets = autocvar_g_ft_start_ammo_rockets;
+ start_ammo_cells = warmup_start_ammo_cells = autocvar_g_ft_start_ammo_cells;
+ start_ammo_plasma = warmup_start_ammo_plasma = autocvar_g_ft_start_ammo_plasma;
+ start_ammo_fuel = warmup_start_ammo_fuel = autocvar_g_ft_start_ammo_fuel;
}
MUTATOR_HOOKFUNCTION(ft, HavocBot_ChooseRole)