PutClientInServer(it);
}
});
- bot_relinkplayerlist();
- return true;
-}
-
-MUTATOR_HOOKFUNCTION(ca, ClientConnect)
-{
- entity player = M_ARGV(0, entity);
-
- TRANSMUTE(Observer, player);
return true;
}
}
frag_target.respawn_flags |= RESPAWN_FORCE;
if (!warmup_stage)
- {
eliminatedPlayers.SendFlags |= 1;
- if (IS_BOT_CLIENT(frag_target))
- bot_clear(frag_target);
- }
return true;
}
{
entity player = M_ARGV(0, entity);
+ bool is_forced = M_ARGV(1, bool);
+ if (is_forced && player.caplayer)
+ player.caplayer = 0;
+
if (IS_PLAYER(player) && !IS_DEAD(player))
ca_LastPlayerForTeam_Notify(player);
if (player.killindicator_teamchange == -2) // player wants to spectate
+ {
+ entcs_update_players(player);
player.caplayer = 0;
+ }
if (player.caplayer)
player.frags = FRAGS_PLAYER_OUT_OF_GAME;
if (!warmup_stage)
MUTATOR_HOOKFUNCTION(ca, 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");
+ start_items &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
+ if(!cvar("g_use_ammunition"))
+ start_items |= IT_UNLIMITED_AMMO;
+
+ start_health = warmup_start_health = cvar("g_ca_start_health");
+ start_armorvalue = warmup_start_armorvalue = cvar("g_ca_start_armor");
+ start_ammo_shells = warmup_start_ammo_shells = cvar("g_ca_start_ammo_shells");
+ start_ammo_nails = warmup_start_ammo_nails = cvar("g_ca_start_ammo_nails");
+ start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_ca_start_ammo_rockets");
+ start_ammo_cells = warmup_start_ammo_cells = cvar("g_ca_start_ammo_cells");
+ start_ammo_plasma = warmup_start_ammo_plasma = cvar("g_ca_start_ammo_plasma");
+ start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_ca_start_ammo_fuel");
}
MUTATOR_HOOKFUNCTION(ca, Damage_Calculate)
entity item = M_ARGV(0, entity);
if (autocvar_g_powerups <= 0)
- if (item.flags & FL_POWERUP)
+ if (item.itemdef.instanceOfPowerup)
return true;
if (autocvar_g_pickup_items <= 0)
MUTATOR_HOOKFUNCTION(ca, PlayerDamage_SplitHealthArmor)
{
+ if (time < game_starttime || (round_handler_IsActive() && !round_handler_IsRoundStarted()))
+ return;
+
entity frag_attacker = M_ARGV(1, entity);
entity frag_target = M_ARGV(2, entity);
+ float frag_deathtype = M_ARGV(6, float);
float frag_damage = M_ARGV(7, float);
float damage_take = bound(0, M_ARGV(4, float), GetResource(frag_target, RES_HEALTH));
float damage_save = bound(0, M_ARGV(5, float), GetResource(frag_target, RES_ARMOR));
float excess = max(0, frag_damage - damage_take - damage_save);
+ //non-friendly fire
if (frag_target != frag_attacker && IS_PLAYER(frag_attacker) && DIFF_TEAM(frag_target, frag_attacker))
GameRules_scoring_add_team(frag_attacker, SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier);
+
+ //friendly fire
+ if (SAME_TEAM(frag_target, frag_attacker))
+ GameRules_scoring_add_team(frag_attacker, SCORE, (-1 * (frag_damage - excess)) * autocvar_g_ca_damage2score_multiplier);
+
+ //handle (environmental hazard) suiciding, check first if player has a registered attacker who most likely pushed them there to avoid punishing pushed players as pushers are already rewarded
+ //deathtypes:
+ //kill = suicide, drown = drown in water/liquid, hurttrigger = out of the map void or hurt triggers inside maps like electric sparks
+ //camp = campcheck, lava = lava, slime = slime
+ //team change / rebalance suicides are currently not included
+ if (!IS_PLAYER(frag_attacker) && (
+ frag_deathtype == DEATH_KILL.m_id ||
+ frag_deathtype == DEATH_DROWN.m_id ||
+ frag_deathtype == DEATH_HURTTRIGGER.m_id ||
+ frag_deathtype == DEATH_CAMP.m_id ||
+ frag_deathtype == DEATH_LAVA.m_id ||
+ frag_deathtype == DEATH_SLIME.m_id ||
+ frag_deathtype == DEATH_SWAMP.m_id))
+ GameRules_scoring_add_team(frag_target, SCORE, (-1 * (frag_damage - excess)) * autocvar_g_ca_damage2score_multiplier);
}
MUTATOR_HOOKFUNCTION(ca, CalculateRespawnTime)
return MUT_SPECCMD_CONTINUE;
}
-MUTATOR_HOOKFUNCTION(ca, WantWeapon)
-{
- M_ARGV(2, bool) = true; // all weapons
-}
-
MUTATOR_HOOKFUNCTION(ca, HideTeamNagger)
{
return true; // doesn't work well with the whole spectator as player thing
MUTATOR_HOOKFUNCTION(ca, SetWeaponArena)
{
- // most weapons arena
- if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") M_ARGV(0, string) = "most";
+ if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
+ M_ARGV(0, string) = autocvar_g_ca_weaponarena;
+}
+
+MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand)
+{
+ string cmd_name = M_ARGV(0, string);
+ if (cmd_name == "shuffleteams")
+ shuffleteams_on_reset_map = !allowed_to_spawn;
+ return false;
}